Piano from Terminal 02/09/2018
I'm learning to play Piano but my terminal call me.. What about a simple piano visualizer in the terminal?
I need a simple visualizer that highlights piano keys.. I don't need it, really, but its fun to make everythings in the terminal (or not?). This visualizer looks like this:
Coding
I have tried to write this tool with a "simple" bash script but i know C and i am more "productive" with C. So this is the main structure of the program:
/*p[Y][NOTE]
where p[0] is the top line of the piano
p[1] is the middle line of the piano
p[2] is the bottom line of the piano
foreach p[COLUMN] there are 14 keys for each OCTAVE
[0] is the C key
[1] is the C# key
[2] is the D key
[3] is the D# key
[4] is the E key
[5] is a dummy key for a not existent semitone
[6] is the F key
...
[12] is the A# key
[13] is a dummy key for a not existent semitone
*/
char p[3][14*N_OCT]={0};
//[...]
int main(int argc, char *argv[]) {
//check argv for arguments
//for each note in arguments hightlight p[0..2][NOTE]
//draw all piano keys
}
The trick of using 14 keys instead of the standard 12 is used to calculate a key index, trought octaves, in a simpler way, assuming that each tone has a semitone. This is not true for E-F and B-C intervals but the program will intercept this exceptions and skip the [5] and the [13] dummy keys (not existent semitones).
This is how this trick work:
1) Notes are translated to numbers:
Notes: CDEFGAB
NOTE_INDEX: C=0 D=2 E=4 F=6 G=8 A=10 B=12
2) This formula is used to find the index of a key for a note without alterations:
KEY_INDEX = NOTE_INDEX(NOTE)*2 + (14 * OCTAVE)
3) (optional) code to add a semitone to a KEY_INDEX:
ALTERATED_KEY_INDEX: KEY_INDEX +1
IF (ALTERATED_KEY_INDEX==5 OR 13)
ALTERATED_KEY_INDEX = ALTERATED_KEY_INDEX +1;
4) (optional) code to add two semitones (##):
two time the first algorithm
5) (optional) code to subtract a semitone (b):
one time the first algorithm with -1 instead of +1
6) (optional) code to subtract two semitones (bb):
two time the subtract of a single semitone
By using The trick of 14 keys, instead of 12, the program is pretty simple. For each note (ex: A2#) passed as an argument, the program will highlight the key using Terminal colors. After highlights of all keys the program draw all 12 keys (skipping the 5 and the 13 dummy keys).
Sourcecode
The full source of this program is here. The program use ANSI ESCAPE CODE to colorize the terminal output, so will run fine on a Linux machine, on Mac OS X or with MinGW on Windows.
Compile
To compile this program you do not need any fancy arguments:
gcc piano.c -o piano
Usage
This program accept a list of notes where each note syntax is
NOTE[OCTAVE][ALTERATION][ALTERATION]
For example if you want to highlight a C# you write C# (or B), if you want a C# on the second octave you write C2# (or B2), if you want a C with two semitones alteration you write C## (or B#).
By default the program will display 3 octaves but you can change that by using the -o (or --octaves) parameters.
The maximum number of octaves supported by the program is 10. You can extend this values by modifing the sourcecode, changing the value of the N_OCT macro.
Ok, this tool is useless... but exists :-D