|
- #include "IZ_midi.h"
-
- void IZ_MIDIInputHandleNoteOnOffEvents(IZ_MIDIInputState* state, IZ_Action* action, PmEvent e) {
- u32 message = e.message;
- u8 status = message & 0xF0u;
- u8 channel = message & 0x0Fu;
- u8 data1 = (message >> 8) & 0xFFu;
- // u8 data2 = (message >> 16) & 0xFFu;
-
- u8 control_index;
- for (control_index = 0; control_index < CONTROLS; control_index += 1) {
- if (
- data1 == state->config.control_mapping[control_index]
- && (
- (state->config.channel < 16 && channel == state->config.channel)
- || state->config.channel >= 16
- )
- ) {
- const u16 bitflag = (0x1 << control_index);
- if (status == IZ_MIDI_NOTE_ON) {
- *action |= bitflag;
- return;
- }
- if (status == IZ_MIDI_NOTE_OFF) {
- *action &= ~bitflag;
- return;
- }
- }
- }
- }
-
- void IZ_MIDIInputHandleEvents(IZ_MIDIInputState(* state)[IZ_PLAYERS], IZ_Action(* action)[IZ_PLAYERS], PmEvent e) {
- u8 player_index;
- for (player_index = 0; player_index < IZ_PLAYERS; player_index += 1) {
- IZ_MIDIInputHandleNoteOnOffEvents(&(*state)[player_index], &(*action)[player_index], e);
- }
- }
-
- IZ_ProcedureResult IZ_MIDIInputSaveConfig(IZ_MIDIInputState(* state)[IZ_PLAYERS], const char* config_path) {
- u8 problem = 0;
-
- char control_mapping_section_name[27];
- char main_section_name[12];
-
- u8 player_index;
- u8 control_index;
- for (player_index = 0; player_index < IZ_PLAYERS; player_index += 1) {
- sprintf_s(control_mapping_section_name, 27, "MIDIInput.%d.ControlMapping", player_index);
- for (control_index = 0; control_index < CONTROLS; control_index += 1) {
- if (!ini_puts(
- control_mapping_section_name,
- ACTION_NAMES[control_index],
- IZ_MIDIGetNoteName((*state)[player_index].config.control_mapping[control_index]),
- config_path
- )) {
- problem |= (1 << player_index);
- }
- }
-
- sprintf_s(main_section_name, 12, "MIDIInput.%d", player_index);
- if (!ini_putl(
- main_section_name,
- "Channel",
- (*state)[player_index].config.channel,
- config_path
- )) {
- problem |= (1 << player_index);
- }
-
- if (!ini_putl(
- main_section_name,
- "DeviceID",
- (*state)[player_index].config.device_id,
- config_path
- )) {
- problem |= (1 << player_index);
- }
- }
-
- return problem;
- }
-
- void IZ_MIDIInputLoadConfig(IZ_MIDIInputState(* state)[IZ_PLAYERS], const char* config_path) {
- char buffer[128];
- char control_mapping_section_name[27];
- char main_section_name[12];
-
- u8 player_index;
- u8 control_index;
- for (player_index = 0; player_index < IZ_PLAYERS; player_index += 1) {
- sprintf_s(control_mapping_section_name, 27, "MIDIInput.%d.ControlMapping", player_index);
- for (control_index = 0; control_index < CONTROLS; control_index += 1) {
- ini_gets(
- control_mapping_section_name,
- ACTION_NAMES[control_index],
- IZ_MIDIGetNoteName(IZ_MIDI_INPUT_DEFAULT_STATE[player_index].config.control_mapping[control_index]),
- buffer,
- 128,
- config_path
- );
-
- (*state)[player_index].config.control_mapping[control_index] = IZ_MIDIGetNoteFromName(buffer);
- }
-
- sprintf_s(main_section_name, 12, "MIDIInput.%d", player_index);
- (*state)[player_index].config.channel = ini_getl(main_section_name, "Channel", player_index, config_path);
- (*state)[player_index].config.device_id = ini_getl(main_section_name, "DeviceID", player_index, config_path);
- }
- }
-
- IZ_ProcedureResult IZ_MIDIInputInitialize(IZ_MIDIInputState(* state)[IZ_PLAYERS], const char* config_path, u8 argc, const char* argv[]) {
- if (Pm_Initialize()) {
- return 1;
- }
-
- SDL_memcpy(state, &IZ_MIDI_INPUT_DEFAULT_STATE, sizeof(IZ_MIDIInputState));
- IZ_MIDIInputLoadConfig(state, config_path);
- if (IZ_MIDIInputSaveConfig(state, config_path)) {
- return 2;
- }
-
- u8 player_index;
- u8 midi_devices_count = Pm_CountDevices();
- u8 input_midi_devices_count = 0;
- u8 device_index;
- for (device_index = 0; device_index < midi_devices_count; device_index += 1) {
- if (!Pm_GetDeviceInfo(device_index)->output) {
- continue;
- }
-
- // midi device can output messages for the app to receive
- input_midi_devices_count += 1;
- }
-
- for (player_index = 0; player_index < input_midi_devices_count; player_index += 1) {
- if (player_index >= IZ_PLAYERS) {
- break;
- }
- (*state)[player_index].device_info = Pm_GetDeviceInfo((*state)[player_index].config.device_id);
- (*state)[player_index].stream = NULL;
- Pm_OpenInput(
- &(*state)[player_index].stream,
- (*state)[player_index].config.device_id,
- NULL,
- MIDI_EVENT_BUFFER_SIZE,
- NULL,
- NULL
- );
- }
-
- return 0;
- }
-
- void IZ_MIDIInputTeardown(IZ_MIDIInputState(* state)[IZ_PLAYERS]) {
- u8 player_index;
- for (player_index = 0; player_index < IZ_PLAYERS; player_index += 1) {
- if (!(*state)[player_index].stream) {
- continue;
- }
- Pm_Close((*state)[player_index].stream);
- }
- }
|