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