MIDI é Interface Digital de Intrumentos Musicais, e permite instrumentos musicais eletronicos, computadores, e outros equipamentos comunicar, controlar e sincronizar entre si. Fluxus pode receber controles e mensagens de notas MIDI. Example: (display (midi-info))(newline) (midi-init 1) (define (midi-test) (with-state (scale (vector (+ 1 (midi-ccn 0 1)) (+ 1 (midi-ccn 0 2)) (+ 1 (midi-ccn 0 3)))) (draw-cube))) (every-frame (midi-test)) EndSectionDoc StartFunctionDoc-en midi-info Returns: a list of two lists of (midi-port-number . midi-port-name-string) pairs Description: Returns information about the available MIDI input and output ports. Example: (midi-info) EndFunctionDoc StartFunctionDoc-pt midi-info Retorna: uma lista de (numero-porta-mide . string-nome-porta-midi) pares. Descrição: Retorna informação sobre portas de entrada MIDI disponíveis.
(midi-info) EndFunctionDoc Scheme_Object *midi_info(int argc, Scheme_Object **argv) { Scheme_Object *ret = NULL; input ports if (midilistener == NULL) { midilistener = new MIDIListener(); } vector<string> port_names = midilistener->info(); int port_count = port_names.size(); Scheme_Object **a = (Scheme_Object **)scheme_malloc(port_count * sizeof(Scheme_Object *)); for (int i = 0; i < port_count; i++) { Scheme_Object *port_num = NULL; Scheme_Object *port_name = NULL; MZ_GC_DECL_REG(2); MZ_GC_VAR_IN_REG(0,port_num); MZ_GC_VAR_IN_REG(1,port_name); MZ_GC_REG(); port_num = scheme_make_integer(i); port_name = scheme_make_symbol(port_names[i].c_str()); a[i] = scheme_make_pair(port_num, port_name); MZ_GC_UNREG(); } Scheme_Object *input_ports = scheme_build_list(port_count, a); output ports if (midiout == NULL) { midiout = new MIDIOut(); } port_names = midiout->info(); port_count = port_names.size(); Scheme_Object **b = (Scheme_Object **)scheme_malloc(port_count * sizeof(Scheme_Object *)); for (int i = 0; i < port_count; i++) { Scheme_Object *port_num = NULL; Scheme_Object *port_name = NULL; MZ_GC_DECL_REG(2); MZ_GC_VAR_IN_REG(0,port_num); MZ_GC_VAR_IN_REG(1,port_name); MZ_GC_REG(); port_num = scheme_make_integer(i); port_name = scheme_make_symbol(port_names[i].c_str()); b[i] = scheme_make_pair(port_num, port_name); MZ_GC_UNREG(); } Scheme_Object *output_ports = scheme_build_list(port_count, b); combine the two lists ret = scheme_make_pair(input_ports, scheme_make_pair(output_ports, scheme_null)); return ret; } StartFunctionDoc-en midiin-open port-number Returns: void Description: Opens the specified MIDI input port. Example: (midiin-open 1) EndFunctionDoc StartFunctionDoc-pt midiin-open número-porta Retorna: void Descrição: Abre a porta de entrada MIDI especificada. Exemplo: (midiin-open 1) EndFunctionDoc Scheme_Object *midiin_open(int argc, Scheme_Object **argv) { MZ_GC_DECL_REG(1); MZ_GC_VAR_IN_REG(0,argv); MZ_GC_REG(); if (!SCHEME_NUMBERP(argv[0])) scheme_wrong_type("midiin-open", "number", 0, argc, argv); int port = (int)scheme_real_to_double(argv[0]); if (!midilistener) { midilistener = new MIDIListener(port); } else { midilistener->close(); midilistener->open(port); } MZ_GC_UNREG(); return scheme_void; } StartFunctionDoc-en midiout-open port-number Returns: void Description: Opens the specified MIDI output port. Example: (midiout-open 1) EndFunctionDoc Scheme_Object *midiout_open(int argc, Scheme_Object **argv) { MZ_GC_DECL_REG(1); MZ_GC_VAR_IN_REG(0,argv); MZ_GC_REG(); if (!SCHEME_NUMBERP(argv[0])) scheme_wrong_type("midiout-open", "number", 0, argc, argv); int port = (int)scheme_real_to_double(argv[0]); if (!midiout) { midiout = new MIDIOut(port); } else { midiout->close(); midiout->open(port); } MZ_GC_UNREG(); return scheme_void; } StartFunctionDoc-en midiin-close Returns: void Description: Closes the MIDI input port opened. Example: (midiin-close) EndFunctionDoc Scheme_Object *midiin_close(int argc, Scheme_Object **argv) { if (midilistener != NULL) { midilistener->close(); } return scheme_void; } StartFunctionDoc-en midiout-close Returns: void Description: Closes the MIDI outpu port opened. Example: (midiout-close) EndFunctionDoc Scheme_Object *midiout_close(int argc, Scheme_Object **argv) { if (midiout != NULL) { midiout->close(); } return scheme_void; } StartFunctionDoc-en midi-cc channel-number controller-number Returns: controller-value-number Description: Returns the controller value. Example: (midi-cc 0 1) EndFunctionDoc StartFunctionDoc-pt midi-cc número-canal número-controle Retorna: número-valor-controle Descrição: Retorna o valor do controle Exemplo: (midi-cc 0 1) EndFunctionDoc Scheme_Object *midi_cc(int argc, Scheme_Object **argv) { Scheme_Object *ret = NULL; MZ_GC_DECL_REG(2); MZ_GC_VAR_IN_REG(0,argv); MZ_GC_VAR_IN_REG(1,ret); MZ_GC_REG(); if (!SCHEME_NUMBERP(argv[0])) scheme_wrong_type("midi-cc", "number", 0, argc, argv); if (!SCHEME_NUMBERP(argv[1])) scheme_wrong_type("midi-cc", "number", 1, argc, argv); int channel = (int)scheme_real_to_double(argv[0]); int index = (int)scheme_real_to_double(argv[1]); if (midilistener != NULL) { int val = midilistener->get_cc(channel, index); ret = scheme_make_integer(val); } else { ret = scheme_void; } MZ_GC_UNREG(); return ret; } StartFunctionDoc-en midi-ccn channel-number controller-number Returns: controller-value-number Description: Returns the controller value normalised to the (0, 1) interval. Example: (midi-ccn 0 1) EndFunctionDoc StartFunctionDoc-pt midi-ccn número-canal número-controle Retorna: número-valor-controle Descrição: Retorna o valor normalisado do controle no intervalo (0, 1). Exemplo: (midi-ccn 0 1) EndFunctionDoc Scheme_Object *midi_ccn(int argc, Scheme_Object **argv) { Scheme_Object *ret = NULL; MZ_GC_DECL_REG(2); MZ_GC_VAR_IN_REG(0,argv); MZ_GC_VAR_IN_REG(1,ret); MZ_GC_REG(); if (!SCHEME_NUMBERP(argv[0])) scheme_wrong_type("midi-ccn", "number", 0, argc, argv); if (!SCHEME_NUMBERP(argv[1])) scheme_wrong_type("midi-ccn", "number", 1, argc, argv); int channel = (int)scheme_real_to_double(argv[0]); int index = (int)scheme_real_to_double(argv[1]); if (midilistener != NULL) { float val = midilistener->get_ccn(channel, index); ret = scheme_make_float(val); } else { ret = scheme_make_float(0); } MZ_GC_UNREG(); return ret; } StartFunctionDoc-en midi-note Returns: #(on-off-symbol channel note velocity) or #f Description: Returns the next event from the MIDI note event queue or #f if the queue is empty. Example: (midi-note) EndFunctionDoc StartFunctionDoc-pt midi-note Retorna: #(símbolo-ligado-desligado canal nota velocidade) ou #f Descrição: Retorna o próximo evento da fila de eventos de nota MIDI ou #f se a fila está vazia. Exemplo: (midi-note) EndFunctionDoc Scheme_Object *midi_note(int argc, Scheme_Object **argv) { Scheme_Object *ret = NULL; MZ_GC_DECL_REG(2); MZ_GC_VAR_IN_REG(2,ret); MZ_GC_REG(); ret = scheme_false; if (midilistener != NULL) { MIDINote *note = midilistener->get_note(); if (note) { ret = scheme_make_vector(4, scheme_void); if (note->on_off == MIDIListener::MIDI_NOTE_OFF) SCHEME_VEC_ELS(ret)[0]= scheme_intern_symbol("note-off"); else SCHEME_VEC_ELS(ret)[0]= scheme_intern_symbol("note-on"); SCHEME_VEC_ELS(ret)[1]= scheme_make_integer(note->channel); SCHEME_VEC_ELS(ret)[2]= scheme_make_integer(note->note); SCHEME_VEC_ELS(ret)[3]= scheme_make_integer(note->velocity); } } MZ_GC_UNREG(); return ret; } StartFunctionDoc-en midi-program channel-number Returns: program-value-number Description: Returns the program value. Example: (midi-program 0) EndFunctionDoc Scheme_Object *midi_program(int argc, Scheme_Object **argv) { Scheme_Object *ret = NULL; MZ_GC_DECL_REG(2); MZ_GC_VAR_IN_REG(0,argv); MZ_GC_VAR_IN_REG(1,ret); MZ_GC_REG(); if (!SCHEME_NUMBERP(argv[0])) scheme_wrong_type("midi-program", "number", 0, argc, argv); int channel = (int)scheme_real_to_double(argv[0]); if (midilistener != NULL) { int val = midilistener->get_program(channel); ret = scheme_make_integer(val); } else { ret = scheme_void; } MZ_GC_UNREG(); return ret; } midi-cc-event Returns: #(channel controller value) or #f Description: Returns the next event from the MIDI note event queue or #f if the queue is empty. Example: (midi-cc-event) EndFunctionDoc Scheme_Object *midi_cc_event(int argc, Scheme_Object **argv) { Scheme_Object *ret = NULL; MZ_GC_DECL_REG(2); MZ_GC_VAR_IN_REG(2,ret); MZ_GC_REG(); ret = scheme_false; if (midilistener != NULL) { MIDIEvent*evt = midilistener->get_cc_event(); if (evt) { ret = scheme_make_vector(3, scheme_void); SCHEME_VEC_ELS(ret)[0]= scheme_make_integer(evt->channel); SCHEME_VEC_ELS(ret)[1]= scheme_make_integer(evt->controller); SCHEME_VEC_ELS(ret)[2]= scheme_make_integer(evt->value); } } MZ_GC_UNREG(); return ret; } StartFunctionDoc-en midi-peek Returns: msg-string Description: Returns the name, and event type, and parameter bytes of the last MIDI event as a string for debugging purposes. Example: (display (midi-peek))(newline) EndFunctionDoc StartFunctionDoc-pt midi-peek Retorna: string-msg Descrição: Retorna o nome, tipo de evento e os bytes parâmetros do último evento de MIDI como uma string para propósitos de debugging. Exemplo: (display (midi-peek))(newline) EndFunctionDoc Scheme_Object *midi_peek(int argc, Scheme_Object **argv) { if (midilistener != NULL) { return scheme_make_utf8_string(midilistener->get_last_event().c_str()); } else { return scheme_make_utf8_string(""); } } StartFunctionDoc-en midi-send Returns: void Description: Immediately send a single message out an open MIDI output port. Example: (midiout-open 0) (midi-send 144 64 90) (sleep 1) (midi-send 128 64 40) (midiout-close) EndFunctionDoc Scheme_Object *midi_send(int argc, Scheme_Object **argv) { MZ_GC_DECL_REG(1); MZ_GC_VAR_IN_REG(0,argv); MZ_GC_REG(); for (int n = 0; n < argc; n++) { if (!SCHEME_INTP(argv[n])) { scheme_wrong_type("midi-send", "int", n, argc, argv); break; } } if (midiout != NULL) { std::vectormessage; for (int n = 0; n < argc; n++) { message.push_back(SCHEME_INT_VAL(argv[n])); } midiout->send(message); } MZ_GC_UNREG(); return scheme_void; } StartFunctionDoc-en midi-position Returns: #(bar beat ticks) Description: Returns the current position given by MIDI clocks. Example: (midiin-open 0) (midi-position) (midiin-close) EndFunctionDoc Scheme_Object *midi_position(int argc, Scheme_Object **argv) { Scheme_Object *ret = NULL; MZ_GC_DECL_REG(2); MZ_GC_VAR_IN_REG(2,ret); MZ_GC_REG(); if (midilistener != NULL) { ret = scheme_make_vector(3, scheme_void); SCHEME_VEC_ELS(ret)[0]= scheme_make_integer(midilistener->get_bar()); SCHEME_VEC_ELS(ret)[1]= scheme_make_integer(midilistener->get_beat()); SCHEME_VEC_ELS(ret)[2]= scheme_make_integer(midilistener->get_pulse()); } else { ret = scheme_void; } MZ_GC_UNREG(); return ret; } StartFunctionDoc-en midi-clocks-per-beat Returns: clocks-per-beat-value-number Description: Returns the number of MIDI clocks per beat, depending on the time signature. Example: (midi-clocks-per-beat) EndFunctionDoc Scheme_Object *midi_clocks_per_beat(int argc, Scheme_Object **argv) { Scheme_Object *ret = NULL; MZ_GC_DECL_REG(1); MZ_GC_VAR_IN_REG(0,ret); MZ_GC_REG(); if (midilistener != NULL) { ret = scheme_make_integer(midilistener->get_clocks_per_beat()); } else { ret = scheme_void; } MZ_GC_UNREG(); return ret; } StartFunctionDoc-en midi-beats-per-bar Returns: beats-per-bar-value-number Description: Returns the number of beats per bar, depending on the time signature. Example: (midi-beats-per-bar) EndFunctionDoc Scheme_Object *midi_beats_per_bar(int argc, Scheme_Object **argv) { Scheme_Object *ret = NULL; MZ_GC_DECL_REG(1); MZ_GC_VAR_IN_REG(0,ret); MZ_GC_REG(); if (midilistener != NULL) { ret = scheme_make_integer(midilistener->get_beats_per_bar()); } else { ret = scheme_void; } MZ_GC_UNREG(); return ret; } StartFunctionDoc-en midi-set-signature Returns: void Description: Sets the time signature Calling this function resets the song position. Example: ;set the signature to 3/4 (midi-set-signature 3 4) EndFunctionDoc Scheme_Object *midi_set_signature(int argc, Scheme_Object **argv) { MZ_GC_DECL_REG(1); MZ_GC_VAR_IN_REG(0,argv); MZ_GC_REG(); if (midilistener != NULL) { if (!SCHEME_NUMBERP(argv[0])) scheme_wrong_type("midi-set-signature", "number", 0, argc, argv); if (!SCHEME_NUMBERP(argv[1])) scheme_wrong_type("midi-set-signature", "number", 1, argc, argv); int bpb = (int)scheme_real_to_double(argv[0]); int cpb = (int)scheme_real_to_double(argv[1]); midilistener->set_signature(bpb, cpb); } MZ_GC_UNREG(); return scheme_void; } #ifdef STATIC_LINK Scheme_Object *midi_scheme_reload(Scheme_Env*env) #else Scheme_Object *scheme_reload(Scheme_Env*env) #endif { Scheme_Env*menv = NULL; MZ_GC_DECL_REG(2); MZ_GC_VAR_IN_REG(0,env); MZ_GC_VAR_IN_REG(1,menv); MZ_GC_REG(); add all the modules from this extension menv = scheme_primitive_module(scheme_intern_symbol("fluxus-midi"), env); scheme_add_global("midiin-open", scheme_make_prim_w_arity(midiin_open, "midiin-open", 1, 1), menv); scheme_add_global("midiin-close", scheme_make_prim_w_arity(midiin_close, "midiin-close", 0, 0), menv); scheme_add_global("midiout-open", scheme_make_prim_w_arity(midiout_open, "midiout-open", 1, 1), menv); scheme_add_global("midiout-close", scheme_make_prim_w_arity(midiout_close, "midiout-close", 0, 0), menv); scheme_add_global("midi-info", scheme_make_prim_w_arity(midi_info, "midi-info", 0, 0), menv); scheme_add_global("midi-cc", scheme_make_prim_w_arity(midi_cc, "midi-cc", 2, 2), menv); scheme_add_global("midi-ccn", scheme_make_prim_w_arity(midi_ccn, "midi-ccn", 2, 2), menv); scheme_add_global("midi-note", scheme_make_prim_w_arity(midi_note, "midi-note", 0, 0), menv); scheme_add_global("midi-peek", scheme_make_prim_w_arity(midi_peek, "midi-peek", 0, 0), menv); scheme_add_global("midi-program", scheme_make_prim_w_arity(midi_program, "midi-program", 1, 1), menv); scheme_add_global("midi-cc-event", scheme_make_prim_w_arity(midi_cc_event, "midi-cc-event", 0, 0), menv); scheme_add_global("midi-send", scheme_make_prim_w_arity(midi_send, "midi-send", 1, 3), menv); scheme_add_global("midi-position", scheme_make_prim_w_arity(midi_position, "midi-position", 0, 0), menv); scheme_add_global("midi-clocks-per-beat", scheme_make_prim_w_arity(midi_clocks_per_beat, "midi-clocks-per-beat", 0, 0), menv); scheme_add_global("midi-beats-per-bar", scheme_make_prim_w_arity(midi_beats_per_bar, "midi-beats-per-bar", 0, 0), menv); scheme_add_global("midi-set-signature", scheme_make_prim_w_arity(midi_set_signature, "midi-set-signature", 2, 2), menv); scheme_finish_primitive_module(menv); MZ_GC_UNREG(); return scheme_void; } #ifndef STATIC_LINK Scheme_Object *scheme_initialize(Scheme_Env*env) { return scheme_reload(env); } Scheme_Object *scheme_module_name() { return scheme_intern_symbol("fluxus-midi"); } #endif