DEBUG版。シリアルコンソールにボタンの押下状態がダンプされます。
setupルーチンのコメントをはずして、Serial通信をしてる箇所をはずすと
Digital3から音が鳴るようになります
接続
|OUT|9| load/shift
|IN|12| DATA
|OUT|13| CLK
接続をAVRのSPIと一緒にしているので、たぶんハードウェアSPIでも動作します(そのほうが早いはず)
下記ソースコードはソフトウェアでクロックを操作しています。
音源のソースコードと、キースキャンのコードが混ざっているので、キースキャンしたいだけであれば、setupとloop以外の関数や宣言は消してしまって問題ないです
>> code cpp
// written by @ina_ani
// MIT License
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
volatile unsigned int tones[]= {
NOTE_C3,NOTE_CS3,
NOTE_D3,NOTE_DS3,
NOTE_E3,
NOTE_F3,NOTE_FS3,
NOTE_G3,NOTE_GS3,
NOTE_A3,NOTE_AS3,
NOTE_B3,
NOTE_C4,NOTE_CS4,
NOTE_D4,NOTE_DS4,
NOTE_E4,
NOTE_F4,NOTE_FS4,
NOTE_G4,NOTE_GS4,
NOTE_A4,NOTE_AS4,
NOTE_B4,
NOTE_C5,NOTE_CS5,
NOTE_D5,NOTE_DS5,
NOTE_E5,
NOTE_F5,NOTE_FS5,
NOTE_G5,NOTE_GS5,
NOTE_A5,NOTE_AS5,
NOTE_B5
};
volatile char magic[] = {
0 , 2, 4, 5, 7, 9,11,
12,14,16,17,19,21,23,
24,26,28,29,31,33,35
};
// =========================================-
// wave table
byte wave[16][32];
const unsigned int timerLoadValue = 220;//50;//220;
volatile unsigned char level = 0;
volatile unsigned int d[5] = {552<<3,173<<3,204<<3,346<<3,552<<3}; // default value( for debug)
volatile unsigned int dn[5] = {0,0,0,0,0}; // work variable
volatile unsigned char vol[5] = {0,0,0,0,0}; // volume par channel
volatile unsigned char bend = 0;
ISR(TIMER2_OVF_vect) { // Timer/Counter2 Overflow
TCNT2 = timerLoadValue; // Reset the timer
dn[0] = dn[0] + d[0] + bend;
dn[1] = dn[1] + d[1] + bend;
dn[2] = dn[2] + d[2] + bend;
dn[3] = dn[3] + d[3] + bend;
dn[4] = dn[4] + d[4] + bend;
/*
level = ((dn[0]&(1<<14))?vol[0]:0) +
((dn[1]&(1<<14))?vol[1]:0) +
((dn[2]&(1<<14))?vol[2]:0) +
((dn[3]&(1<<14))?vol[3]:0) +
((dn[4]&(1<<14))?vol[4]:0);
*/
// wave table (slow)
level = wave[vol[0]][dn[0]>>11] +
wave[vol[1]][dn[1]>>11] +
wave[vol[2]][dn[2]>>11] +
wave[vol[3]][dn[3]>>11] +
wave[vol[4]][dn[4]>>11]
;
OCR2B = level;
}
// =========================================-
inline int getTone(byte no){
return (tones[magic[no]]) << 2;
}
void setup() {
pinMode(3,OUTPUT);
/*
// 3-pwm ,pwm
TCCR2A = _BV(COM2B1)| _BV(WGM20);
// clk/1 prescale
TCCR2B = _BV(CS20); //1 31250
//TCCR2B = _BV(CS21); //8 3906.25
//1<<CS22 | 0<<CS21 | 1<<CS20; // clk/128 prescale
//TCCR2B = TCCR2B & 0b11100000 | 0b00001; // pwm: 31250Hz
TIMSK2 = 1<<TOIE2; // Timer/Counter2 Overflow Interrupt Enable
OCR2B = 80; // for debug
TCNT2 = timerLoadValue;
*/
vol[0] = vol[1] = vol[2] = vol[3] = vol[4] = 0;
d[0] = d[1] = d[2] = d[3] = d[4] = 0;
for(byte i=0;i < 16; i++){
for(byte j=0;j < 8; j++){
//wave[i][j] = i*j/8; // i : vol, j : t
wave[i][j] = 2* i * ((j & 0B100)?8:0) /16;
//wave[i][j] = i*((sin(j*2*3.14/16)+1)/2 * 8)/16;
}
}
pinMode(9, OUTPUT); // load/shift
pinMode(12, INPUT);// DATA
pinMode(13, OUTPUT);// CLK
Serial.begin(9600);
}
// the loop routine runs over and over again forever:
void loop() {
digitalWrite(9, HIGH);
Serial.println("HELLO");
digitalWrite(9, LOW);
for(int i = 0; i < 16; i ++){
digitalWrite(13,HIGH);
digitalWrite(13,LOW);
}
digitalWrite(9, HIGH);
char key = -1;
for(int i = 0; i < 16; i ++){
Serial.print(i);
Serial.print(" ");
if(digitalRead(12)){
Serial.println("H");
key = i;
}else{
Serial.println("L");
}
digitalWrite(13,HIGH);
//delay(100);
digitalWrite(13,LOW);
}
switch(key){
case 0: d[0] = getTone(0); vol[0] = 12; break;
case 1: d[0] = getTone(1); vol[0] = 12; break;
case 2: d[0] = getTone(2); vol[0] = 12; break;
case 3: d[0] = getTone(3); vol[0] = 12; break;
default: vol[0] = 0; break;
}
delay(1000);
}
<<5643382
wiki
1417328798