Подтвердить что ты не робот

Самый простой способ создания гитарных аккордов в Linux и/или python

То, что я пытаюсь достичь, играет на гитарном аккорде из моего приложения python. Я знаю (или могу рассчитать) частоты в аккорде, если это необходимо.

Я думаю, что, даже если я выполняю низкоуровневую работу по созданию нескольких синусоидальных волн на правильных частотах, он не будет звучать правильно из-за того, что конверт тоже должен быть правильным, иначе он не будет звучать как гитара, но больше гул.

Танцинируемо, командная игра linux sox может дать довольно убедительную индивидуальную заметку с помощью:

play -n synth 0 pluck E3

Я действительно спрашиваю,

a) можно ли выполнить команду воспроизведения для выполнения целого аккорда (в идеале с немного отличающимся временем начала, чтобы имитировать штрих строки plectrum) - я не смог это сделать, но, возможно, это несколько bash fairydust, который разветкит процесс или, таким образом, звучит правильно. Если это возможно, я бы согласился просто вызвать команду bash из моего кода (мне не нравится изобретать колесо).

b) (еще лучше) есть ли способ в питоне достижения этого (звук гитарного аккорда)? Я видел несколько доступных midi-библиотек python, но откровенно midi не подходит для звука, который я хочу, насколько я могу судить.

4b9b3361

Ответ 1

В руководстве приведен пример:

play -n synth pl G2 pl B2 pl D3 pl G3 pl D4 pl G4 \
               delay 0 .05 .1 .15 .2 .25 remix - fade 0 4 .1 norm -1

Это создает 6 одновременных экземпляров синтезатора (в виде отдельных аудиоканалов), задерживает 5 каналов несколько раз, а затем смешивает их с одним каналом.

Результат - довольно убедительный гитарный аккорд; вы можете, конечно, легко изменить заметки или задержки. Вы также можете поиграть с сустейном и тоном "гитары" или добавить эффект овердрайва - подробнее см. В руководстве.

Ответ 2

a) Хакерский способ - создать подпроцесс фона для запуска каждой команды play. Поскольку фоновый подпроцесс не заставит оболочку ждать завершения, вы можете сразу запустить несколько play. Что-то вроде этого будет работать:

for p in "C3" "E3" "G3"; do ( play -n synth 3 pluck $p & ); done

Я вижу, что ninjagecko опубликовал в основном то же самое, что и я.

b) Ключевым моментом для реализации данных MIDI является то, что он больше напоминает рецепт высокого уровня для создания звука, а не самого звука. Другими словами, каждая нота MIDI выражается как шаг, динамический уровень, время начала и остановки и различные метаданные. Фактический звук создается синтезатором, а разные синтезаторы выполняют работу с разными уровнями качества. Если вам не нравится звук, который вы получаете от ваших MIDI файлов, это не проблема с MIDI, это проблема с вашим синтезатором, поэтому вам просто нужно найти лучший. (На практике это обычно занимает $$$, большинство бесплатных или дешевых синтезаторов довольно плохие.)

Альтернативой могло бы быть, например, выкопать под капотом и реализовать алгоритм для создания собственного гитарного звука. Для этого вы хотели бы посмотреть в обработку цифрового сигнала, в частности что-то вроде Karplus-Strong алгоритм (один из многих способов создания синтезированного струнного звука). Это увлекательный сюжет, но если ваша единственная экспозиция к синтезу звука находится на уровне play и создает MIDI файлы, вы бы немного научились делать. Кроме того, Python, вероятно, не лучший выбор языка, так как скорость выполнения довольно критическая.

Если вам интересно узнать о DSP, вы можете загрузить и воспроизвести с помощью ChucK.

Ответ 3

a) можно ли выставить команду воспроизведения для выполнения целого аккорда...?

Если ваша звуковая архитектура поддерживает его, вы можете запускать несколько команд, которые выводят звук одновременно. Если вы используете ALSA, вам нужны dmix или другие варианты в ~/.asoundrc. Используйте subprocess.Popen, чтобы вызвать множество дочерних процессов. Если бы это было гипотетически bash script, вы могли бы сделать:

command1 &
command2 &
...

b) (еще лучше) есть ли способ в питоне достижения этого (звук аккорда гитары)?

Компиляция с MIDI и вывод с помощью программного синтезатора, такого как FluidSynth.