Самый простой способ создания гитарных аккордов в Linux и / или Python - PullRequest
13 голосов
/ 14 июля 2011

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

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

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

play -n synth 0 pluck E3

Так что на самом деле я спрашиваю,

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

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

Ответы [ 3 ]

13 голосов
/ 14 июня 2012

В руководстве приведен следующий пример:

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 каналов с небольшим увеличением времени, а затем микширует их до одного канала..

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

6 голосов
/ 14 июля 2011

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

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

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

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

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

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

4 голосов
/ 14 июля 2011

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

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

command1 &
command2 &
...

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

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

...