# Sending MIDI Messages > Original: [Sending MIDI messages](https://tttapa.github.io/Control-Surface/Doxygen/d3/df7/midi-tutorial.html) ## Direct sending Use the interface object directly when you don't need the element system: ```cpp pico #include "pico/stdlib.h" #include "pico/cyw43_arch.h" #include using namespace cs; BluetoothMIDI_Interface midi; int main() { stdio_init_all(); if (cyw43_arch_init()) return 1; midi.begin(); MIDIAddress note = {MIDI_Notes::C[4], Channel_1}; midi.sendNoteOn(note, 127); sleep_ms(500); midi.sendNoteOff(note, 0); while (true) { midi.update(); sleep_ms(1); } } ``` ## Channel voice messages | Method | Arguments | Description | |--------|-----------|-------------| | `sendNoteOn` | address, velocity | Note On | | `sendNoteOff` | address, velocity | Note Off | | `sendControlChange` | address, value | Control Change (0-127) | | `sendProgramChange` | address | Program Change | | `sendPitchBend` | channel, value | Pitch Bend (0-16383, center 8192) | | `sendChannelPressure` | channel, pressure | Channel Pressure | | `sendKeyPressure` | address, pressure | Polyphonic Key Pressure | ## System common messages | Method | Arguments | Description | |--------|-----------|-------------| | `sendMTCQuarterFrame` | type, value | MIDI Time Code quarter frame | | `sendSongPositionPointer` | beats | Song position (14-bit) | | `sendSongSelect` | song | Song number (0-127) | | `sendTuneRequest` | — | Tune request | ## System exclusive ```cpp pico uint8_t sysex[] = {0xF0, 0x7E, 0x7F, 0x06, 0x01, 0xF7}; midi.sendSysEx(sysex); ``` ## Real-time messages | Method | Description | |--------|-------------| | `sendTimingClock` | MIDI clock tick | | `sendStart` | Start sequence | | `sendContinue` | Continue sequence | | `sendStop` | Stop sequence | | `sendActiveSensing` | Active sensing | | `sendSystemReset` | System reset | ## Flushing Call `midi.sendNow()` to flush buffered messages immediately.