9. 簡単なディレイを使う

今回はディレイ(音響の遅延処理)に挑戦します。
まず、Mozziでフィードバック付きのディレイを使うには”AudioDelayFeedback.h“をincludeします。
(フィードバックの設定が必要ない場合は”AudioDelay.h“)
本スケッチでは、前回用いたEventDelayによるトリガーを用いてサイン波を前述のEadエンベロープで減衰させ、その上で、ディレイによる音響遅延処理で音色をさらに変化させています。

aDel.setDelayTimeCells()“でディレイタイムを設定(本スケッチではランダム)し、”aDel.setFeedbackLevel()“でフィードバック設定(-128〜127)を行います。

Mozziのディレイは少々滑らかさに欠けるので(あるだけ素晴らしいですが…)、外部のディレイを使った方がイメージ通りの音を作りやすいかもしれません。
(サンプルのdelays/”AudioDelayFeedbackAllPass.ino”(Tim Barrass 2012-2013.)を参考にしています)

#include <MozziGuts.h>
#include <Oscil.h> //オシレーターのテンプレート
#include <AudioDelayFeedback.h> //フィードバック付きディレイクラス
#include <Ead.h>  //エンベロープ
#include <EventDelay.h> //Arduinoのdelayの代わり
#include <mozzi_rand.h> //ランダムジェネレータ
#include <mozzi_midi.h> //midiへの変換
#include <tables/sin2048_int8.h> //サイン波テーブル

#define CONTROL_RATE 128

Oscil <SIN2048_NUM_CELLS, AUDIO_RATE> aSin(SIN2048_DATA);
EventDelay kDelay; // 遅延処理によるエンベロープトリガー
Ead kEnvelope(CONTROL_RATE); //エンベロープトリガー

AudioDelayFeedback <256, ALLPASS> aDel;

int gain;
int val;
int Pin=0;

void setup(){
  startMozzi(CONTROL_RATE); 
  randSeed(); // ランダムジェネレータの初期化 (スケッチのループ毎に異なる値を出す)
  kDelay.start(1000);
}


void updateControl(){
  
  val = map(mozziAnalogRead(Pin), 0, 1024, 0, 127); //センサの値を格納

  if(kDelay.ready()){
    aSin.setFreq(mtof(val)); // 周波数を設定
    // ADSRパラメータのランダム設定
    unsigned int duration = rand(500u)+200;
    unsigned int attack = rand(75);
    unsigned int decay = duration - attack;
    kEnvelope.start(attack,decay);
    
    // ディレイパラメータのランダム設定
    float del_cells = (float)rand(65535u)/256;
    aDel.setDelayTimeCells(del_cells); //ディレイタイム設定
    char fb = rand(-50,50);
    aDel.setFeedbackLevel(fb); //フィードバック設定(-128〜127)
    kDelay.start(duration+500); //トリガー
  }
  gain = (int) kEnvelope.next(); 
}

int updateAudio(){
  return aDel.next((gain*aSin.next())>>8); //ディレイ処理をかけた結果を出力する処理 (シフト演算によるゲイン調整)
}

void loop(){
  audioHook();
}

 
回路は第4回の可変抵抗のものを流用してください。
pot