А я наоборот писал когда-то пианинку, чтобы эти ноты в текстовом виде генерить. Пытался в ней же из миди сделать конвертер (мидишки тогда очень популярны были), но там какие-то подводные камни были всё время, и лень победила :)
Похоже, многие писали свои нотные редакторы. Когда-то мы с друзьями делали игралку музыки по IPX-сети, на мне был как раз редактор, выглядело это как-то так:
Требование: отображать „нормальные” ноты и диезы-бемоли псевдографикой
Можно было бегать по трекам, вставлять-удалять ноты, транспонировать, а вот блочное выделение я, кажется, так и не доделал…
Частоту ноты легко вычислить без словарей, по формуле
fn = f0 * (2^(1/12))^n,
где f0 — самая нижняя частота, например, 27.5 — нотя ля, а n — интервал относительно этой ноты.
Формула работает потому, что та же нота следующей октавы имеет в 2 раза большую частоту, а октава в разбивается на 12 равных частей со времен Баха.
Т.е.
f12 = f0 * (2^(1/12))^12 = f0 * 2 #нота ля следующей октавы
f24 = f0 * (2^(1/12))^24 = f0 * 4
и т. д.
Плохо!
Чистая синусоида — это вообще один из самых худших (для восприятия) звуков. Никаких гармоник, никакой экспрессии!
Попробуйте, для сравнения, сгенерировать пилу! Кардинально другое восприятие!
А вообще лучше делать на основе реального звука. Берёте один период волны какого-нибудь [реального] звука. Нормируете количество сэмплов под нужную базовую тональность (к примеру, около 1000 штук, чтоб получилось 440 герц — «Ля»). А дальше — дело техники. Для разнообразия можно в зависимости от высоты ноты использовать разные звуки — тот же человеческий голос может звучать в естественной тесситуре (один образец), на переходных нотах (другой) и фальцетом (третий)
Недавно писал парсер для подмножества похожего языка MML. Когда встал вопрос через что проигрывать, выбор естественным образом пал на MIDI. Но генерировать wav с нуля — это сильно.
Пишем конвертер для генератора мелодий от Nokia 3310