diff --git a/src/conio/cterm.txt b/src/conio/cterm.txt index ea4c9018566e085382aaea33af1a9262fcbc334f..b238f4a1f80186d1b5d0869261c1188f139ad14a 100644 --- a/src/conio/cterm.txt +++ b/src/conio/cterm.txt @@ -357,8 +357,92 @@ A programmer with either TeleMate or QModem (the first two programs to support "ANSI" music as far as I can tell) decided they needed a method of playing music on a BBS conenction. They decided to add an "unused" ANSI code and go their merry way. Since their product didn't implement CSI M (Delete line) they assumed it was -unused and blissfully broke the spec. The defined ANSI music as: +unused and blissfully broke the spec. They defined ANSI music as: CSI M <music string> 0x0a + They used a subset of IBM BASICs PLAY statement functionality for ANSI music -strings which oftem start with "MF" or "MB", so the +strings which oftem start with "MF" or "MB", so the M after the CSI was often +considered as part of the music string. You would see things such as: +CSI MFABCD 0x0a and the F would not be played as a note. This just added +further confusion to the mess. + +Later on, BananaCom realized the conflict between delete line and music, so they +added *another* broken code CSI N (Properly, erase in field... not implemented in +many BBS clients) which was to provide an "unbroken" method of playing music +strings. They also used CSI Y to disambiguate delete line, CSI Y is supposed +to be a vertical tab (also not implemented in very many clients). BananaCom also +introduced many more non-standard and stardard-breaking control sequences which +are not supported by CTerm. + +CTerm has further introduced a standard compliant ANSI music introducer CSI | + +By default, CTerm allows both CSI N and CSI | to introduce a music string. +Allowed introducers are set by CSI = p1 M as defined above. + +The details of ANSI music are as follows then: +The following characters are allowed in music strings: +"aAbBcCdDeEfFgGlLmMnNoOpPsStT0123456789.-+#<> " +If any character not in this list is present, the music string is ignored as +is the introducing code. + +If the introducing code is CSI M the first char is examined, and if it is +a case-insensitive match for any character in "BFLNS" then the music string +is treated as though an M is located in front of the first character. + +The music string is then parsed with the following sequences supported: +Mx sets misc music parameters where x is one of the following: + F - Plays music in the foreground, waiting for music to complete + playing before more characters are processed. + B - Play music in the background, allowing normal processing to + continue. This is ignored by CTerm. All music is played in + the foreground. + N - "Normal" not legato, not stacatto + L - Play notes legato + S - Play notes stacatto +T### Sets the tempo of the musix where ### is one or more decimal digits. + If the decimal number is greater than 255, it is forced to 255. + If it is less than 32, it is forced to 32. The number signifies + quarter notes per minute. + The default tempo is 120. +O### Sets the octave of the music where ### is one or more decimal digits. + If the decimal number is greater than 6, it is forced to 6. + The default octave is 4. +N### Plays a single note by number. Valid values are 0 - 71. Invalid + values are played as silence. Note zero is C in octave 0. + See following section for valid note modifiers. +A, B, C, D, E, or G Plays the named note from the current octave. + an "Octave" is the rising sequence of the following notes: + C, C#, D, D#, E, F, F#, G, G#, A, A#, B + This is contrary to normal music terminology. + Notes may be followed by one or more modifier characters which + are applied in order. If one overrides a previous one, the last + is used. The valid modifiers are: + + - Sharp. The next highest semitone is played. + Each sharp character will move up one semitone, so "C++" + is equivilent to "D". + # - Sharp. The next highest semitone is played. + Each sharp character will move up one semitone, so "C##" + is equivilent to "D". + - - Flat. The next lowest semitone is played. + Each flat character will move down one semitone, so "D--" + is equivilent to "C". + . - Duration is 1.5 times what it would otherwise be. Dots are not + cumulative, so "C.." is equivilent to "C." + ### - Notelength as a reciprical of the fraction of a whole note to + play the note for. For example, 4 would indicate a 1/4 note. + The default note length is 4. +< Move the the next lowest octave. + Octave cannot go above six or below zero. +> Move to the next highest octave. + Octave cannot go above six or below zero. + +The lowest playable character is C in octave zero. The frequencies for the +six C notes for the seven octaves in rising order are: +65406, 130810, 261620, 523250, 1046500, 2093000, 4186000 + +Purists will note that the lower three octaves are not exactly one half of +the next higher octave in frequency. This is due to lost resolution of +low frequences. The notes *sound* correct to me. If anyone can give me +an excellent reason to change them (and more correct integer values for all +notes) I am willing to do that assuming the notes still sound "right".