HOME BLOG

Why you should master tonic sol-fa today as a choir singer or instrumentalist

Posted on: May 26th, 2026 by Olu No Comments

Hi Folks,

I remember sitting with a few choristers at choir practice one sunny afternoon a while ago. We were talking about tonic sol-fa when an esteemed chorister made a striking comment. She said that when she looked at tonic sol-fa, all she saw was a bunch of notes, so she wasn’t too sure how to make use of it. I gave a brief answer then but feel it would be great to use this medium to explore the topic in greater depth. So, why should you, as a choir singer or instrumentalist, learn and use tonic sol-fa? Here are 5 reasons.

1. Tonic sol-fa can come to the rescue when you need to quickly remember the melody of a song you once learnt but have forgotten. Believe me when I tell you that this situation happens more often than you may think. What causes us to sometimes forget the melody of a song we know? One possible reason is if we only learnt the song recently and haven’t practised it enough so that it is saved in our long-term memory. Another reason is if it has been ages since we sang a song. In either situation, a quick look at the tonic sol-fa is often helpful in bringing the song back to mind.

2. Tonic sol-fa helps you to know the melody of brand-new songs you have never encountered before. Truly, when I pick up my CCC hymnbook, I can often go to an unfamiliar hymn and, just by reading the tonic sol-fa alone, get a good idea of how the song would sound even though I’ve never listened to a recording of it. In fact, when I notice that the song’s progression is very similar to that of another song I already know, I may even be able to also determine the rhythm of the new song. This makes it so much easier to sing or play new hymns on musical instruments.

3. Tonic sol-fa makes it easier to compose music using just a pen and paper – you can write both words and tonic solfa and not need to worry about how to record your voice right away. This can come in handy if you find yourself in a situation where it may be awkward or even impossible to record your voice.

4. Toni sol-fa makes it easier and quicker to learn new complex songs as you listen to them. It does this by giving you a second way to absorb the new song i.e. you use your ears to listen to the song as the first mode, then use the tonic sol-fa as a secondary way to understand the songs more deeply. Think of it this way… You know how in large supermarkets there may be only one cashier register active and after some time the queue of customers waiting to check out starts getting long, then suddenly, a second cashier register is activated, and the queue moves faster and customers feel happier? That’s how it is when you know your tonic sol-fa. It’s like having an extra cashier register to handle the flow of new musical information.

5. Tonic sol-fa allows you develop relative pitch by training your ears to understand how different notes sound when compared to the key of a song (the home key). This makes it easier to sing songs in any key.

As you can see, tonic sol-fa is pretty important and useful to singers and instrumentalists. That’s why YHM provides clean tonic sol-fa of CCC Hymns and includes a dedicated tonic sol-fa section you can use when creating your own hymns.

So, how can you master tonic sol-fa?

First, read about tonic sol-fa. Yinkos Tutorial has an insightful article on tonic sol-fa you can read. You can also find other useful articles about it on the internet.

What else can you do? Learn tonic sol-fa for songs you already know. E.g. Check your hymnbook for familiar songs and learn their tonic sol-fa. If you’re a fan of CCC music, then check out the CCC Hymnbook New Revised Standard Edition which has Yoruba hymns and tonic sol-fa. You can also use YHM which shows tonic sol-fa for both English and Yoruba hymns.

Finally, you can take things a step further by writing tonic sol-fa for new songs you come across or when creating new songs.

With some practice and dedication, you can become very skilled at using tonic sol-fa to take your music knowledge and singing skill to the next level. Till next time, happy singing.

Major Improvements to CCC Hymn Lyrics in YHM

Posted on: May 25th, 2026 by Olu No Comments

Hi Folks,

We’re pleased to announce major improvements to the CCC lyrics and tonic sol-fa available in Yinkos Hymns Manager (YHM).

Yoruba – The Yoruba hymns lyrics and tonic sol-fa have been updated to match the CCC Hymns New Revised Standard Edition. But that’s not all. We also fix some obvious typographical errors and present the lyrics in a clean, consistent format to allow for smoother reading.

English – The English hymns lyrics have been updated to match the CCC English Hymns CET (Contextualized English Translations). As usual, we include tonic sol-fa to make it easier to read the music visually.

We hope these changes would make it easier to not just manage hymns selection, but learn, enjoy, and meditate on CCC hymns wherever you are. Check out these new improved lyrics on YHM. We welcome feedback. If you have any questions or comments, please contact us.

Happy hymns management.

5 Powerful techniques to improve how you practice to become a better choir singer

Posted on: May 23rd, 2026 by Olu No Comments

Hi Choir Singers,

Would you like to become a better singer faster? Would you like to get more value from your choir practice sessions? Then look no further. In this post, I’ll give you 5 straight-to-the-point no-nonsense tips to supercharge your practice and improve your singing skills based on my research and experience as a choir singer and instrumentalist.

 

1. Practice good singing consistently
Sing every day using good technique. Why? Because the more you sing, the better you’ll get – that’s just how nature works. Like the saying goes, practice makes perfect. So, find and use every opportunity you can to sing. Do not wait until you get to choir practice or until church service to sing.  Good opportunities for singing could be while driving, while running, while dog walking, etc. Just make sure you’re practicing every day. To expand your skill further, you can use apps like YouTube or Yinkos Hymns Manager (YHM) to discover new hymns, listen to hymn recordings, and sing along. Good techniques to use include things like breathing into your diaphragm, standing straight or sitting straight, being relaxed, avoiding strain on your vocal cords, and using your natural resonance.

 

2. Attend choir practice regularly
When you signed up to join the choir you knew exactly what day of the week and what time choir practice would take place.
So make sure you block the time out and attend choir practice diligently. Try your best to reschedule other social engagements outside of choir practice time.

Why is it important to attend choir practice regularly? Because this is one of your fastest paths to developing your musical skills and this helps your choir to develop quicker too.

If you say you will go for practice, then make sure you show up. Be reliable and have integrity.
Good choir singing requires good practice, so if you don’t go for rehearsals, it holds back both the choir and your own self-improvement.

Also, don’t just attend choir practice, but do your best to be arrive on time. Be punctual. This helps to show your commitment, motivates others to stay committed as well, fosters good team spirit, and helps you build a valuable life skill that will help you in other areas of life, e.g. work, family relationships, etc.

 

3. Memorize the tonic sol-fa or sheet music and lyrics as soon as you can 
This is crucial because it frees you up so you can watch the conductor, connect with your audience and truly tell the story through music during performances or service. It’s very difficult to do these if you’re staring at a piece of paper searching for words.
Also, when you have memorized all parts of the music in time, you would be able to perfect the song faster and more easily during choir practice. You’ll have more time to learn higher-level skills like harmonizing with other choristers, learning advanced singing techniques, etc. In short, you will develop quicker.
What can you do to make it easier to memorize hymns? Try to buy a version of your hymnbook that has tonic sol-fa or sheet music and use it for studying songs. Listen to correct versions of songs – this is especially important for songs that have multiple versions. Also you can try to find mobile apps for your church that includes words and tonic sol-fa/sheet music to allow you study on the go. For CCC, an example of such app is YHM.

 

4. Sing the correct notes
It’s not enough to just memorize the right notes, but you must practice singing the right notes thoroughly at home, so you are well prepared and confident during choir practice and during live service /performances. To help with this, make sure you pay attention to the tonic sol-fa or sheet music and audio recording. Also, a good tip is to record yourself using your phone when you sing and then play it back so you can compare it with the original version and critique your performance honestly. If you find flaws, go back and practice the faulty areas so that you improve.

 

5. Sing the correct words
When you learn a song, it’s important to not just memorise the words, but practice singing the right words rigorously. Why is it important to sing the right words? Because it makes it easier for you to connect with the message of the song, sing with the right emotions, and connect with your audience. What are some ways to master the right words? Write them down, read them, act them, and get them fully embedded in your mind as soon as possible. In churches like CCC where people sing songs in multiple languages routinely, you may have to sing songs in a language you don’t speak fluently. In such cases, take extra time to find out and understand the meaning of each word in the song. You can do this by reading the translation of the song in a more familiar language or by asking your peers or choir master if in doubt.

Again, if you attend multilingual churches, it would be helpful for you to have access to your church hymnbook in all relevant languages. How? You can buy the hymnbook in all relevant languages, or use apps e.g. For CCC, some good apps are CCC Hymns CET and YHM which gives you access to hymns in multiple languages.

In conclusion, we have explored some techniques to improve your singing and get more value from your choir practice sessions. Keep practicing, keep growing, and happy singing.

Stand-up summaries – an excellent tool to boost productivity in Agile software development teams

Posted on: February 14th, 2026 by Olu No Comments

Hi Folks,

In this post I discuss a great tool for keeping software development teams accountable. It’s called the Stand-up summary.

How does it work?

In teams that adopt Agile methodology, it’s common to have daily stand-up meetings where developers discuss what they have worked on, what they plan to work on, etc.
A stand-up summary is a short summary of the action points for each member (usually software developers) in the team, saying what they plan to work on that day.

This summary can be written by the facilitator for the meeting and posted onto a shared location, easily accessible by all members of the team, e.g. the team group chat (think of MS Teams, Slack, etc.), shortly after the meeting ends.

What are the advantages of using stand-up summaries?

  • It helps to keep each team member focused on their goals for the day and minimise distractions.
  • It gives visibility to the rest of the team so that the team leader can more easily help each member to make sure the entire team meets its goals.
  • It helps gives visibility of the team’s daily goals to other stakeholders who may not necessarily be the software developers themselves.
  • It helps keep each team member accountable. Knowing that one’s goals has been posted on to the team group chat motivates one to strive to fulfil the goals promptly.

That’s all for now. Till next time, happy software development.

Yinkos Flashcards is launched

Posted on: September 30th, 2025 by Olu No Comments

Hi Folks,

We’re pleased to announce the launch our latest web application called Yinkos Flashcards.

Yinkos Flashcards is an application designed to help you master concepts faster using Spaced Repetition, an evidence-based learning technique that is usually performed with flashcards.

Yinkos Flashcards provides a number of very useful features:

  • Browse flashcards – Find quality flashcards in various subjects including Music and Yoruba.
  • Create flashcards to help you learn any subject or topic quickly.
  • Use Spaced Repetition to improve memory and learn effectively.

You can use Yinkos Flashcards on any device that has a web browser, be it on a desktop, laptop, mobile phone or tablet.

To access the app, visit https://flashcards.yinkos.com/.

As always, we like to know what you think about the game. Feel free to contact us.

Enjoy.

How to patch in a fixture with Pytest

Posted on: June 5th, 2025 by Olu No Comments

Hi Folks,

In this post I cover a tip to help you write automated tests easily in Python. Specifically I talk about a simple way to apply a patch to multiple test cases without having to manually specify it in each test case. I will assume you’re using the Pytest as your testing framework.

A way to do this is to do the patching in a fixtures.

For example, you can add code as follows to your conftest.py, or wherever you define your fixture:

import pytest
from unittest.mock import patch


@pytest.fixture(autouse=True)
def no_delay():
    with patch('ConstantsModule.ConstantsClass.DELAY_TIME', 10):
        yield

This way, when you want to apply the mock in a test case, all you have to do is add no_delay as an argument to the function.

That’s all for now. Till next time, happy testing.

 

Reference

python – py.test patch on fixture – Stack Overflow. https://stackoverflow.com/questions/50048080/py-test-patch-on-fixture

How to access Shared Directories on Operating Systems that support SMB protocol using SMBLibrary

Posted on: April 27th, 2025 by Olu No Comments

Hi Folks,

In this post we will briefly cover how to access files in shared directories on operating systems that support SMB protocol.

First, what’s SMB? SMB means Server Message Block. It is a communication protocol used to share files, printers, serial ports and miscellaneous cmomunications between nodes on a network.  SMB was originally developed at IBM and is widely supported in Windows mac OS and Linux.

In this post we will assume you’re programming in C#. Also, we will assume the

A good library for accessing shared drive is SMBLibrary https://github.com/TalAloni/SMBLibrary.

Checking a file exists

The procedure involves creating an instance of SMB2Client, connecting to the share server, logging in, creating a file store using TreeConnect method, and using it to look through the files on the shared directory to see if your desired file exists.

Here’s some sample code you can use for checking if a file exists in a given directory, using SMBLibrary.

string Fullpath = @"\\server\sharename\inner-path\inner-path2\";
var parts = Fullpath.Split('\\');
ShareName = parts[1]
PathPrefixInShare = $@"\\{parts[0]}\{ShareName}\";

Boolean exists(string directory, string file) {

    var result = false;
    var client = SMB2Client();
    string error = null;
    bool isConnected = client.Connect(IPAddress.Parse("sharehostname", SMBTransportType.DirectTCPTransport);

    if (isConnected) {
        NTStatus status = client.Login(String.Empty, "someusername", "somepassword")

        if (status == NTStatus.STATUS_SUCCESS) {
            ISMBFileStore fileStore = client.TreeConnect(ShareName, out status);

            object fileHandle;
            object directoryHandle;
            FileStatus fileStatus;

            if (fileStore is SMB2FileStore) {
                directory = directory.Replace(PathPrefixInShare, "");

                status = fileStore.CreateFile(out directoryHandle, out fileStatus, directory, AccessMask.GENERIC_READ, SMBLibrary.Fileattributes.Directory, ShareAccess.Read | ShareAccess.Write, CreateDisposition.FILE_OPEN, CreateOptions.FILE_DIRECTORY_FILE, null);

                if (status == NTStatus.STATUS_SUCCESS) {

                    List fileList;
                    status = fileStore.QueryDirectory(out fileList, directoryHandle, "*", FileInformationClass.FileDirectoryInformation);
                    status = fileStore.CloseFile(directoryHandle);

                    foreach(FileDirectoryInformation aFile in fileList) {
                        if (aFile.FileName == file) {
                            result = true;
                            break;
                        }
                    }
                }
                status = fileStore.Disconnect();
            } else {
                error = "There was an error accessing data";
            }
            client.Logoff();

        }
        client.Disconnect();
    }

    if (error != null) {
        throw new Exception(error);
    }
    return results;

}

 

Reading a file

The procedure involves creating an instance of SMB2Client, connecting to the share server, logging in, creating a file store using TreeConnect method, then get the inner filepath by stripping parent directories, create a file handle, by calling CreateFile method on the file store, then reading the data (bytes) from the file by calling ReadFile method on the file store.

And here is some sample code for fetching the data in a given file path within a shared drive using SMBLibrary

MemoryStream getTheFileStream(string filePath) {
    MemoryStream stream = new MemoryStream();

    var client = SMB2Client();
    string error = null;
    bool isConnected = client.Connect(IPAddress.Parse("someurl", SMBTransportType.DirectTCPTransport);

    if (isConnected) {
        NTStatus status = client.Login(String.Empty, "someuser", "somepassword")

        if (status == NTStatus.STATUS_SUCCESS) {
            ISMBFileStore fileStore = client.TreeConnect(ShareName, out status);

            object fileHandle;
            FileStatus fileStatus;

            if (fileStore is SMB2FileStore) {
                filePath = filePath.Replace(PathPrefixInShare, "");

                status = fileStore.CreateFile(out fileHandle, out fileStatus, filePath, AccessMask.GENERIC_READ | AccessMask.SYNCHRONIZE, SMBLibrary.Fileattributes.Normal, ShareAccess.Read, CreateDisposition.FILE_OPEN, CreateOptions.FILE_NON_DIRECTORY_FILE | CreateOptions.FILE_SYNCHRONOUS_IO_ALERT, null);

                if (status == NTStatus.STATUS_SUCCESS) {
                    byte[] data;
                    long bytesRead = 0;

                    while (true) {

                        status = fileStore.ReadFile(out data, fileHandle, bytesRead, (int)client.MaxReadSize);
                        if (status != NTStatus.STATUS_SUCCESS && status != NTStatus.STATUS_END_OF_FILE) {
                            throw new Exception("failed to read from file");

                        }

                        if (status == NTStatus.STATUS_END_OF_FILE || data.Length == 0) {
                            break;
                        }

                        bytesRead += data.Length;
                        stream.Write(data, 0, data.Length);
                    }

                }
                status = fileStore.CloseFile(fileHandle);
                status = fileStore.Disconnect();
            } else {
                error = "There was an error accessing data";
            }
            client.Logoff();

        }
        client.Disconnect();
    }

    if (error != null) {
        throw new Exception(error);
    }

    stream.Seek(0, SeekOrigin.Begin);
    return stream;

}

That’s all for now. Till next time, happy software development.

How to create objects with dynamic field names in C#

Posted on: December 18th, 2024 by Olu No Comments

Hi Folks,

In this post I’ll talk briefly about how to create objects with dynamic fields on the fly in a C# application.

First of all, why is this important?

An example is if you’re developing an API that returns some data where the fields are calculated at runtime.

This means you can’t anticipate what it would be before hand and create classes ahead of time.

In C# we use what is called ExpandoObject.

ExpandoObject represents an object whose members can be dynamically added or removed at runtime.

To create an ExpandoObject instance, you do something like

 

dynamic row = new ExpandoObject();

 

To set a field whose name you know at compile time, do something like

 

row.SomeField = somevalue

 

To set a field whose name you don’t know ahead of time, but whose name is stored in the value of another object, say fieldNameHolder, to some value stored in a variable, say fieldValueHolder, do something like

 

(IDictionary<string, object>row).Add(fieldNameHolder, fieldValueHolder);

 

That’s all for now. Till next time, happy software development.

 

References

ExpandoObject Class. Microsoft Learn. https://learn.microsoft.com/en-us/dotnet/api/system.dynamic.expandoobject?view=net-9.0M

Yinkos Tutorial Blog is launched

Posted on: November 10th, 2024 by Olu No Comments

Hi folks,

We will like to announce with great pleasure that the Yinkos Tutorial Blog is now launched.

Why have we launched the Yinkos Tutorial Blog? We launched it to provide a platform where we can publish educational articles from time to time to help students with the various subjects we tutor.

The blog is located at https://tutorial.yinkos.com/blog/.

You can access the blog by clicking Blog on the main menu of the Yinkos Tutorial website.

That’s all for now. Till next time, happy learning.

How to disable a test class or method in Java

Posted on: April 26th, 2024 by Olu No Comments

Hi folks,

In this brief post, we will talk about how to disable a test class or method in a Java-based project. Why would you want to do this? It could be because the test isn’t yet fully implemented. Another situation is if you have Continuous Integration in place where tests are run automatically during a build, but a certain test class isn’t yet ready for automatic execution.

To disable a test class or method, you can use the Disabled annotation from JUnit. E.g.

import org.junit.jupiter.api.Disabled
...

@Disabled
class YourTestClass {
...
}

That’s it. Now such a test would be ignored. That’s all for now. Till next time, happy software development.

 

References

Disabled (JUnit 5.0.0-M2 API). https://junit.org/junit5/docs/5.0.0-M2/api/org/junit/jupiter/api/Disabled.html