Когда делал генератор мелодий, частота и длительность поместились в 2 байта. 10 бит на частоту, 6 бит на длительность. Ноты для проигрывания кидались в кольцевой буфер. Два старших бита длительности определяли диапазон - единицы, десятки, сотни, тысячи миллисекунд, четыре младших - количество. То есть 6ю битами перекрывался диапазон единиц мс .. единиц секунд.
Частота - герцы, сдвинутые на 3 разряда вправо, то есть диапазон 8..8192Гц с дискретностью 8Гц. Частота 0 Гц - пауза.
Макросы прямого задания частоты и длительности:
#define SND_FREQ(freq1) (freq1 >> 3)
#define SND_1MS(freq, len) ( 0x0000 | ((len & 0xF) << 10) | SND_FREQ(freq) )
#define SND_10MS(freq, len) ( 0x4000 | ((len & 0xF) << 10) | SND_FREQ(freq) )
#define SND_100MS(freq, len) ( 0x8000 | ((len & 0xF) << 10) | SND_FREQ(freq) )
#define SND_1S(freq, len) ( 0xC000 | ((len & 0xF) << 10) | SND_FREQ(freq) )
Частоты нот:
//notes frequencies
#define SC4 262
#define SD4 294
#define SE4 330
#define SF4 349
#define SG4 392
#define SA4 440
#define SB4 494
#define SC4D 277
#define SD4D 311
#define SF4D 370
#define SG4D 415
#define SA4D 466
#define SC5 523
#define SD5 587
#define SE5 659
#define SF5 699
#define SG5 784
#define SA5 880
#define SB5 988
#define SC5D 554
#define SD5D 622
#define SF5D 740
#define SG5D 831
#define SA5D 932
#define SC6 1047
#define SD6 1175
#define SE6 1319
#define SF6 1397
#define SG6 1568
#define SA6 1760
#define SB6 1976
#define SC6D 1109
#define SD6D 1245
#define SF6D 1480
#define SG6D 1661
#define SA6D 1865
#define SC7 2093
#define SD7 2349
#define SE7 2637
#define SF7 2794
#define SG7 3136
#define SA7 3520
#define SB7 3951
#define SC7D 2217
#define SD7D 2489
#define SF7D 2960
#define SG7D 3322
#define SA7D 3729
Ноты от целой до шестнадцатой:
#define SL1(freq) SND_1S(freq, 2)
#define SL2(freq) SND_1S(freq, 1)
#define SL4(freq) SND_100MS(freq, 5)
#define SL8(freq) SND_100MS(freq, 3)
#define SL16(freq) SND_10MS(freq, 12)