cs-midi-docs/docs/manual/01-getting-started/02-first-output.md

2.2 KiB

First Output

Original: Getting Started — First Output

A minimal sketch that reads a physical control and sends MIDI.

1. Include the library

#include "pico/stdlib.h"
#include <cs_midi.h>

using namespace cs;

cs_midi.h provides all Control Surface classes. The cs:: namespace contains everything; using namespace cs keeps examples concise.

2. Instantiate a MIDI interface

At least one MIDI interface must exist before Control_Surface.begin().

BluetoothMIDI_Interface midi;

Available interfaces:

Class Transport CMake option
BluetoothMIDI_Interface BLE MIDI (BTstack) CS_MIDI_BLE
USBMIDI_Interface USB MIDI (TinyUSB) CS_MIDI_USB
HardwareSerialMIDI_Interface 5-pin DIN MIDI CS_MIDI_SERIAL
AppleMIDI_Interface RTP-MIDI over WiFi CS_MIDI_APPLEMIDI

3. Add MIDI output elements

Output elements read physical inputs and send MIDI messages automatically.

A single potentiometer sending CC:

CCPotentiometer pot {26, {MIDI_CC::Channel_Volume, Channel_1}};

Constructor arguments: GPIO pin, then MIDI address (controller number, channel).

Multiple buttons:

NoteButton buttons[] {
    {5, {MIDI_Notes::C[4], Channel_1}},
    {6, {MIDI_Notes::D[4], Channel_1}},
    {7, {MIDI_Notes::E[4], Channel_1}},
};

4. Initialize and run

int main() {
    stdio_init_all();
    Control_Surface.begin();
    while (true) {
        Control_Surface.loop();
        sleep_ms(1);
    }
}

Control_Surface.begin() initializes all interfaces and elements. Control_Surface.loop() polls inputs and sends MIDI when values change.

Complete example

#include "pico/stdlib.h"
#include "pico/cyw43_arch.h"
#include <cs_midi.h>

using namespace cs;

BluetoothMIDI_Interface midi;

CCPotentiometer pot {26, {MIDI_CC::Channel_Volume, Channel_1}};
NoteButton button {5, {MIDI_Notes::C[4], Channel_1}};

int main() {
    stdio_init_all();
    if (cyw43_arch_init()) return 1;
    Control_Surface.begin();
    while (true) {
        Control_Surface.loop();
        sleep_ms(1);
    }
}