arduinoとmozziでドラムとシンセ テスト2 スケッチ

#include <MozziGuts.h> // Mozziの基本ヘッダファイル
#include <Oscil.h> // オシレータのテンプレート
#include <tables/sin2048_int8.h> // サイン波のテーブル
#include <tables/TRIANGLE_VALVE_2048_int8.h>
#include <tables/BROWNNOISE8192_int8.h>
#include <tables/TRIANGLE_VALVE_2048_int8.h>
#include <tables/TRIANGLE_VALVE_2048_int8.h>
#include <mozzi_rand.h>


//#include <AudioDelayFeedback.h>
//AudioDelayFeedback <256, ALLPASS> aDeL;

#include <ADSR.h>                      //エンベロープ
ADSR <AUDIO_RATE, AUDIO_RATE> envH;
ADSR <AUDIO_RATE, AUDIO_RATE> envB;
ADSR <AUDIO_RATE, AUDIO_RATE> envB2;
ADSR <AUDIO_RATE, AUDIO_RATE> envB3;

#include <mozzi_midi.h>

// SIN2048_DATA2048のデータをaSinに格納  その他も同様
Oscil <SIN2048_NUM_CELLS, AUDIO_RATE> aSin(SIN2048_DATA);
Oscil <TRIANGLE_VALVE_2048_NUM_CELLS, AUDIO_RATE> triWarm(TRIANGLE_VALVE_2048_DATA);
Oscil <TRIANGLE_VALVE_2048_NUM_CELLS, AUDIO_RATE> triWarm2(TRIANGLE_VALVE_2048_DATA);
Oscil <TRIANGLE_VALVE_2048_NUM_CELLS, AUDIO_RATE> triWarm3(TRIANGLE_VALVE_2048_DATA);
Oscil <BROWNNOISE8192_NUM_CELLS, AUDIO_RATE> bNoise(BROWNNOISE8192_DATA);


// トリガー(発音タイミング)のためのヘッダ
#include <EventDelay.h>
EventDelay kTriggerDelay;

// スムースに値を変化させるためのヘッダ
#include <Line.h> 
Line <long> kick; // Line <型> 変数名
Line <long> kick1; 
Line <long> kick2; 


int freq, freq1, freq2, kstep;
int f1,f2,f3,f4, f5,f6, count;
int gain, gain1, gain2, gain3, gain4;
byte gainF=255;       //最終ゲイン調整用
unsigned int attackBa, decayBa, sustainBa, releaseBa;
unsigned int attackBa2, decayBa2, sustainBa2, releaseBa2;
unsigned int attackBa3, decayBa3, sustainBa3, releaseBa3;
unsigned int attackHe, decayHe, sustainHe, releaseHe;


int dstep[16]={1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,1};  //配列による16ステップのシーケンサ 1でオン 0でオフ
int hstep[16]={0,0,1,0,0,0,1,0,0,0,1,1,0,0,1,1};  //hihatのシーケンス
int bstep[16]={1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1};  //bass のシーケンス  
int b2step[16]={0,1,1,0,1,1,0,1,1,0,1,1,1,0,1,0};  //bass2 のシーケンス  
int b3step[16]={1,0,1,0,1,1,1,0,1,0,1,1,1,0,1,1};  //bass2 のシーケンス  

int rclkPin = 11;   // (11) ST_CP [RCLK] on 74HC595
int srclkPin = 8;   // (9)  SH_CP [SRCLK] on 74HC595
int dsPin = 12;     // (12) DS [SER] on 74HC595

byte leds = B00000000; //ledsをbyte型としてb00000000で定義

int melody1[6]={12, 14, 16, 19, 24,23};   //メロディーのパターン

// コントロールレートをあらかじめ定義
#define CONTROL_RATE 128

void setup(){
 startMozzi(CONTROL_RATE);
 kTriggerDelay.start(100);// トリガーのタイミング指定(100ms)
 randSeed();
 
 pinMode(rclkPin, OUTPUT);   //11番ピンをOUTPUTとして定義
 pinMode(dsPin, OUTPUT);     //12番ピンをOUTPUTとして定義
 pinMode(srclkPin, OUTPUT);  //9番ピンをOUTPUTとして定義
 
}


void updateControl(){
   // f5=map(mozziAnalogRead(1),0,1024,0,200);     // 可変抵抗の値を 0から200に調整する。
       f5=50;
     leds = 0;                                  //初期化設定、b00000000(8bitを0にする)
 digitalWrite(rclkPin, LOW);                //送信中のRCLKをLowにする
 shiftOut(dsPin, srclkPin, LSBFIRST, leds); //全てのLEDを消灯
 digitalWrite(rclkPin, HIGH);               //送信終了後RCLKをHighにする
int i=0;

   if (count<=8){
     i=count;
     }else if(count>8) {
     i=count-8;
       }
   bitSet(leds, i);                           //bitbyte操作関数で指定したビットを1にする
   
   digitalWrite(rclkPin, LOW);                //送信中のRCLKをLowにする
   shiftOut(dsPin, srclkPin, LSBFIRST, leds); //シフト演算を使って点灯するLEDを選択
   digitalWrite(rclkPin, HIGH);               //送信終了後RCLKをHighにする
   


   attackBa=1;                                                 //ADSRの値を設定する
   decayBa=map(mozziAnalogRead(0),0,1024,0,750);
   sustainBa=100;
   releaseBa=(unsigned int)random(150);

       attackBa2=1;                                                 //ADSRの値を設定する
   decayBa2=map(mozziAnalogRead(0),0,1024,0,750);
   sustainBa2=100;
   releaseBa2=(unsigned int)random(100);

           attackBa3=1;                                                 //ADSRの値を設定する
   decayBa3=map(mozziAnalogRead(0),0,1024,0,750);
   sustainBa3=100;
   releaseBa3=(unsigned int)random(100);

   attackHe=1;                                                 //ADSRの値を設定する
   decayHe= (unsigned int)(random((int)(map(mozziAnalogRead(1),0,1024,0,250))));
   sustainHe=1;
   releaseHe=(unsigned int)random(100) ;


  // aDeL.setDelayTimeCells(2500u);   //ディレイタイム  サンプル数で
  // aDeL.setFeedbackLevel(100);     //    -127~127でフィードバック量
   
   

   
   
   
   if(kTriggerDelay.ready()){

     
     
     switch (dstep[count]){    // キック 配列dstepが0か1かで音が鳴るか鳴らないか判断する。  

     case 0:
       f1=0;
       f2=0;
       f3=0;
       f4=0;
   
       kick.set(0, 0, 0);  // 配列が0の時は音が鳴らないようにパラメータを0にする
       kick1.set(0, 0, 0); 
       kick2.set(0, 0, 0);
       break;

     case 1:
       f1=f5*7;                   //ドラムの周波数を決定する f1→f2→f3→f4と変化する。
       f2=f5*3.0;
       f3=f5*1.5;
       f4=f5;
     
       kick.set(f1, f2, 7); // Lineによる値の変化設定(初期値, 目標値, ステップ数)
       kick1.set(f2, f3, 50); 
       kick2.set(f3, f4, 60);
       break;
      }                     //キック switch 終わり

    // triWarm.setFreq(((int)rand((int)map(mozziAnalogRead(2),0,1024,0,12))+1)*80);                 //bassの周波数
       triWarm.setFreq( mtof( (int)melody1[(int)rand(6)]+(int)((rand((int)map(mozziAnalogRead(2),0,1024,0,5))+2)*12)  )  ); 
       triWarm2.setFreq( mtof( (int)melody1[(int)rand(6)]+(int)((rand((int)map(mozziAnalogRead(2),0,1024,0,5))+2)*12)  )  ); 
       triWarm3.setFreq( mtof( (int)melody1[(int)rand(6)]+(int)((rand((int)map(mozziAnalogRead(2),0,1024,0,6))+2)*12)  )  ); 
     
     envB.setADLevels((byte)255, (byte)150);                    // bassのエンベロープレベル   0~255
     envB.setTimes(attackBa, decayBa,sustainBa, releaseBa);     // bassのエンベロープタイム
     envB.noteOn();

     envB2.setADLevels((byte)255, (byte)150);                    // bass2のエンベロープレベル   0~255
     envB2.setTimes(attackBa2, decayBa2,sustainBa2, releaseBa2);     // bass2のエンベロープタイム
     envB2.noteOn();     
     
     envB3.setADLevels((byte)255, (byte)150);                    // bass2のエンベロープレベル   0~255
     envB3.setTimes(attackBa3, decayBa3,sustainBa3, releaseBa3);     // bass2のエンベロープタイム
     envB3.noteOn();  
   

       
     bNoise.setFreq(1000);                                 // hihatのノイズの周波数
     
     envH.setADLevels((byte)255, (byte)100);                   // hihatのエンベロープレベル 0~255
     envH.setTimes(attackHe, decayHe,sustainHe, releaseHe);    // hihatのエンベロープタイム 
     envH.noteOn();

     
     
     
     switch (bstep[count]){    // bass 配列bstepが0か1かで音が鳴るか鳴らないか判断する。  
     case 0:                 //0のときゲイン0
       gain1=0;            
       break;
     case 1:                  //1のときゲインはエンベロープ
       gain1=1;
       break;
      }                      //bass switch終わり

        switch (b2step[count]){    // bass2 配列bstepが0か1かで音が鳴るか鳴らないか判断する。  
     case 0:                 //0のときゲイン0
       gain3=0;            
       break;
     case 1:                  //1のときゲインはエンベロープ
       gain3=1;
       break;
      }                      //bass switch終わり
      
       switch (b3step[count]){    // bass2 配列bstepが0か1かで音が鳴るか鳴らないか判断する。  
     case 0:                 //0のときゲイン0
       gain4=0;            
       break;
     case 1:                  //1のときゲインはエンベロープ
       gain4=1;
       break;
      }                      //bass switch終わり

      switch (hstep[count]){    // hihat 配列hstepが0か1かで音が鳴るか鳴らないか判断する。  
     case 0:                 //0のときゲイン0
       gain2=0;            
       break;
     case 1:                  //1のときゲインはエンベロープ
       gain2=1;
       break;
      }                      //hihat switch終わり

      


   
      count +=1;                 //  カウントを増やす 16になったらゼロにする 
      if(count==16){
         count=0; }       
       kTriggerDelay.start(150);
       
  }    //  kTrigger if文終わり

     
   freq = kick.next(); // 変数freqにスムースな値の変化の結果を代入

   if(freq>f2&& freq<=f1){             // f1→f2の時はkick
     freq=kick.next();
     }else  if(freq>f3&& freq<=f2){     // f2→f3の時はkick1
     freq=kick1.next();
     }else  if(freq>f4&& freq<=f3){      // f3→f4の時はkick2 になるように
     freq=kick2.next();
     }

   if(freq > f4 && freq <= f1){
     aSin.setFreq(freq); // f4より大きい限り音を出力
     } else{
     kick.set(0, 0, 0); // スムースな値の変化設定の初期化
     aSin.setFreq(0); // 周波数を0に設定
     }

     
  
}        //void updateControl()終わり 

int updateAudio(){
 envB.update();
 envB2.update();
 envB3.update();
 envH.update();

  return ((((( aSin.next()+( ((gain3*(envB2.next()*triWarm2.next() ))>>8))+ ( ((gain1*(envB.next()*triWarm.next() ))>>8))+ ( ((gain4*(envB3.next()*triWarm3.next() ))>>8))+( (gain2*(envH.next()*bNoise.next() )>>11)) )>>2)*gainF )>>7))  ;        // サイン波とノイズを足す ノイズはgainで256倍されているので8ビットシフト(=1/2^8倍)で音量を小さくする
 // return aDeL.next(((((( aSin.next()+( ((gain3*(envB2.next()*triWarm2.next() ))>>8))+ ( ((gain1*(envB.next()*triWarm.next() ))>>8))+( (gain2*(envH.next()*bNoise.next() )>>11)) )>>2)*gainF )>>7)))  ;        // サイン波とノイズを足す ノイズはgainで256倍されているので8ビットシフト(=1/2^8倍)で音量を小さくする
}


void loop(){
 audioHook();
} 

よろしければサポートお願いします!