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