void timeHnd(void){ u8 tr,doTimer; timer_int(0); timer_enable(0); timer_clearstat(); for(tr=0; tr<NUM_TRACKS; tr++){ if(trackTable[tr].play == 0) continue; if(trackTable[tr].data[trackTable[tr].currNote].tickPosition == musicTick && trackTable[tr].data[trackTable[tr].currNote].onoff == 0x09){//Start note while(trackTable[tr].data[trackTable[tr].currNote+1].tickPosition == musicTick && //Look for the last note in a cord and play that one. trackTable[tr].data[trackTable[tr].currNote+1].onoff == 0x09) trackTable[tr].currNote++; SND_REGS[tr].SxFQH=(FREQUENCY[trackTable[tr].data[trackTable[tr].currNote].note]>>8) & 0xFF; SND_REGS[tr].SxFQL=FREQUENCY[trackTable[tr].data[trackTable[tr].currNote].note] & 0xFF; SND_REGS[tr].SxLRV=trackTable[tr].volume; SND_REGS[tr].SxRAM = tr; trackTable[tr].offNote = 0; SND_REGS[tr].SxINT = 0x9F; } /*some midi's don't have off notes so this sets a max length for a given note*/ trackTable[tr].offNote++; if(trackTable[tr].offNote > MAX_NOTE_LENGTH){ SND_REGS[tr].SxINT = 0x00; } while(trackTable[tr].data[trackTable[tr].currNote].tickPosition <= musicTick && trackTable[tr].data[trackTable[tr].currNote].tickPosition != 0xFFFFFFFF){ trackTable[tr].currNote++; } if(trackTable[tr].data[trackTable[tr].currNote].tickPosition == 0xFFFFFFFF){ trackTable[tr].play = 0; trackTable[tr].currNote = 0; SND_REGS[tr].SxINT=0; } } musicTick++; doTimer = 0x00; for(tr=0; tr<NUM_TRACKS; tr++){ if(trackTable[tr].play == 1) doTimer = 0x01; } if(doTimer){ timer_int(1); timer_enable(1); } }
void DoSound(u16 timerCount){ u8 i; for(i=0; i<NUM_TRACKS; i++){ trackTable[i].currNote = 0; } musicTick = 0; timer_freq(1); timer_set(timerCount); timer_enable(1); timer_int(1); HW_REGS[BKCOL] = ~HW_REGS[BKCOL]; }
void conf_timers(void){ TCNT0=0; TCNT1=0; OCR0A=LINE_LIMIT; OCR1A=COLUMN_LIMIT; TCCR0A|=1<<WGM01; TCCR0B|=1<<CS02; TCCR0B|=1<<CS00; TCCR1B|=1<<WGM12; TCCR1B|=1<<CS12; TCCR1B|=1<<CS10; TIFR0=0; TIFR1=0; timer_int(1); }