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();
}
いいなと思ったら応援しよう!
よろしければサポートお願いします!