lewispoiuylyu-shao-hsu
Published © GPL3+

Senbon Zakura (團長超大聲)

A tempo game with Senbon Zakura.

IntermediateShowcase (no instructions)5,199
Senbon Zakura (團長超大聲)

Things used in this project

Story

Read more

Code

Final

Arduino
#include <Tone.h>

// 接 74HC595 的第 12 支接腳
int latchPin = 9;
// 接 74HC595 的第 11 支接腳
int clockPin = 8;
// 接 74HC595 的第 14 支接腳
int dataPin = 10;
const int buzzer = 7;
const int sym = 6;
const int btn = 5;
const int Rbtn = 4;
Tone freq1;
Tone freq2;

void setup() {
  Serial.begin(250000);
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(btn,INPUT);
  pinMode(Rbtn,INPUT);
  freq1.begin(buzzer);
  freq2.begin(sym);
}
const int toneTable[]={
  131,
  147,
  165,
  175,
  196,
  220,
  247,
  0,
  264,
  294,
  330,
  349,
  392,
  440,
  494,
  0,
  524,
  588,
  660,
  698,
  784,
  880,
  932
};
char toneName[]="cdefgabNCDEFGAB";

char MainTone[]="NNNNNNNNNNNNNNNCCCCbbbbaaaagggNggaaeeddeeeeeeeNeeggaaaaDDDDbbbbCCCCbbggaaaaaaaaCCCCbbbbaaaagggNggaaeeddeeeNeeggaNaaaNaaCCCCDDDDbbbbbbbbbbbNaaCCDDNDDNENEEEEENEEGGAAEEDDEEEEaaCCDDNDDNENEEEEENEEFFEEDDCNCCCCaaCCDDNDDNENEEEEENEEGGAAEEDDEEEEaaCCFFFFEEEEDDDDCCCCDDEEbbggaaaNaaCCDDNDDDENEEEEENEEGGAAEEDDEEEEaaCCDDNDDNENEEEEENEEFFEEDDCNCCCCaaCCDDNDDNENEEEEENEEGGAAEEDDEEEEaaCCFFFFEEEEDDDDCCCCDDCCEEGGAAAAAAAA";

char  SymTone[]="NNNNNNNNNNNNNNNffNNffNNffNNffNNCCNNCCNNCCNNCCNNffNNffNNggNNggNNaNaaggaaDDCCbbfNffNNffNNffNNffNNCCNNCCNNCCNNCCNNDNDNNNDNDNNNEEDDEENNENEENNNNNNNNaaNgaagNfNffCCffggDDGGDDccggCCggaaNgaagNfNffCCffggDDGGDDccggCCggaaNgaagNfNffCCffggDDGGDDccggCCggffNfffFNeebbEEbbffFFggGGaNagaaCCaaNgaagNfNffCCffggDDGGDDccggCCggaaNgaagNfNffCCffggDDGGDDccggCCggaaNgaagNfNffCCffggDDGGDDccggCCggffNfNfFNeebbEEbbffFFggGGaaNNaaaa";

int getTone(char symbol,int pos) {
    int toneNo = 0;
    for ( int ii=0; ii<15; ii++ ) {
        if ( toneName[ii]==symbol ) {
            toneNo = ii;
            break;
        }
    }
    return toneNo+pos;
}

uint8_t L[] = {1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

uint8_t R[] = {1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

byte sevenNumber [] = {
  254,//0
  48,//1
  109,//2
  121,//3
  51,//4
  91,//5
  95,//6
  114,//7
  255,//8
  123,//9
  0,//NULL
};
int number;
int SevenCounter = 0;
int MusicCounter = 0;
int PlayCounter = 0;
int TempleCounter = 0;
int BtnCounter = -50;
int numberTen;
int numberZero;
const int Musicdelay = 100;
int MaintoneNo, SymtoneNo;
bool trigger = false;
bool Rtrigger = false;
uint16_t Ldis = 0;
uint16_t Rdis = 0;

void loop() 
{ 
  int score = 0;  

  for(int i=0;i<sizeof(L)*Musicdelay;i++){    
    if(PlayCounter == sizeof(L)) PlayCounter = 0;
    if(PlayCounter == 0) score = 0;
    if(MusicCounter < Musicdelay){
      MusicCounter++;
    }
    else if(MusicCounter == Musicdelay){
      
        Ldis = Ldis << 1;
        Rdis = Rdis << 1;
        Ldis += L[PlayCounter];
        Rdis += R[PlayCounter];
        number = score;
        if(SevenCounter <10){
          numberTen =10;
          numberZero = score/100;
        }
        else if(SevenCounter <40){
          numberTen = (number-100*(score/100))/10;
          numberZero = number-10*(score/10);
        }
        else if(SevenCounter == 40){
          SevenCounter = -1;
        }
        SevenCounter++;
        MaintoneNo = getTone(MainTone[PlayCounter],8);
        SymtoneNo = getTone(SymTone[PlayCounter],0);
        freq1.play(toneTable[MaintoneNo]);
        freq2.play(toneTable[SymtoneNo]);
        
        // 送資料前要先把 latchPin 拉成低電位
        digitalWrite(latchPin, LOW);
        shiftOut(dataPin, clockPin, LSBFIRST, (~sevenNumber[numberZero])); 
        shiftOut(dataPin, clockPin, LSBFIRST, (~sevenNumber[numberTen]));       
        shiftOut(dataPin, clockPin, LSBFIRST, lowByte(Rdis)); 
        shiftOut(dataPin, clockPin, LSBFIRST, highByte(Rdis)); 
        shiftOut(dataPin, clockPin, LSBFIRST, lowByte(Ldis)); 
        shiftOut(dataPin, clockPin, LSBFIRST, highByte(Ldis)); 
        // 送出第一位元組給最近的 74HC595 
        // 送完資料後要把 latchPin 拉回成高電位
        digitalWrite(latchPin, HIGH);
        MusicCounter = 1;
        PlayCounter++;
    }
  int switchStatus = digitalRead(btn);
  int RswitchStatus = digitalRead(Rbtn);
  
  if(TempleCounter == sizeof(L)) TempleCounter = 0;
  if(BtnCounter<Musicdelay){
      if(switchStatus==1){
        trigger = true;
      }
      else {
        trigger = trigger;
      }
      if(RswitchStatus==1){
        Rtrigger = true;
      }
      else {
        Rtrigger = Rtrigger;
      }
      BtnCounter++;
   }
   else if(BtnCounter == Musicdelay){      
      if(Ldis/32768==1){
        if(trigger) score++;
        else score--;
    }
    else{
      score = score;
    }
    if(Rdis/32768==1){
        if(Rtrigger) score++;
        else score--;
    }
    else{
        score = score;
    }
    if(score < 0) score = 0;
      TempleCounter++;
      BtnCounter = 1;
      trigger = false;
      Rtrigger = false;
    }
    delay(1);
  }
}

Credits

lewispoiuy

lewispoiuy

0 projects • 0 followers
lyu-shao-hsu

lyu-shao-hsu

0 projects • 0 followers

Comments