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