Смоделировать пианино.

Jun 06, 2010 14:32

Судя по всему, достойная задача. 10 гигабайт на правдоподобные звуки пианино, которые всё равно не дают достаточно хорошего эффекта.

Пианино, вообще, сложная штука.

Оно состоит из коробки со струнам арфообразной формы поверх резонатора (здоровенной доски формы всё той же арфы). По струнам бьют молоточки, приводимые в действие нажатием на клавишу. Нажатие на клавишу одновременно отводит от струн войлочные подушечки, что гасят колебание струны, педаль пианино делает то же самое, но для всех струн. Струн на одну ноту обычно три, в случае басов - две.

Общая физика работы такова: молоточек ударяет по струнам и те начинают колебаться. Колебания передаются резонатору, который передаёт их в воздух, что мы и слышим. Резонатор используется потому, что сами струны не создают достаточно больших звуковых волн.

Получается система из двух "сообщающихся сосудов" - энергия струн передаётся резонатору, а тот может передать энергию в воздух и обратно, что позволяет гасить звук, наложив подушечку на струну. Первоначально в резонаторе нет энергии, поэтому фронт амплитуда звука пианино идёт по нарастающей. Потом энергия в двух системах уравнивается и потери идут в воздух. Потом подушечка создаёт потери ещё больше и всё - звука нет.

(по размышлению я подумал, что связь от резонатора к струне невелика, это надо проверить экспериментами)

Молоточки пианино бьют по струне в одно и то же место, его можно немного передвинуть педалью, но, опять же, для всех нот сразу. Сразу после удара струна принимает треугольную форму, поэтому в её звуке существуют обертоны - гармоники основного тона, kF. Этим похожи все струнные инструменты, отличие состоит в возможности произвольно менять начальную форму сигнала - гитара и скрипка это позволяют, пианино нет.

Среди обертонов обязательно найдутся те, что отличаются от основного тона на октаву (два раза), две (четыре раза) и далее. Поэтому если мы нажимаем до первой октавы, то при отпущенной педали ей будут подыгрывать до второй, третьей и четвертой октав.

Собственно, всё.

Нот у нас много: 7,5 октав *12 нот, итого 90. Гармоник надо штук шесть, наверное. Итого, "резервуаров звуковой энергии" у нас 540. 96 KHz*540 = 50 миллионов операций по вычислению звучания всех нот в секунду на всё пианино. 10 операций с плавающей точкой на каждую ноту дадут нам требование в 0,5Gflops.

Генерировать сигнал надо двумерным вращением:
x' = x cos α - y sin α
y' = x sin α + y cos α

И берем либо o=x, либо o=y, потом накладываем только что вычисленную амплитуду (по формуле "сообщающихся сосудов").

α - угол поворота фазы волны для частоты F за один период дискретизации: &alpha=2πF/Fдискр.

Если его генерировать, как o=sin(t), то мы натолкнёмся на наложение (aliasing), я проходил это, когда создавал тестовый сигнал большой длительности для моего друга.

Я наверняка чего-то упустил, ну, и ладно.

Сам я проводил эксперимент только с основным тоном: сделал передачу энергии от струны к резонатору, умножал корень из энергии резонатора на текущий отсчёт и получал отсчёт, что писал в WAV. Звучало очень похоже на пианино, только весьма скучно - обертонов-то нет! ;)

компьютер, музыка, физика

Previous post Next post
Up