INT32 MIDI_Utils_OpenDevice(int direction, INT32 deviceID, MacMidiDeviceHandle** handle, int num_msgs, int num_long_msgs, size_t lm_size) { midiInit(); int err = MIDI_ERROR_NONE; MIDIEndpointRef endpoint = (MIDIEndpointRef) NULL; TRACE0("MIDI_Utils_OpenDevice\n"); (*handle) = (MacMidiDeviceHandle*) malloc(sizeof(MacMidiDeviceHandle)); if (!(*handle)) { ERROR0("ERROR: MIDI_Utils_OpenDevice: out of memory\n"); return MIDI_OUT_OF_MEMORY; } memset(*handle, 0, sizeof(MacMidiDeviceHandle)); // Create the infrastructure for MIDI in/out, and after that, // get the device's endpoint. if (direction == MIDI_IN) { // Create queue and the pthread condition variable. (*handle)->h.queue = MIDI_CreateQueue(num_msgs); (*handle)->h.platformData = MIDI_CreateConditionVariable(); if (!(*handle)->h.queue || !(*handle)->h.platformData) { ERROR0("< ERROR: MIDI_IN_OpenDevice: could not create queue or condition variable\n"); free(*handle); (*handle) = NULL; return MIDI_OUT_OF_MEMORY; } endpoint = MIDIGetSource(deviceID); (*handle)->port = inPort; } else if (direction == MIDI_OUT) { endpoint = MIDIGetDestination(deviceID); (*handle)->port = outPort; } if (!endpoint) { // An error occurred. free(*handle); return MIDI_INVALID_DEVICEID; } (*handle)->h.deviceHandle = (void*) (intptr_t) endpoint; (*handle)->h.startTime = getCurrentTimeInNanos(); (*handle)->direction = direction; (*handle)->deviceID = deviceID; TRACE0("MIDI_Utils_OpenDevice: succeeded\n"); return err; }
int main(void) { //init the byte count cnt = 0; //PORTB is an output.. displays number of bytes received DDRB = 0xFF; PORTB = ~cnt; //init midi, give the clock rate setting, indicate that we want both input //and output set up midiInit(MIDI_CLOCK_RATE, true, true); //enable interrupts sei(); //busy loop, we're just echoing in the interrupt while(1); return 0; }
EXPORT(sqInt) initialiseModule(void) { return midiInit(); }
int main() { // INT_IE |= ( 1 << 13 ); // cart-remove-interrupt (handled by crt0) // CST_ROM0_1ST_3WAIT | CST_ROM0_2ND_1WAIT | CST_PREFETCH_ENABLE // REG_WSCNT = ( 5 << 2 ) | ( 1 << 14 ); // set rom-timing irqInit(); irqSet( IRQ_TIMER1, kradInterrupt ); irqEnable( IRQ_TIMER1 ); // midi setup irqSet( IRQ_TIMER3, midiInterrupt ); irqEnable( IRQ_TIMER3 ); midiInit(); REG_IME = 1; SetMode( MODE_0 | BG1_ON ); // starting SetBG(10, 10, 0); // create the globals object globals = new GlobalData(); // starting SetBG(0, 10, 10); globals->LoadSongs(); // starting SetBG(10, 0, 10); u16 i = 0; Keys *keys = new Keys(); First *firstpage = new First(keys); Page *selected = firstpage; // init krawall kragInit( KRAG_INIT_STEREO ); // make it so we can see the background REG_BG1CNT = BIT(7) | BIT(8) | BIT(9) | BIT(10) | BIT(11) | BIT(12); // high priority, 256 colour, point the banks at the right place etc // load the splash screen DMA3COPY((void*)splash_tiles, (u16*)VideoBuffer, SPLASH_TILESIZE | DMA16 | DMA_IMMEDIATE | DMA_SRC_INC | DMA_DST_INC); DMA3COPY((void*)splash_palette, (u16*)&BG_PALETTE[5], SPLASH_PALSIZE | DMA16 | DMA_IMMEDIATE | DMA_SRC_INC | DMA_DST_INC); DMA3COPY((void*)splash_map, (u16*)&VideoBuffer[0x7C00], 640 | DMA16 | DMA_IMMEDIATE | DMA_SRC_INC | DMA_DST_INC); // check keys while (keys->TestKey(keyA) != pressed) { keys->Jiffie(); } keys->Jiffie(); // load the krawall splash screen DMA3COPY((void*)krawall_splash_tiles, (u16*)VideoBuffer, KRAWALL_SPLASH_TILESIZE| DMA16 | DMA_IMMEDIATE | DMA_SRC_INC | DMA_DST_INC); DMA3COPY((void*)krawall_splash_palette, (u16*)&BG_PALETTE[5], KRAWALL_SPLASH_PALSIZE | DMA16 | DMA_IMMEDIATE | DMA_SRC_INC | DMA_DST_INC); DMA3COPY((void*)krawall_splash_map, (u16*)&VideoBuffer[0x7C00], 640 | DMA16 | DMA_IMMEDIATE | DMA_SRC_INC | DMA_DST_INC); // check keys while (keys->TestKey(keyA) != pressed) { keys->Jiffie(); } keys->Jiffie(); // load charset into memory as a demo tileset DMA3COPY((void*)font::tiles, (u16*)VideoBuffer, 3232 | DMA16 | DMA_IMMEDIATE | DMA_SRC_INC | DMA_DST_INC); DMA3COPY((void*)font::tiles_color, (u16*)&VideoBuffer[3232], 3232 | DMA16 | DMA_IMMEDIATE | DMA_SRC_INC | DMA_DST_INC); // set up the background palette for (i=0;i<7;i++) BG_PALETTE[i] = RGB(0, 0, 0); // this starts from 7 becuase the kludgy legacy converter used a 7-color offset (for parallax-starfield reasons) BG_PALETTE[7] = RGB(0x1F, 0x1F, 0x1F); BG_PALETTE[8] = RGB(0, 0, 0); // set the H and V offset of our background to zero // REG_BG1HOFS = 0; // REG_BG1VOFS = 0; // clear out the whole area BlankScreen(); while (1) { // this is zerosync SetBG(0, 0, 10); // figure out all our latest song positions globals->Tick(); // calculate audio stuff kramWorker(); // update midi progression midiUpdateBeat(globals->beat); // check keys keys->Jiffie(); // automatically cascades all pages and processes them firstpage->Process(); SetBG(0, 0, 0); // this is vsync //while( !REG_VCOUNT ); //while( REG_VCOUNT ); // try and fit the drawing stuff into the off-screen sync while(REG_VCOUNT != 160); SetBG(10, 0, 0); // do all the display shit in here BlankScreen(); selected = selected->Cycle(); selected->Draw(); SetBG(0, 0, 0); } return 1; }