Робимо синтезатор в Processing

Другий музичний інструмент, який ми зробимо – синтезатор Для створення інтесних звуків ми застосуємо синусоїдальні і пилковидні сигнали Клавіатура буде служити для вибору ноти, а миша буде вести звук зліва направо

Як це робиться

Як звичайно, почати слід з імпорту бібліотеки minim та оголошення обєктів Minim і AudioOutput Також нам знадобляться обєкти SineWave і SawWave для генерації звуку У функції setup () ми сфоміруем обидва сигналу і відправимо їх на вихід

import ddfminim*

import ddfminimsignals* import ddfminimanalysis* import ddfminimeffects*

Minim minim AudioOutput out SineWave sine SawWave saw

void setup()

{

size( 1024, 480 )

smooth() strokeWeight( 2 )

minim = new Minim( this )

out = minimgetLineOut( MinimSTEREO )

sine = new SineWave( 130816, 05, outsampleRate() ) outaddSignal( sine )

saw = new SawWave( 654064, 10, outsampleRate() ) outaddSignal( saw )

}

Можливо, ви дізналися код з функції draw () Це більш-менш той же код, що й у прикладі Отримання тимчасової діаграми

void draw()

{

background( 255 ) translate( 0, height/2 )

for ( int i = 0 i &lt outbufferSize() i++ ) { float y1 = outleftget( i ) * 100

float y2 = outrightget( i ) * 100 stroke( 0 )

point( i, y1 )

stroke( 255, 0, 0 )

point( i, y2 )

}

}

Функція mouseMoved () використовується для управління звуком Коли величина mouseX дорівнює 0, з лівого динаміка буде звучати синусоїдальний сигнал, а з правого – пилкоподібний Коли курсор миші переміститься в інший бік, буде навпаки

void mouseMoved()

{

float pan = map( mouseX, 0, width, -1, 1 ) sinesetPan( pan )

sawsetPan( -pan )

}

Функція keyPressed () використовується для зміни частоти сигналу Я використовував другий ряд своєї клавіатури AZERTY, а ви можете поставити ті клавіші, які захочете

void keyPressed()

{

if ( key == q ) { sinesetFreq( 130813 ) // C3 sawsetFreq( 654064 ) // C2

}

if ( key == s ) { sinesetFreq( 146832 ) // D3 sawsetFreq( 734162 ) // D2

}

if ( key == d ) { sinesetFreq( 164814 ) // E3 sawsetFreq( 824069 ) // E2

}

if ( key == f ) { sinesetFreq( 174614 ) // F3 sawsetFreq( 873071 ) // F2

}

if ( key == g ) { sinesetFreq( 195998 ) // G3 sawsetFreq( 979989 ) // G2

}

if ( key == h ) { sinesetFreq( 220 ) // A3 sawsetFreq( 110 ) // A2

}

if ( key == j ) { sinesetFreq( 246942 ) // B3 sawsetFreq( 123471 ) // B2

}

}

void stop()

{

outclose()

minimstop()

superstop()

}

Запустіть скетч, понажимайте на клавіші, порухайте мишею і ви почуєте звуки

Як це працює

Перше, що потрібно для синтезатора – створити обєкт AudioOutput Це робиться всього одним рядком коду:

out = minimgetLineOut( MinimSTEREO )

Minim має декілька видів сигналів для створення звуків У цьому прикладі я використовував синусоїду і пилкоподібний сигнал Ці конструктори мають три параметри Перший – частота сигналу, другий – амплітуда, третій – частота семплів Коли ви створите ці сигнали, вам слід додати їх до прикладу AudioOutput Якщо ви не зробите це, ви не почуєте звук

sine = new SineWave( 130816, 05, outsampleRate() ) outaddSignal( sine )

saw = new SawWave( 654064, 10, outsampleRate() ) outaddSignal( saw )

У функції keyPressed () відбувається управління частотою сигналів Це робиться з пощью методу wavesetFreq () У кожної ноти на фортепіано є своя частота Якщо ви на фортепіано натиснете на клавішу до третьої октави, ви почуєте звук з частотою 130813 Гц Я зробив октаву починаючи з до третьої октави (C3) для сінусодіального сигналу і октаву починаючи з до сторо октави (С2) для пилоподібного сигналу Якщо ви подивіться на ці числа, ви помітите, що часоти C3 дорівнює частоті C2 x 2 Частота ноти C4 також дорівнює подвоєною частоті ноти C3 Так ви можете з легкістю обчислити частоту будь ноти Огляд фортепіанних нот і відповідних частот ви знайдете в статті Вікіпедії за адресою: http://enwikipediaorg/wiki/Piano_key_frequencies

Джерело: Ян Вантомм, Processing 2: креативне програмування, переклад з англійської Олександри Мішутіної, Published by Packt Publishing Ltd, 2012, BIRMINGHAM – MUMBAI

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*