今回はディレイ(音響の遅延処理)に挑戦します。
まず、Mozziでフィードバック付きのディレイを使うにはAudioDelayFeedback.h
をincludeします。
(フィードバックの設定が必要ない場合はAudioDelay.h
)
本スケッチでは、前回用いたEventDelayによるトリガーを用いてサイン波を前述のEadエンベロープで減衰させ、その上で、ディレイによる音響遅延処理で音色をさらに変化させています。
aDel.setDelayTimeCells()
でディレイタイムを設定(本スケッチではランダム)し、aDel.setFeedbackLevel()
でフィードバック設定(-128〜127)を行います。
Mozziのディレイは少々滑らかさに欠けるので(あるだけ素晴らしいですが…)、外部のディレイを使った方がイメージ通りの音を作りやすいかもしれません。
(サンプルのdelays/”AudioDelayFeedbackAllPass.ino”(Tim Barrass 2012-2013.)
を参考にしています)
1#include <MozziGuts.h>
2#include <Oscil.h> //オシレーターのテンプレート
3#include <AudioDelayFeedback.h> //フィードバック付きディレイクラス
4#include <Ead.h> //エンベロープ
5#include <EventDelay.h> //Arduinoのdelayの代わり
6#include <mozzi_rand.h> //ランダムジェネレータ
7#include <mozzi_midi.h> //midiへの変換
8#include <tables/sin2048_int8.h> //サイン波テーブル
9
10#define CONTROL_RATE 128
11
12Oscil <SIN2048_NUM_CELLS, AUDIO_RATE> aSin(SIN2048_DATA);
13EventDelay kDelay; // 遅延処理によるエンベロープトリガー
14Ead kEnvelope(CONTROL_RATE); //エンベロープトリガー
15
16AudioDelayFeedback <256, ALLPASS> aDel;
17
18int gain;
19int val;
20int Pin=0;
21
22void setup(){
23 startMozzi(CONTROL_RATE);
24 randSeed(); // ランダムジェネレータの初期化 (スケッチのループ毎に異なる値を出す)
25 kDelay.start(1000);
26}
27
28
29void updateControl(){
30
31 val = map(mozziAnalogRead(Pin), 0, 1024, 0, 127); //センサの値を格納
32
33 if(kDelay.ready()){
34 aSin.setFreq(mtof(val)); // 周波数を設定
35 // ADSRパラメータのランダム設定
36 unsigned int duration = rand(500u)+200;
37 unsigned int attack = rand(75);
38 unsigned int decay = duration - attack;
39 kEnvelope.start(attack,decay);
40
41 // ディレイパラメータのランダム設定
42 float del_cells = (float)rand(65535u)/256;
43 aDel.setDelayTimeCells(del_cells); //ディレイタイム設定
44 char fb = rand(-50,50);
45 aDel.setFeedbackLevel(fb); //フィードバック設定(-128〜127)
46 kDelay.start(duration+500); //トリガー
47 }
48 gain = (int) kEnvelope.next();
49}
50
51int updateAudio(){
52 return aDel.next((gain*aSin.next())>>8); //ディレイ処理をかけた結果を出力する処理 (シフト演算によるゲイン調整)
53}
54
55void loop(){
56 audioHook();
57}
回路は第4回の可変抵抗のものを流用してください。