Главная » Processing » Делаем синтезатор в Processing

2

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

Как это делается

Как обычно, начать следует с импорта библиотеки minim и объявления объектов Minim и AudioOutput. Также нам понадобятся объекты SineWave и SawWave для генерации звука. В функции setup() мы сфомируем оба сигнала и отправим их на выход.

import ddf.minim.*;

import ddf.minim.signals.*; import ddf.minim.analysis.*; import ddf.minim.effects.*;

Minim minim; AudioOutput out; SineWave sine; SawWave saw;

void setup()

{

size( 1024, 480 );

smooth(); strokeWeight( 2 );

minim = new Minim( this );

out = minim.getLineOut( Minim.STEREO );

sine = new SineWave( 130.816, 0.5, out.sampleRate() ); out.addSignal( sine );

saw = new SawWave( 65.4064, 1.0, out.sampleRate() ); out.addSignal( saw );

}

Возможно, вы узнали код из функции draw(). Это более или менее тот же код, что и в примере Получение временной диаграммы.

void draw()

{

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

for ( int i = 0; i < out.bufferSize(); i++ ) { float y1 = out.left.get( i ) * 100;

float y2 = out.right.get( 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 ); sine.setPan( pan );

saw.setPan( -pan );

}

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

void keyPressed()

{

if ( key == ‘q’ ) { sine.setFreq( 130.813 ); // C3 saw.setFreq( 65.4064 ); // C2

}

if ( key == ‘s’ ) { sine.setFreq( 146.832 ); // D3 saw.setFreq( 73.4162 ); // D2

}

if ( key == ‘d’ ) { sine.setFreq( 164.814 ); // E3 saw.setFreq( 82.4069 ); // E2

}

if ( key == ‘f’ ) { sine.setFreq( 174.614 ); // F3 saw.setFreq( 87.3071 ); // F2

}

if ( key == ‘g’ ) { sine.setFreq( 195.998 ); // G3 saw.setFreq( 97.9989 ); // G2

}

if ( key == ‘h’ ) { sine.setFreq( 220 ); // A3 saw.setFreq( 110 ); // A2

}

if ( key == ‘j’ ) { sine.setFreq( 246.942 ); // B3 saw.setFreq( 123.471 ); // B2

}

}

void stop()

{

out.close();

minim.stop();

super.stop();

}

Запустите скетч, понажимайте на клавиши, подвигайте мышью и вы услышите звуки.

Как это работает

Первое, что нужно для синтезатора – создать объект AudioOutput. Это делается всего одной строкой кода:

out = minim.getLineOut( Minim.STEREO );

Minim имеет несколько видов сигналов для создания звуков. В этом примере я использовал синусоиду и пилообразный сигнал. Эти конструкторы имеют три параметра. Первый – частота сигнала, второй – амплитуда, третий – частота сэмплов. Когда вы создадите эти сигналы, вам следует добавить их к примеру AudioOutput. Если вы не сделаете это, вы не услышите звук.

sine = new SineWave( 130.816, 0.5, out.sampleRate() ); out.addSignal( sine );

saw = new SawWave( 65.4064, 1.0, out.sampleRate() ); out.addSignal( saw );

В функции keyPressed() происходит управление частотой сигналов. Это делается с пощью метода wave.setFreq(). У каждой ноты на фортепиано есть своя частота. Если вы на фортепьяно нажмете на клавишу до третьей октавы, вы услышите звук с частотой 130.813 Гц. Я сделал октаву начиная с до третьей октавы (C3) для синусодиального сигнала и октаву начиная с до сторой октавы (С2) для пилообразного сигнала. Если вы посмотрите на эти числа, вы заметите, что часота C3 равна частоте C2 x 2. Частота ноты C4 также равна удвоенной частоте ноты C3. Так вы можете с легкостью вычислить частоту любой ноты. Обзор фортепьянных нот и соответствующих частот вы найдете в статье Википедии по адресу: http://en.wikipedia.org/wiki/Piano_key_frequencies.

Источник: Ян Вантомм, Processing 2: креативное программирование, перевод с английского Александры Мишутиной, Published by Packt Publishing Ltd., 2012, BIRMINGHAM – MUMBAI.

По теме:

  • Комментарии

Комментариев 2

  1. Ай says:

    Краткость она сестра!
    Гипертекст позволяет всего одной строкой написть ” Войну и Мир” ! :)

    http://code.compartmental.net/tools/minim/quickstart/
    http://code.compartmental.net/minim/audioinput_class_audioinput.html

  2. Ай says:

    Вот он Миним !

    Странности в размерах файла при указывании библотек Processing
    Нет там размеров , безразмерные они …

    величина библиотеки Миним
    около 150 м

    URL:: https://codeload.github.com/ddf/Minim/zip/v2.2.0
    Сохранён в:: C:\Documents and Settings\RRR\Рабочий стол\220412\Minim-2.2.0.zip

    при откачке зип файлов размер
    не указывается Оперой что он 3 метра или что он 300 метров

    http://code.compartmental.net/minim/distro/minim-2.2.0.zip

    всего то 147 метров при обычных 50м в сутки
    это же три дня качать ! :)

    словно они сами ни качали файлов из сети …
    кому то фильмы по 4 Г …