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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
EXPORT(sqInt) initialiseModule(void) {
	return midiInit();
}
Beispiel #4
0
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;
}