void tempoSet(int tempo ) { struct midiHead *mh; struct midiTrack *mt; char buffer[256]; int i; int ticks = 60000000 / tempo; printf("Set ticks to 0x%08x\n", ticks ); mh = (struct midiHead *)&buffer[0]; mt = (struct midiTrack *)&buffer[14]; sprintf(mh->chunkID, "MThd" ); mh->size = 6; mh->format = 0; mh->tracks = 1; mh->time = 24; // 24 ticks per qtr note sprintf(mt->chunkID, "MTrk" ); mh->size = 6; buffer[22] = 0xff; buffer[23] = 0x51; buffer[24] = 0x03; buffer[25] = ( ticks & 0xFF0000 ) >> 16; buffer[26] = ( ticks & 0xFF00 ) >> 8; buffer[27] = ( ticks & 0xFF ); send_sequence(buffer, 28 ); }
void set_sr16_song(int song ) { char buffer[8]; code = ( song << 1 ) | ab; buffer[0] = 0xB6; buffer[1] = 0xF3; // Song Request buffer[2] = code; send_sequence(buffer, 3 ); }
void set_sr16_pattern(int pattern, int ab ) { int code; // Bits 7-1 are the "Preset Rhythm Programs" and Bit 0 represents A or B char buffer[8]; code = ( song << 1 ) | ab; buffer[0] = 0xB6; buffer[1] = 0xF3; // Song Request buffer[2] = code; send_sequence(buffer, 3 ); }
int main(int argc, char **argv) { int r, g, b; // parse arguments if (!parse_arguments(argc, argv, &r, &g, &b)) return -1; // Set up gpi pointer for direct register access setup_io(); // calibrate our timers calibrate(1000000); // Set GPIO pin 4 to output INP_GPIO(4); // must use INP_GPIO before we can use OUT_GPIO OUT_GPIO(4); decode_sequence(r, g, b); send_sequence(); return 0; } // main