Робимо драм-машину в Processing

Тепер, коли ви вмієте аналізувати і візуалізувати аудіофайл, ми спробуємо здати музичний інструмент Почнемо з постронніх програмованої драм-машини з 16-кроковим секвенсором за типом відомих TR-808 і TR-909 драм-машин від Roland На сайті Vintage Synth Explorer ви можете дізнатися все про ці пристрої: at http:// wwwvintagesynthcom/roland/808php

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

Почніть із створення новорічні скетчу і збереження його під імям drum_machinepde Додайте до скетчу нову вкладку і збережіть її як Buttonpde У ній ми напишемо простий клас Button, щоб ви могли включати і вимикати кнопку Цей клас буде також керувати програванням аудіо

class Button

{

float x float y float w float h

boolean isOn

Button( float _x, float _y )

{

x = _x y = _y w = 20

h = 20

isOn = false

}

void render()

{

if ( isOn == true ) { fill( 255, 0, 0 )

} else {

fill( 255 )

}

rect( x, y, w, h )

}

void pressButton( int _x, int _y )

{

if ( _x &gt x &amp&amp _x &lt x + w &amp&amp _y &gt y &amp&amp _y &lt y + h ) { isOn = isOn

}

}

}

В основному вікні скетчу потрібно імпортувати бібліотеку minim і оголошена кілька змінних Для завантаження звуків я використовував клас AudioSample замість AudioPlayer тому, що він дозволяє включати звуки по команді Для кожного звуку нам потрібен масив обєктів Button У функції setup () ми завантажимо кілька звуків і заповнимо масив кнопок типовими ритмами барабана

import ddfminim*

import ddfminimsignals* import ddfminimanalysis* import ddfminimeffects*

Minim minim AudioSample samples[]

Button[] bd

Button[] sn Button[] oh Button[] ch

int playhead void setup()

{

size( 640, 200 )

minim = new Minim( this ) samples = new AudioSample[4]

samples[0] = minimloadSample( &quotbdaif&quot ) samples[1] = minimloadSample( &quotsnaif&quot ) samples[2] = minimloadSample( &quotohaif&quot ) samples[3] = minimloadSample( &quotchaif&quot )

frameRate( 8 )

playhead = 0

bd = new Button[16]

for ( int i = 0 i &lt bdlength i++ ) { bd[i] = new Button( 125 + i * 30, 50 ) if ( i % 4 == 0 ) {

bd[i]isOn = true

}

}

sn = new Button[16]

for ( int i = 0 i &lt snlength i++ ) { sn[i] = new Button( 125 + i * 30, 80 ) if ( i % 8 – 4 == 0 ) {

sn[i]isOn = true

}

}

oh = new Button[16]

for ( int i = 0 i &lt ohlength i++ ) { oh[i] = new Button( 125 + i * 30, 110 ) if ( i % 2 == 1 ) {

oh[i]isOn = true

}

}

ch = new Button[16]

for ( int i = 0 i &lt chlength i++ ) { ch[i] = new Button( 125 + i * 30, 140 ) if ( i % 2 == 0 ) {

ch[i]isOn = true

}

}

}

У функції draw () ми зробимо покажчик секвенсора, що йде за кнопками Коли це буде закінчено, ми запрограмуємо включення аудіо у разі активації кнопки і переміщення покажчика на нову позицію

void draw()

{

background( 255 )

// draw playhead fill( 0 )

rect( 120 + playhead * 30, 45, 30, 120 )

// draw buttons fill( 0 )

text( &quot*** PROCESSING DRUM MACHINE v10 ***&quot, 125, 30 )

text( &quotBassdrum&quot, 20, 65 )

text( &quotSnare&quot, 20, 95 )

text( &quotOpen Hi-hat&quot, 20, 125 )

text( &quotClosed Hi-hat&quot, 20, 155 )

for ( int i = 0 i &lt bdlength i++ ) { bd[i]render()

}

for ( int i = 0 i &lt snlength i++ ) { sn[i]render()

}

for ( int i = 0 i &lt ohlength i++ ) { oh[i]render()

}

for ( int i = 0 i &lt chlength i++ ) { ch[i]render()

}

// play samples

if ( bd[playhead]isOn ) { samples[0]trigger()

}

if ( sn[playhead]isOn ) { samples[1]trigger()

}

if ( oh[playhead]isOn ) { samples[2]trigger()

}

if ( ch[playhead]isOn ) { samples[3]trigger()

}

// move playhead playhead++

if ( playhead &gt= 16 ) { playhead = 0

}

}

Функція mousePressed () іспользутся для перемикання кнопок З кожним кліком ми програма пройдеться по масиву кнопок і з допомогою методу pressButton () для кожного обєкта Button визначить, чи натиснута кнопка Якщо це так, метод змінить стан кнопки

void mousePressed()

{

for ( int i = 0 i &lt bdlength i++ ) { bd[i]pressButton( mouseX, mouseY )

}

for ( int i = 0 i &lt snlength i++ ) { sn[i]pressButton( mouseX, mouseY )

}

for ( int i = 0 i &lt ohlength i++ ) { oh[i]pressButton( mouseX, mouseY )

}

for ( int i = 0 i &lt chlength i++ ) { ch[i]pressButton( mouseX, mouseY )

}

}

І нарешті нам потрібно закрити всі аудіофайли і зупинити обєкт Minim за допомогою функції stop ()

void stop()

{

samples[0]close()

samples[1]close()

samples[2]close()

samples[3]close() minimstop()

superstop()

}

Коли ви запустите приклад, перед вами буде працююча драм-машина Натискайте на кнопки і створюйте ваші власні ритми

Як це працює

У цьому прикладі я використовував клас AudioSample замість AudioPlayer Це дещо інший клас – він тримає в памяті весь аудіофайл, тому його краще застосовувати з невеликими аудіофайлами Цей формат ідеальний для коротких звуків барабана Для програвання файлу є метод trigger ()

У функції setup () я встановив значення змінної frameRate рівний 8 Якщо ви задасте менше число, ритм буде повільніше, якщо більш високе – бистроее На даний момент це те, що потрібно, адже наш інструмент дуже простий Для створення більш професійного інструменту потрібно програвати звуки на основі певного тимчасового інтервалу це буде трохи складніше

Покажчик пересувається з кожним кадром і повертається в 0 по досягненні останнього кроку секвенсора Наступний фрагмент коду перевіряє, чи натиснута яка кнопка і включає відповідний натиснутій кнопці звук

if ( bd[playhead]isOn ) { samples[0]trigger()

}

У класі Button існує метод pressButton () Цей метод спрацьовує для всіх кнопок, коли ми натискаємо мишею Код в умові if являє собою просту схему перевірки, чи знаходиться координата _x і _y в області кнопки Величини _x і _y є, по суті, змінними mouseX і mouseY, що проходять у функції mousePressed ()

void pressButton( int _x, int _y )

{

if ( _x &gt x &amp&amp _x &lt x + w &amp&amp _y &gt y &amp&amp _y &lt y + h ) { isOn = isOn

}

}

Джерело: Ян Вантомм, 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>

*

*