# FAQ > Original: [Frequently Asked Questions](https://tttapa.github.io/Control-Surface/Doxygen/da/dc1/FAQ.html) ## Can cs-midi be used as a general MIDI library? Yes. You can use the MIDI interface objects directly for sending and receiving, without using the element system or `Control_Surface` singleton. Sending: ```cpp pico BluetoothMIDI_Interface midi; int main() { stdio_init_all(); if (cyw43_arch_init()) return 1; midi.begin(); midi.sendNoteOn({MIDI_Notes::C[4], Channel_1}, 127); midi.sendNoteOff({MIDI_Notes::C[4], Channel_1}, 127); while (true) { midi.update(); sleep_ms(1); } } ``` Receiving with callbacks: ```cpp pico struct MyCallbacks : MIDI_Callbacks { void onChannelMessage(MIDI_Interface &, ChannelMessage msg) override { // handle msg (void)msg; } } cb; // in main(): midi.setCallbacks(cb); ``` ## Can addresses or channels be changed at runtime? Yes, through banks. A `Bank` groups bankable elements and a selector controls which bank is active. See the [Banks](../../examples/04-banks/) examples. ## What's the difference from Control Surface? cs-midi is a source-level extraction of Control Surface for pico-sdk. Key differences: - `#include ` instead of `#include ` - Standard `main()` replaces Arduino `setup()`/`loop()` - `cs::` namespace instead of top-level - BTstack BLE backend instead of ArduinoBLE/Bluedroid - No MCU protocol, displays, FastLED, or hardware expanders (yet) ## What radio modules are supported? The BLE transport uses BTstack with the CYW43 radio. Only the **Infineon RM2** module has been tested. Other CYW43 variants may work but are unverified.