arduino 自作シンセ フィルター ADSR メモ

arduino シンセ フィルター ADSRメモです

#include <MozziGuts.h> // Mozziの基本ヘッダファイル
#include <Oscil.h> // オシレータのテンプレート
#include <tables/SAW2048_int8.h>
//#include <tables/SQUARE_NO_ALIAS_2048_int8.h>
#include <mozzi_rand.h>

#include <LowPassFilter.h>

LowPassFilter lpf;
char resonance = 100; // range 0-255, 255 is most resonant

#include <Line.h>
Line <unsigned int> filt;

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


#include <mozzi_midi.h>

// SIN2048_DATA2048のデータをaSinに格納  その他も同様
//Oscil <SQUARE_NO_ALIAS_2048_NUM_CELLS, AUDIO_RATE> triWarm1(SQUARE_NO_ALIAS_2048_DATA);
Oscil <SAW2048_NUM_CELLS, AUDIO_RATE> triWarm1(SAW2048_DATA);
Oscil <SAW2048_NUM_CELLS, AUDIO_RATE> triWarm2(SAW2048_DATA);
Oscil <SAW2048_NUM_CELLS, AUDIO_RATE> triWarm3(SAW2048_DATA);
Oscil <SAW2048_NUM_CELLS, AUDIO_RATE> triWarm4(SAW2048_DATA);


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

// スムースに値を変化させるためのヘッダ

int f1,f2,f3,f4, f5,f6, count;
uint8_t freq;
byte gainF=240;       //最終ゲイン調整用
unsigned int attackBa1, decayBa1, sustainBa1, releaseBa1;
unsigned int attackBa2, decayBa2, sustainBa2, releaseBa2;
unsigned int attackBa3, decayBa3, sustainBa3, releaseBa3;
unsigned int attackBa4, decayBa4, sustainBa4, releaseBa4;

 


int melody1[30]={0,2,4,7,11,12 , 12, 14, 16, 19, 23,24, 24,26,28,31,35,36, 36,38,40,43,47,48, 48,43,52,55,40,35};   //メロディーのパターン

int oc[32]={10,10,10,10, 10,10,10,10, 10,10,10,10, 10,10,10,10, 10,10,10,10, 10,10,10,10, 10,10,10,10, 10,10,10,10};   //パターン
int oc1[32]={15,10,10,10, 10,15,10,10, 10,10,10,10, 10,10,10,10, 10,10,10,10, 10,10,10,10, 10,10,10,10, 10,10,10,10};   //パターン
int oc2[32]={10,10,10,10, 10,10,10,10, 10,10,20,10, 10,10,0,0, 10,10,10,15, 10,10,10,10, 10,10,10,10, 10,10,10,10};   //パターン


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

void setup(){
 startMozzi(CONTROL_RATE);
 kTriggerDelay.start(100);// トリガーのタイミング指定(100ms)
 randSeed();
}


void updateControl(){

      uint8_t lf1=map(mozziAnalogRead(0),0,1024,150,120)+oc2[count];
      uint8_t lf2=map(mozziAnalogRead(0),0,1024,40,60)+oc2[count];
      //  uint8_t lf1=150+oc2[count];
      //  uint8_t lf2=40+oc2[count];
       
     int aa=map(mozziAnalogRead(1),0,1024,5,15);
     int aaa=map(mozziAnalogRead(0),0,1024,10,80);
      


     int att=5;  
     int sus=300;
     int re=200;
     int de=1000;

     char ac=12;
     int tc=oc[count];

     


     
        int tt=map(mozziAnalogRead(1),0,1024,2,20);


    attackBa1=att;                                                 //ADSRの値を設定する
   decayBa1=de;
   sustainBa1=sus;
   releaseBa1=re;

   attackBa2=aa;                                                 //フィルターのADSRの値を設定する
   decayBa2=aaa*5;
   sustainBa2=10;
   releaseBa2=aaa*5+oc1[count];

   
   
  


   
   
   if(kTriggerDelay.ready()){

     

     
    // triWarm.setFreq(((int)rand((int)map(mozziAnalogRead(2),0,1024,0,12))+1)*80);                 //bassの周波数
     //  triWarm1.setFreq( mtof( (int)melody1[(int)rand(6)]+(int)((rand((int)map(mozziAnalogRead(2),0,1024,1,5))+2)*12)  )  ); 
     //  triWarm2.setFreq( mtof( (int)melody1[(int)rand(6)]+(int)((rand((int)map(mozziAnalogRead(2),0,1024,2,6))+2)*12)  )  ); 
     //  triWarm3.setFreq( mtof( (int)melody1[(int)rand(6)]+(int)((rand((int)map(mozziAnalogRead(2),0,1024,2,4))+2)*12)  )  ); 
     //  triWarm4.setFreq( mtof( (int)melody1[(int)rand(6)]+(int)((rand((int)map(mozziAnalogRead(2),0,1024,3,5))+2)*12)  )  ); 

       triWarm1.setFreq( mtof( (int)melody1[((int)map(mozziAnalogRead(2),0,1024,1,19)+0)]+12))  ;    //0 1 4 6
       triWarm2.setFreq( mtof( (int)melody1[((int)map(mozziAnalogRead(2),0,1024,1,21)+1)]+24) ) ; 
       triWarm3.setFreq( mtof( (int)melody1[((int)map(mozziAnalogRead(2),0,1024,1,23)+4)]+36)  )  ; 
       triWarm4.setFreq( mtof( (int)melody1[((int)map(mozziAnalogRead(2),0,1024,1,21)+6)]+48)  ) ; 
     
     envB1.setADLevels((byte)250, (byte)150);                    // bassのエンベロープレベル   0~255
     envB1.setTimes(attackBa1, decayBa1,sustainBa1, releaseBa1);     // bassのエンベロープタイム
     envB1.noteOn();

     envB2.setADLevels((byte)lf1, (byte)lf2);                    // bassのエンベロープレベル   0~255
     envB2.setTimes(attackBa2, decayBa2,sustainBa2, releaseBa2);     // bassのエンベロープタイム
     envB2.noteOn();


   // filt.set(lf1,lf2, tc);
    
     
    
    

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

//   freq=filt.next();
     


   lpf.setCutoffFreqAndResonance(freq, resonance); 

  
}        //void updateControl()終わり 

int updateAudio(){
 envB1.update();
 envB2.update();
 freq=envB2.next();
 

 int env2=envB1.next();

  return lpf.next((((( ((env2*triWarm1.next() )>>8))+ ( ((env2*triWarm2.next() )>>8))+ ( ((env2*triWarm3.next() )>>8))+( ((env2*triWarm4.next() )>>8))  )>>2)*gainF )>>7)  ;        // サイン波とノイズを足す ノイズはgainで256倍されているので8ビットシフト(=1/2^8倍)で音量を小さくする

}


void loop(){
 audioHook();
} 
​

いいなと思ったら応援しよう!

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