Header Ads

Arduinoとmozziでスピーカーから和音を出す実験



mozziというライブラリを使ってスピーカーから和音を出していく実験です。

1.) Mozziからダウンロードしてライブラリに追加します。
2.) 注意点:

☆ 音を出すピンが決まっている。
  • Arduino Uno …9
  • Arduino Nano …9
  • Arduino Pro Mini …9
  • Arduino Leonardo …9
  • Arduino Mega …11
詳しくは本家サイト


☆コードが違う
  • analogReadは、mozziAnalogReadに置き換わる
  • analogWriteは、使えない(代わりにdigitalWriteで自作する)
  • digitalReadも、INPUT_PULUPでは使えない(代わりに、mozziAnalogReadをつかう)

構成


スピーカー:デジタル9番、GND
Keypad:
 OUT→アナログ0番
 VCC→5V
 GND→GND

動作の様子


コード

#define B0 31
#define C1 33
#define CS1 35
#define D1 37
#define DS1 39
#define E1 41
#define F1 44
#define FS1 46
#define G1 49
#define GS1 52
#define A1 55
#define AS1 58
#define B1 62
#define C2 65
#define CS2 69
#define D2 73
#define DS2 78
#define E2 82
#define F2 87
#define FS2 93
#define G2 98
#define GS2 104
#define A2 110
#define AS2 117
#define B2 123
#define C3 131
#define CS3 139
#define D3 147
#define DS3 156
#define E3 165
#define F3 175
#define FS3 185
#define G3 196
#define GS3 208
#define A3 220
#define AS3 233
#define B3 247
#define C4 262
#define CS4 277
#define D4 294
#define DS4 311
#define E4 330
#define F4 349
#define FS4 370
#define G4 392
#define GS4 415
#define A4 440
#define AS4 466
#define B4 494
#define C5 523
#define CS5 554
#define D5 587
#define DS5 622
#define E5 659
#define F5 698
#define FS5 740
#define G5 784
#define GS5 831
#define A5 880
#define AS5 932
#define B5 988
#define C6 1047
#define CS6 1109
#define D6 1175
#define DS6 1245
#define E6 1319
#define F6 1397
#define FS6 1480
#define G6 1568
#define GS6 1661
#define A6 1760
#define AS6 1865
#define B6 1976
#define C7 2093
#define CS7 2217
#define D7 2349
#define DS7 2489
#define E7 2637
#define F7 2794
#define FS7 2960
#define G7 3136
#define GS7 3322
#define A7 3520
#define AS7 3729
#define B7 3951
#define C8 4186
#define CS8 4435
#define D8 4699
#define DS8 4978
#include <MozziGuts.h>
#include <Oscil.h>
#include <tables/sin1024_int8.h>
Oscil <SIN1024_NUM_CELLS, AUDIO_RATE> aSin(SIN1024_DATA);
Oscil <SIN1024_NUM_CELLS, AUDIO_RATE> bSin(SIN1024_DATA);
Oscil <SIN1024_NUM_CELLS, AUDIO_RATE> cSin(SIN1024_DATA);
#define CONTROL_RATE 64
int gain_aSin;
int gain_bSin;
int gain_cSin;
int pitch_aSin;
int pitch_bSin;
int pitch_cSin;
int KeyPad;
void SetKeyPad() {
if (mozziAnalogRead(A0) < 100) {
KeyPad = 1;
} else if (mozziAnalogRead(A0) < 200) {
KeyPad = 2;
} else if (mozziAnalogRead(A0) < 400) {
KeyPad = 3;
} else if (mozziAnalogRead(A0) < 600) {
KeyPad = 4;
} else if (mozziAnalogRead(A0) < 800) {
KeyPad = 5;
} else {
KeyPad = 0;
}
}
void setup(){
startMozzi(CONTROL_RATE);
KeyPad = 0;
}
void updateControl(){
SetKeyPad();
int X,Y,Z;
if( KeyPad == 1){
X = D4;
Y = E4;
Z = G4;
}else if(KeyPad == 2){
X = E4;
Y = G4;
Z = B4;
}else if(KeyPad == 3){
X = F4;
Y = A4;
Z = C5;
}else if(KeyPad == 4){
X = G4;
Y = B4;
Z = D5;
}else if(KeyPad == 5){
X = A4;
Y = C4;
Z = E4;
} else {
X = 0.0f;
Y = 0.0f;
Z = 0.0f;
}
aSin.setFreq(X);
bSin.setFreq(Y);
cSin.setFreq(Z);
gain_aSin = 255;
gain_bSin = 255;
gain_cSin = 255;
gain_aSin*=0.9;
gain_bSin*=0.9;
gain_cSin*=0.9;
}
//音を出力する
int updateAudio(){
//2つ足したら2でわる(割らなければ数値がオーバーするのでノイズになる)
return (((aSin.next()*gain_aSin)>>8) + ((bSin.next()*gain_bSin)>>8) + ((cSin.next()*gain_cSin)>>8))/3;
}
void loop(){
audioHook();
}




Powered by Blogger.