Arduino-mozzi-synth-1/30

#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 = 70; // 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>

#include <IntMap.h> // IntMapをインクルードする。
IntMap areadAds(0,1024,5,300); // IntMapとしてabcを定義する。 0から1024の値を0から200に変換する
IntMap areadAds2(0,1024,0,700); // IntMapとしてabcを定義する。 0から1024の値を0から200に変換する
IntMap areadGain(0,1024,0,190); // IntMapとしてabcを定義する。 0から1024の値を0から200に変換する
IntMap areadTempo(0,1024,10,700); // IntMapとしてabcを定義する。 0から1024の値を0から200に変換する


// 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;
EventDelay LEDdelay;

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

byte  count=0;
byte  count1=0;
byte melcount=0;
byte randmel;
uint8_t freq;
byte gainF=240;


byte pin5;
byte pulse;
int tempo;
bool trigger;
byte check;                //パルスの立ち上がりの判定用


unsigned int attackBa1, decayBa1, sustainBa1, releaseBa1;
unsigned int attackBa2, decayBa2, sustainBa2, releaseBa2;
unsigned int attackBa3, decayBa3, sustainBa3, releaseBa3;
unsigned int attackBa4, decayBa4, sustainBa4, releaseBa4;

 


//byte 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};   //メロディーのパターン
//byte melody1[20][4]={ {67,64,60,48},{67,62,59,47},{69,65,60,41},{71,65,62,43},  {69,64,61,45},{65,62,58,43},{67,64,58,36},{69,64,60,41},  {68,62,57,47},{66,62,57,47},{68,62,59,40},{64,60,55,36},   {68,62,59,40},{69,64,60,45},{70,65,62,43},{70,67,64,36},  {69,65,60,41},{67,64,61,45},{65,62,57,38},{65,60,56,46}  };                             

//byte melody1[8][3]={ {69,60,45}, {69,60,45}, {65,58,43},{67,58,36}, {69,60,41},{69,60,41}, {68,59,40},{68,59,40}};  
//byte melody[15]={48,50,52,55,57, 60,62,64,67,69, 72,74,76,79,81};                           


//byte melody1[4][3]={ {61,57,42},  {66,62,47},{61,56,42},{64,61,42}     };  
//byte melody[15]={44,47,59,61,64,66,69,71,73,76,78,81,83,85,88};  


//byte melody1[4][3]={ {60,55,44},  {62,53,43}, {60,51,46},{61,51,46}  }; 
//byte melody1[4][3]={ {60,55,44},  {62,53,43}, {62,51,44},{62,51,46}  }; 
//byte melody1[4][3]={ {60,55,44},  {62,53,43}, {58,62,46},{67,51,46}  }; 
byte melody1[16][3]={  {60,55,44},  {62,53,43}, {62,51,44},{62,51,46},  {60,55,44},{62,53,43}, {65,55,46},{62,51,46}  , {60,55,44},  {62,53,43}, {58,62,46},{67,51,46}  , {65,51,44},  {70,58,46}, {65,62,46},{63,55,46}}; 

//byte melody[64]={63,65,67,70,72,67,70,67, 63,65,63,62,63,65,67,67, 70,65,70,75,74,75,68,67, 70,68,70,75,70,75,77,79, 82,77,79,75,79,74,79,74, 75,72,75,70,79,74,82,75 ,
//                 79,84,82,77,67,65,63,70, 75,72,77,79,82,86,84,87}; 
//byte melody[64]={60,65,67,70,67,62,63,60, 67,65,70,62,65,58,67,62, 70,67,65,62,74,75,75,72, 70,67,70,77,74,75,72,67, 82,77,79,74,63,67,77,70, 75,72,65,74,79,80,82,75,
//                 79,86,82,77,72,70,63,67, 75,72,79,74,82,72,80,75}; 
 byte melody[128]={63,65,67,70,72,67,70,67, 63,65,63,62,63,65,67,67, 70,65,70,75,74,75,68,67, 70,68,70,75,70,75,77,79, 
                   82,77,79,75,79,74,79,74, 75,72,75,70,79,74,82,75 ,79,84,82,77,67,65,63,70, 75,72,77,79,82,86,84,87,
                   60,65,67,70,67,62,63,60, 67,65,70,62,65,58,67,62, 70,67,65,62,74,75,75,72, 70,67,70,77,74,75,72,67, 
                   82,77,79,74,63,67,77,70, 75,72,65,74,79,80,82,75, 79,86,82,77,72,70,63,67, 75,72,79,74,82,72,80,75}; 
               

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

void setup(){
 TIMSK0= 0;      //タイマー0割り込み停止
 
 startMozzi(CONTROL_RATE);
 kTriggerDelay.start(100);// トリガーのタイミング指定(100ms)
 LEDdelay.start(10);
 randSeed();
// pinMode(3,INPUT_PULLUP);
 pinMode(5,INPUT_PULLUP);               //トグルスイッチ
 pinMode(6,INPUT);                      //パルス用
 pinMode(2,OUTPUT);                    //内部led用                   
 pinMode(11,OUTPUT);                   //パネルled用
 check=0;
 

}


void updateControl(){
     
 
     pin5=digitalRead(5);               //トグルスイッチ
     pulse=digitalRead(6);               //   パルス入力
     
     if(pin5==1){                       //トグルスイッチの切り替えの判断
       trigger=kTriggerDelay.ready();        //シンセに内蔵のテンポで
       }else{                                     
         if(pulse==1&&check==0){                 //パルスが来て、かつチェックが0なら
           trigger=true;                          //トリガーする
           check=1;                                  //チェックを1にして次はトリガーしないようにする
           }else{
           trigger=false;                         
             }
          if(pulse==0){                               //パルスが0ならチェックを0にして次にパルスが1になった時にトリガー出来るようにする.
           check=0;
           }   
         }
      
 
      gainF=areadGain(mozziAnalogRead(5));
      int tempo=areadTempo(mozziAnalogRead(4)); 

      char mod1=rand(8)-4;                //オシレーターの周波数を少しずらすため(-4~4の範囲で)
      char mod2=rand(8)-4;
      char mod3=rand(8)-4;
      char mod4=rand(8)-4;
      
      
      
      byte lf1=map(mozziAnalogRead(0),0,1024,80,240);;
      byte lf2=map(lf1,100,180,40,70);;

    //  byte freqrange=map(mozziAnalogRead(3),0,1024,0,7);;
     

     int ads=areadAds(mozziAnalogRead(1));
     int ads2=areadAds2(mozziAnalogRead(2));
     

     int att1=ads; 
     int de1=ads2+40;
     int sus1=ads2+10;
     int re1=ads2+40;
     

     int att2=ads; 
     int de2=ads2+20;
     int sus2=ads2;
     int re2=ads2+20;
       
  //   int ads=mozziAnalogRead(1);
  //   int ads2=mozziAnalogRead(2);
     

   //  int att1=map(ads,0,1024,5,200); 
   //  int de1=map(ads2,0,1024,10,450);
   //  int sus1=map(ads2,0,1024,10,450);
     //int re1=map(ads2,0,1024,10,450);
     

     //int att2=map(ads,0,1024,5,150); 
    // int de2=map(ads2,0,1024,5,400);
     //int sus2=map(ads2,0,1024,5,400);
    // int re2=map(ads2,0,1024,5,400);
     

  //   char ac=12;
    

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


    attackBa1=att1;                                                 //ADSRの値を設定する
   decayBa1=de1;
   sustainBa1=sus1;
   releaseBa1=re1;

   attackBa2=att2;                                                 //フィルターのADSRの値を設定する
   decayBa2=de2;
   sustainBa2=sus2;
   releaseBa2=re2;

   
   
   
   if(trigger){
         
          digitalWrite(2,HIGH);   
          digitalWrite(11,HIGH);  
              
     
    // 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( (byte)melody1[(byte)map(mozziAnalogRead(3),0,1024,0,19)][0] +12 ))  ;    //0 1 4 6
     //  triWarm2.setFreq( mtof( (byte)melody1[(byte)map(mozziAnalogRead(3),0,1024,0,19)][1] +12))  ; 
     //  triWarm3.setFreq( mtof( (byte)melody1[(byte)map(mozziAnalogRead(3),0,1024,0,19)][2] +12))  ; 
     //  triWarm4.setFreq( mtof( (byte)melody1[(byte)map(mozziAnalogRead(3),0,1024,0,19)][3] +12))  ; 

       
      
      // triWarm1.setFreq( mtof( (byte)melody[(byte)map(mozziAnalogRead(3),0,1024,0,47)] +12 ))  ;    
        triWarm1.setFreq( mtof( (byte)melody[melcount+((byte)map(mozziAnalogRead(3),0,1024,0,32)*4) ]  )+mod1 ) ;    
       
       triWarm2.setFreq( mtof( (byte)melody1[count1][0] )+mod2 )  ; 
       triWarm3.setFreq( mtof( (byte)melody1[count1][1] )+mod3 )  ; 
       triWarm4.setFreq( mtof( (byte)melody1[count1][2] )+mod4 )  ; 
     
     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になったらゼロにする 
      melcount +=1;
      if(count==11){                              // countおきに コードを変更
        count=0;
        count1 +=1;
        } 
      if(count1==16){                           // コードのカウント数
        count1=0; 
        randmel=rand(120);       
        }  

      if(melcount==5){                         // メロディーのカウント数
        melcount=0;
        }     

       kTriggerDelay.start(tempo);
       
  }    //  kTrigger if文終わり

//   freq=filt.next();
     


   lpf.setCutoffFreqAndResonance(freq, resonance); 

    digitalWrite(2,LOW); 
    digitalWrite(11,LOW);  
    
   
  
}        //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
よろしければサポートお願いします!