diff --git a/midi.c b/midi.c index 5c29725..3dd86fe 100644 --- a/midi.c +++ b/midi.c @@ -230,58 +230,59 @@ JSC_CCALL(midi_parse, tml_get_info(midi, NULL, NULL, &total_notes, NULL, &time_length); // Create result object - JSValue result = JS_NewObject(js); - JS_SetPropertyStr(js, result, "duration_ms", JS_NewInt32(js, time_length)); - JS_SetPropertyStr(js, result, "note_count", JS_NewInt32(js, total_notes)); - + JS_FRAME(js); + JS_ROOT(result, JS_NewObject(js)); + JS_SetPropertyStr(js, result.val, "duration_ms", JS_NewInt32(js, time_length)); + JS_SetPropertyStr(js, result.val, "note_count", JS_NewInt32(js, total_notes)); + // Build events array - JSValue events = JS_NewArray(js); + JS_ROOT(events, JS_NewArray(js)); int idx = 0; - + for (tml_message *msg = midi; msg; msg = msg->next) { - JSValue evt = JS_NewObject(js); - JS_SetPropertyStr(js, evt, "time", JS_NewInt32(js, msg->time)); - JS_SetPropertyStr(js, evt, "channel", JS_NewInt32(js, msg->channel)); - + JS_ROOT(evt, JS_NewObject(js)); + JS_SetPropertyStr(js, evt.val, "time", JS_NewInt32(js, msg->time)); + JS_SetPropertyStr(js, evt.val, "channel", JS_NewInt32(js, msg->channel)); + switch (msg->type) { case TML_NOTE_ON: - JS_SetPropertyStr(js, evt, "type", JS_NewString(js, "note_on")); - JS_SetPropertyStr(js, evt, "key", JS_NewInt32(js, msg->key)); - JS_SetPropertyStr(js, evt, "velocity", JS_NewInt32(js, msg->velocity)); + JS_SetPropertyStr(js, evt.val, "type", JS_NewString(js, "note_on")); + JS_SetPropertyStr(js, evt.val, "key", JS_NewInt32(js, msg->key)); + JS_SetPropertyStr(js, evt.val, "velocity", JS_NewInt32(js, msg->velocity)); break; case TML_NOTE_OFF: - JS_SetPropertyStr(js, evt, "type", JS_NewString(js, "note_off")); - JS_SetPropertyStr(js, evt, "key", JS_NewInt32(js, msg->key)); + JS_SetPropertyStr(js, evt.val, "type", JS_NewString(js, "note_off")); + JS_SetPropertyStr(js, evt.val, "key", JS_NewInt32(js, msg->key)); break; case TML_CONTROL_CHANGE: - JS_SetPropertyStr(js, evt, "type", JS_NewString(js, "control")); - JS_SetPropertyStr(js, evt, "control", JS_NewInt32(js, msg->control)); - JS_SetPropertyStr(js, evt, "value", JS_NewInt32(js, msg->control_value)); + JS_SetPropertyStr(js, evt.val, "type", JS_NewString(js, "control")); + JS_SetPropertyStr(js, evt.val, "control", JS_NewInt32(js, msg->control)); + JS_SetPropertyStr(js, evt.val, "value", JS_NewInt32(js, msg->control_value)); break; case TML_PROGRAM_CHANGE: - JS_SetPropertyStr(js, evt, "type", JS_NewString(js, "program")); - JS_SetPropertyStr(js, evt, "program", JS_NewInt32(js, msg->program)); + JS_SetPropertyStr(js, evt.val, "type", JS_NewString(js, "program")); + JS_SetPropertyStr(js, evt.val, "program", JS_NewInt32(js, msg->program)); break; case TML_PITCH_BEND: - JS_SetPropertyStr(js, evt, "type", JS_NewString(js, "pitch_bend")); - JS_SetPropertyStr(js, evt, "pitch_bend", JS_NewInt32(js, msg->pitch_bend)); + JS_SetPropertyStr(js, evt.val, "type", JS_NewString(js, "pitch_bend")); + JS_SetPropertyStr(js, evt.val, "pitch_bend", JS_NewInt32(js, msg->pitch_bend)); break; case TML_SET_TEMPO: - JS_SetPropertyStr(js, evt, "type", JS_NewString(js, "tempo")); - JS_SetPropertyStr(js, evt, "tempo", JS_NewInt32(js, tml_get_tempo_value(msg))); + JS_SetPropertyStr(js, evt.val, "type", JS_NewString(js, "tempo")); + JS_SetPropertyStr(js, evt.val, "tempo", JS_NewInt32(js, tml_get_tempo_value(msg))); break; default: - JS_FreeValue(js, evt); continue; } - - JS_SetPropertyNumber(js, events, idx++, evt); + + JS_SetPropertyNumber(js, events.val, idx++, evt.val); } - - JS_SetPropertyStr(js, result, "events", events); - + + JS_SetPropertyStr(js, result.val, "events", events.val); + tml_free(midi); - return result; + JS_RestoreFrame(_js_ctx, _js_gc_frame, _js_local_frame); + ret = result.val; ) // ============================================================================ @@ -310,13 +311,14 @@ static const JSCFunctionListEntry js_midi_funcs[] = { }; CELL_USE_INIT( - JSValue midi = JS_NewObject(js); - JS_SetPropertyFunctionList(js, midi, js_midi_funcs, sizeof(js_midi_funcs)/sizeof(js_midi_funcs[0])); - - JSValue soundfont = JS_NewObject(js); - JS_SetPropertyFunctionList(js, soundfont, js_soundfont_funcs, sizeof(js_soundfont_funcs)/sizeof(js_soundfont_funcs[0])); - - JS_SetPropertyStr(js, midi, "soundfont", soundfont); - - return midi; + JS_FRAME(js); + JS_ROOT(midi, JS_NewObject(js)); + JS_SetPropertyFunctionList(js, midi.val, js_midi_funcs, sizeof(js_midi_funcs)/sizeof(js_midi_funcs[0])); + + JS_ROOT(soundfont, JS_NewObject(js)); + JS_SetPropertyFunctionList(js, soundfont.val, js_soundfont_funcs, sizeof(js_soundfont_funcs)/sizeof(js_soundfont_funcs[0])); + + JS_SetPropertyStr(js, midi.val, "soundfont", soundfont.val); + + JS_RETURN(midi.val); )