Как синтезировать звуки? - PullRequest
7 голосов
/ 26 апреля 2009

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

Что я знаю далеко от настоящих инструментов, так это то, что издаваемые ими звуки редко бывают чистыми. Но как производить такие нечистые звуки?

До сих пор я делал это, он производит довольно простой звук, из-за которого я не уверен, что он даже правильно использует alsa.

import numpy
from numpy.fft import fft, ifft
from numpy.random import random_sample
from alsaaudio import PCM, PCM_NONBLOCK, PCM_FORMAT_FLOAT_LE

pcm = PCM()#mode=PCM_NONBLOCK)
pcm.setrate(44100)
pcm.setformat(PCM_FORMAT_FLOAT_LE)
pcm.setchannels(1)
pcm.setperiodsize(4096)

def sine_wave(x, freq=100):
    sample = numpy.arange(x*4096, (x+1)*4096, dtype=numpy.float32)
    sample *= numpy.pi * 2 / 44100
    sample *= freq
    return numpy.sin(sample)

for x in xrange(1000):
    sample = sine_wave(x, 100)
    pcm.write(sample.tostring())

Ответы [ 4 ]

16 голосов
/ 26 апреля 2009

Синтез звука - сложная тема, для освоения которой требуется много лет обучения.

Это также не полностью решенная проблема, хотя относительно недавние разработки (такие как синтез физического моделирования) достигли прогресса в имитации инструментов реального мира.

Вам доступно несколько вариантов. Если вы уверены, что хотите продолжить изучение синтеза, тогда я предлагаю вам начать с изучения синтеза FM. Его относительно легко изучить и реализовать в программном обеспечении, по крайней мере, в основных формах, и он производит широкий спектр интересных звуков. Также ознакомьтесь с книгой Curtis Roads "The Computer Music Tutorial". Это библия для всего, что связано с компьютерной музыкой, и хотя ей уже несколько лет, это книга для изучения основ.

Если вам нужен более быстрый способ создания реалистичного звука, подумайте об использовании методов сэмплирования: запишите инструменты, которые вы хотите воспроизвести (или используйте уже существующий банк сэмплов), и просто воспроизведите сэмплы. Это гораздо более простой (и часто более эффективный) подход.

8 голосов
/ 26 апреля 2009

Радостно, если вы хотите сгенерировать (с нуля) что-то, что действительно звучит «органично», то есть, как физический объект, вам, вероятно, лучше узнать немного о том, как генерируются эти звуки. Для серьезного введения вы можете взглянуть на такие книги, как Флетчер и Россингс Физика музыкальных инструментов . В интернете тоже есть много вещей, вы можете взглянуть на учебник, который Джеймс Кларк имеет здесь

По крайней мере, умение разбираться с подобными вещами даст вам представление о том, с чем вы столкнулись. Точное моделирование физических инструментов очень сложно!

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

Чтение небольшого количества информации об анализе Фурье в целом поможет, как и методы частотной модуляции (FM).

Веселись!

1 голос
/ 26 апреля 2009

Я согласен, что это очень нетривиально, и нет никакого «правильного пути», но вы должны начать с (или создать собственный) MIDI SoundFont .

0 голосов
/ 15 июня 2009

Как говорили другие люди, совсем не тривиальная тема. Существуют проблемы как в части программирования (особенно если вы заботитесь о малой задержке), так и в части синтеза. Золотым рудником для синтеза звука является страница Джулиуса О. Смита. Существует множество методик синтеза http://ccrma -www.stanford.edu / ~ jos / .

...