-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
397 lines (396 loc) · 24.6 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
<!DOCTYPE html>
<!-- This is the home page. Still experiementing with how this works -->
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="css/siimple.min.css">
<title>rppicomidi | Raspberry Pi Pico software and hardware projects for USB MIDI, Bluetooth MIDI, and old school serial port MIDI</title>
<meta name="description" content="Raspberry Pi Pico software and hardware projects for USB MIDI, Bluetooth MIDI, and old school serial port MIDI." />
</head>
<body>
<div class="grid main">
<h1>Welcome!</h1>
<p>My GitHub name is <i>rppicomidi</i> because I like to develop MIDI projects for the Raspberry Pi Pico and Pico W.</p>
<p>This website will direct you to my software and hardware projects
for Bluetooth MIDI, USB MIDI, and old school serial port MIDI and to my software
libraries that the projects use for user interfaces, for Pico W Wi-Fi,
and for non-volatile storage. Most of the code is in C or C++.</p>
</div>
<div class="grid main">
<h1>What's New</h1>
<h2>22-Oct-2024 Updates</h2>
<ul>
<li>
Applications updated to support Pico SDK 2.0
<ul>
<li><a href="https://github.com/rppicomidi/midi2usbhost">midi2usbhost</a></li>
<li><a href="https://github.com/rppicomidi/midi2usbhub">midi2usbhub</a></li>
<li><a href="https://github.com/rppicomidi/pico-usb-midi-filter">pico-usb-midi-filter</a></li>
<li><a href="https://github.com/rppicomidi/pico-usb-midi-processor">pico-usb-midi-processor</a></li>
<li><a href="https://github.com/rppicomidi/midi2piousbhub">midi2piousbhub</a></li>
</ul></li>
<li><a href="https://github.com/rppicomidi/midi2piousbhub">midi2piousbhub</a>
If you are running on a Pico-W board, you can now route Bluetooth Low Energy MIDI
(BLE-MIDI) clients (like iPads and computers) and servers (like control surfaces
and keyboards) the same way you route USB MIDI and serial port MIDI devices. Bluetooth is supported
using the CLI, which is accessible via the UART0 interface or via the USB device port
(USB CDC ACM).</li>
<li><a href="https://github.com/rppicomidi/pico-w-ble-midi-lib">pico-w-ble-midi-lib</a>
Added Bluetooth LE client capability include scan for advertising servers and connect
plus Bluetooth bonded device list management. The libraries have be updated to allow
you to switch between client and server mode within one application.</li>
</ul>
<h2>12-Jun-2024 Updates</h2>
<ul>
<li>
There is a new application and a new driver:
<ul>
<li><a href="https://github.com/rppicomidi/midi2piousbhub">midi2piousbhub</a>
Interconnect MIDI devices via a USB hub or old school MIDI. Configure the
interconnections using a serial port console and save the configurations as
presets in the Pico board's serial flash memory. Back up the presets to
USB flash. The USB MIDI host is implemented using the RP2040's PIO modules,
and the RP2040 native USB port is a USB device port that provides an additional
MIDI I/O port (to use a virtual instrument on an iPad, for example), and
a USB serial port for the command line interface.
</li>
<li><a href="https://github.com/rppicomidi/cdc_stdio_lib">cdc_stdio_lib</a>
Library allows a pico-sdk application that uses TinyUSB to add USB CDC stdio support.
For example, if you are using the RP2040's USB port as a USB MIDI device,
you can add a CDC class serial port interface as well. The stdio calls like printf
will route output to the USB port, etc. The
<a href="https://github.com/rppicomidi/midi2piousbhub">midi2piousbhub</a> project
uses this library.
</li>
</ul>
</li>
<li>To allow Arduino applications to have an easier time configuring MIDI libraries,
<ul><li><a href="https://github.com/rppicomidi/usb_midi_host">usb_midi_host</a> adds
run-time buffer length configuration</li>
<li><a href="https://github.com/rppicomidi/EZ_USB_MIDI_HOST">EZ_USB_MIDI_HOST</a>
API has changed to a C++ template parameterized by a settings class</li>
</ul>
</li>
</ul>
<h2>12-Feb-2024 Updates</h2>
<ul>
<li>
Due to recent bug reports enumerating USB Audio+MIDI devices, I have increased
the default enumeration buffer size from 256 bytes 512 bytes, and I added a Troubleshooting
section to the README.md files for each of the following projects:
<ul>
<li><a href="https://github.com/rppicomidi/ble-midi2usbhost">ble-midi2usbhost</a></li>
<li><a href="https://github.com/rppicomidi/midi2usbhost">midi2usbhost</a></li>
<li><a href="https://github.com/rppicomidi/midi2usbhub">midi2usbhub</a></li>
<li><a href="https://github.com/rppicomidi/midi2usbhub-web">midi2usbhub-web</a></li>
</ul>
</li>
<li>
Removed an erroneous report on yesterday's entry for this web page about
a project that does not exist. Added an entry about an update to the
<a href="https://github.com/rppicomidi/midi2usbhost">midi2usbhost</a>
project.
</li>
</ul>
<h2>11-Feb-2024 Updates</h2>
<ul>
<li><a href="https://github.com/rppicomidi/usb_midi_host">usb_midi_host</a>
Fixed a bug that prevented MIDI devices that are designed with high-speed
USB in mind from enumerating. The maximum full speed USB bulk transfer is
64 bytes. Two DSP guitar pedals assumed they were only hooking up to a high speed
capable host and specified a maximum bulk transfer of 512 bytes. The code
that attempted to correct this did not quite work. It is fixed now. Debugging
this issue revealed that the default enumeration buffer set by
CFG_TUH_ENUMERATION_BUFSIZE is too small to work with probably all
audio+MIDI devices like DSP guitar pedals. Future versions of the C/C++
examples will likely bump up CFG_TUH_ENUMERATION_BUFSIZE to 512 bytes.
Arduino examples require some hacking of the Adafruit TinyUSB Library.
See the project's README file for more details.
</li>
<li><a href="https://github.com/rppicomidi/usb_midi_host">usb_midi_host</a>
This driver has the examples and documentation updated for use with either
the pico-sdk or the Arduino IDE. Further, the examples will work with either
the native RP2040 USB hardware or with a PIO USB host port. (Arduino sketches
require the Adafruit TinyUSB Library) You can load this library using the
Arduino Library Manager.
</li>
<li><a href="https://github.com/rppicomidi/EZ_USB_MIDI_HOST">EZ_USB_MIDI_HOST</a>
This C++ library code that lets Arduino sketches and C/C++ programs use the
Arduino MIDI Library with the usb_midi_host library and the TinyUSB Library
(Arduino sketches require the Adafruit TinyUSB Library) You can load this
library using the Arduino Library Manager.
</li>
<li><a href="https://github.com/rppicomidi/midi2usbhost">midi2usbhost</a>
This project now supports a C code version and an Arduino version. Build the
C code version with the pico-sdk. The Arduino sketch uses the Arduino IDE and the
<a href="https://github.com/rppicomidi/EZ_USB_MIDI_HOST">EZ_USB_MIDI_HOST</a>
library to do the work. The code is designed to run on a Raspberry Pi Pico board,
but it should work on any RP2040 type board with minor modifications.
</li>
</ul>
<h2>24-Oct-2023 Updates</h2>
<ul>
<li><a href="https://github.com/rppicomidi/midi_uart_lib">midi_uart_lib</a>
has been updated to move ring_buffer_lib to a peer subdirectory instead of
a sub-directory of midi_uart_lib. This makes it simpler to coexist with
<a href="https://github.com/rppicomidi/ble-midi2usbhost">ble-midi2usbhost</a>,
and <a href="https://github.com/rppicomidi/pio_midi_uart_lib">pio_midi_uart_lib</a>.
I have updated the following project that use midi_uart_lib so they still build.
<ul>
<li><a href="https://github.com/rppicomidi/midi2usbhost">midi2usbhost</a></li>
<li><a href="https://github.com/rppicomidi/midi2usbhub">midi2usbhub</a></li>
<li><a href="https://github.com/rppicomidi/midi2usbdev">midi2usbdev</a></li>
</ul>
</li>
<li><a href="https://github.com/rppicomidi/pio_midi_uart_lib">pio_midi_uart_lib</a>
documentation has been updated to describe the output only MIDI port feature and to
point to the <a href="https://github.com/rppicomidi/midi-multistream2usbdev">midi-multistream2usbdev</a>
example.
</li>
<ul>
<li><a href="https://github.com/rppicomidi/ble-midi2usbhost">ble-midi2usbhost</a></li>
<li><a href="https://github.com/rppicomidi/midi2usbhost">midi2usbhost</a></li>
<li><a href="https://github.com/rppicomidi/midi2usbhub">midi2usbhub</a></li>
<li><a href="https://github.com/rppicomidi/midi2usbhub-web">midi2usbhub-web</a></li>
</ul>
</ul>
<h2>21-Aug-2023 Updates</h2>
<ul>
<li><a href="https://github.com/rppicomidi/usb_midi_host">usb_midi_host</a>
An application level USB MIDI Host driver for TinyUSB. On 15-Aug-2023, TinyUSB
was updated to include support for USB Host drivers added at the application
level. I created usb_midi_host so I could avoid requiring people to use a
forked version of TinyUSB to build my projects.
</li>
<li>Several projects updated to use usb_midi_host and standard TinyUSB instead of
my forked version of TinyUSB.
<ul>
<li><a href="https://github.com/rppicomidi/ble-midi2usbhost">ble-midi2usbhost</a></li>
<li><a href="https://github.com/rppicomidi/midi2usbhost">midi2usbhost</a></li>
<li><a href="https://github.com/rppicomidi/midi2usbhub">midi2usbhub</a></li>
<li><a href="https://github.com/rppicomidi/midi2usbhub-web">midi2usbhub-web</a></li>
</ul>
</ul>
<h2>26-Jul-2023 Updates</h2>
<ul>
<li><a href="https://github.com/rppicomidi/pico-w-ble-midi-lib">pico-w-ble-midi-lib</a>
A MIDI 1.0 Bluetooth LE GATT service server. Used with the following 2 applications.
</li>
<li><a href="https://github.com/rppicomidi/pico-w-ble-midi-server-demo">pico-w-ble-midi-server-demo</a>
A Bluetooth LE MIDI 1.0 server peripheral demo for the Raspberry Pi Pico W. It uses a command line
interface to send and recieve Bluetooth LE MIDI data. It also demonstrates using
<a href="https://github.com/rppicomidi/pico-w-ble-midi-lib">pico-w-ble-midi-lib</a>
</li>
<li><a href="https://github.com/rppicomidi/ble-midi2usbhost">ble-midi2usbhost</a>
A Pico W Bluetooth LE MIDI adapter for any class compliant USB MIDI device. With only a few
connectors and a power supply you connect any USB MIDI Controller or Synthesizer
to a phone, tablet or computer using Bluetooth instead of USB.
It also demonstrates using
<a href="https://github.com/rppicomidi/pico-w-ble-midi-lib">pico-w-ble-midi-lib</a>
</li>
</ul>
<h2>8-May-2023 Updates</h2>
<ul>
<li><a href="https://github.com/rppicomidi/pio_midi_uart_lib">pio_midi_uart_lib</a>
Add support for using the PIO state machines for MIDI Out only mode.
</li>
<li><a href="https://github.com/rppicomidi/midi-multistream2usbdev">midi-multistream2usbdev</a>
This new project is designed to give your PC, Mac, etc. a 2 input 6 output USB to 5-pin DIN MIDI
interface. It includes files <code>midi_device_multistream.c/h</code> that show how to use the
tinyusb library to build a USB MIDI device with more than one virtual MIDI cable per USB endpoint.
It also demonstrates using <a href="https://github.com/rppicomidi/pio_midi_uart_lib">pio_midi_uart_lib</a>
in both MIDI UART mode and MIDI Out only mode.
</li>
</ul>
<h2>07-Apr-2023 Updates</h2>
<ul>
<li><a href="https://github.com/rppicomidi/pico-usb-host-msc-demo">pico-usb-host-msc-demo</a>
Changed build methods, added code and fixed CMake bugs to allow Pico W builds to coexist
with using the <code>Pico-PIO-USB</code> project for the USB Host port</li>
<li><a href="https://github.com/rppicomidi/pico-mc-display-bridge">pico-mc-display-bridge</a>
Made the <code>pico_pico_midi_lib</code> submodule project public and fixed other issues such
that it should be possible now for people other than me to build the code. Please file an
issue if you have any trouble building the code, missing files, etc.
</li>
<li><a href="https://github.com/rppicomidi/pico-ssd1306-mono-graphics-lib">pico-ssd1306-mono-graphics-lib</a>
Now the library will properly claim PIO State Machines so that the PIO units may be shared more easily</li>
</ul>
<h2>25-Mar-2023 Updates</h2>
<ul>
<li>
Fixed the CLI for builds that do not use the DEBUG option. By default,
the pico-sdk command line build will not use the DEBUG option. I did not
realize that because I use VisualStudio Code IDE for development; the
default is the DEBUG option. Without debug, the <code>assert</code> macro
was not generating code for the CLI commands, so no commands were being
added to the CLI. The symptom is typing <code>help</code> and only
seeing the <code>help</code> command as an option.
The following projects had this bug and should be fixed.
<ul>
<li><a href="https://github.com/rppicomidi/pico-usb-host-msc-demo">pico-usb-host-msc-demo</a></li>
<li><a href="https://github.com/rppicomidi/midi2usbhub-web">midi2usbhub-web</a></li>
<li><a href="https://github.com/rppicomidi/midi2usbhub">midi2usbhub-web</a></li>
</ul>
The following projects have this bug and are not fixed yet. I hope to get to it soon. In
the meantime, please run <code>cmake</code> with DEBUG enabled (i.e. <code>cmake -DCMAKE_BUILD_TYPE=Debug ..</code>)
to build the following projects
<ul>
<li><a href="https://github.com/rppicomidi/pico-mc-display-bridge">pico-mc-display-bridge</a></li>
<li><a href="https://github.com/rppicomidi/pico-usb-midi-processor">pico-usb-midi-processor</a></li>
</ul>
</li>
<li>
Updated the tinyusb library version to use with the following projects
<ul>
<li><a href="https://github.com/rppicomidi/midi2usbhub-web">midi2usbhub-web</a></li>
<li><a href="https://github.com/rppicomidi/midi2usbhub">midi2usbhub-web</a></li>
</ul>
</li>
</ul>
<h2>MIDI Projects</h2>
<ul>
<li><a href="https://github.com/rppicomidi/pico-w-ble-midi-server-demo">pico-w-ble-midi-server-demo</a>
A Bluetooth LE MIDI 1.0 server peripheral demo for the Raspberry Pi Pico W.
</li>
<li><a href="https://github.com/rppicomidi/ble-midi2usbhost">ble-midi2usbhost</a>
A Pico W Bluetooth LE MIDI adapter for any class compliant USB MIDI device.
</li>
<li><a href="https://github.com/rppicomidi/midi2usbhost">midi2usbhost</a>
Add old school MIDI IN and MIDI OUT to a MIDI device with a USB B device port.
</li>
<li><a href="https://github.com/rppicomidi/midi2usbdev">midi2usbdev</a>
Create a PC, Mac, etc. MIDI interface with one MIDI IN and one MIDI OUT.
</li>
<li><a href="https://github.com/rppicomidi/midi-multistream2usbdev">midi-multistream2usbdev</a>
Create a PC, Mac, etc. 2 input 6 output USB to 5-pin DIN MIDI interface. Mac, iOS/iPadOS,
and Linux software will show the MIDI port names MIDI IN A, MIDI IN B, MIDI OUT A, MIDI OUT B,
..., MIDI OUT E, MIDI OUT F.
</li>
<li><a href="https://github.com/rppicomidi/midi2usbhub">midi2usbhub</a>
Interconnect MIDI devices via a USB hub or old school MIDI. Configure the
interconnections using a serial port console and save the configurations as
presets in the Pico board's serial flash memory. Back up the presets to
USB flash. The USB MIDI host is implemented using the RP2040's native USB
hardware.
</li>
<li><a href="https://github.com/rppicomidi/midi2piousbhub">midi2piousbhub</a>
Interconnect MIDI devices via a USB hub, Bluetooth Low Energy MIDI or old school MIDI. Configure the
interconnections using a serial port console and save the configurations as
presets in the Pico board's serial flash memory. Back up the presets to
USB flash. The USB MIDI host is implemented using the RP2040's PIO modules,
and the RP2040 native USB port is a USB device port that provides an additional
MIDI I/O port (to use a virtual instrument on an iPad, for example), and
a USB serial port for the command line interface.
</li>
<li><a href="https://github.com/rppicomidi/pico-usb-midi-filter">pico-usb-midi-filter</a>
Connect a Raspberry Pi Pico between a USB MIDI device and a USB Host to modify the USB MIDI traffic.
The filtering is determined in the source code. The USB descriptor of the attached device is not
changed.
</li>
<li>
<a href="https://github.com/rppicomidi/pico-usb-midi-processor">pico-usb-midi-processor</a>
Like pico-usb-midi-filter, except it has an OLED display and buttons for configuring what
processing to perform, it has up to 8 presets per device, and it allows you to save
presets to a USB flash drive.
</li>
<li>
<a href="https://github.com/rppicomidi/midi2usbhub-web">midi2usbhub-web</a>. The same as midi2usbhub, except it uses PIO for 2 serial MIDI ports and it
adds an embedded webserver UI for configuring routing and an OLED screen+USB keyboard UI for setting up
Wi-Fi and recalling presets.
</li>
<li><a href="https://github.com/rppicomidi/pico-mc-display-bridge">pico-mc-display-bridge</a>
Insert this project between the USB host and any Mackie Control compatible USB MIDI controller
to get Mackie Control text display, VPot LED and signal meter for each channel strip,
a timecode display, a VPot mode display, some additional
per channel strip buttons, and other special function buttons.
</li>
</ul>
<div class="grid main">
<h2>MIDI-related Software Libraries</h2>
<ul>
<li>
<a href="https://github.com/rppicomidi/midi_uart_lib">midi_uart_lib</a>
Library for using Raspberry Pi Pico UART1 or both UART0 and UART1 for serial port MIDI.
Uses <a href="https://github.com/rppicomidi/ring_buffer_lib">ring_buffer_lib</a>
to add user-configurable deep FIFOs.
</li>
<li>
<a href="https://github.com/rppicomidi/pio_midi_uart_lib">pio_midi_uart_lib</a>
Library adds up to 4 PIO-based UARTs configured for MIDI to a Rasberry Pi Pico or
Pico W. The MIDI OUT transmitter is open-drain, so it interfaces better with the
MIDI OUT circuit than the built-in UART. The MIDI IN only interrupts and enques
data received with no error. Uses <a href="https://github.com/rppicomidi/ring_buffer_lib">ring_buffer_lib</a>
to add user configurable deep FIFOs.
</li>
<li><a href="https://github.com/rppicomidi/pico-w-ble-midi-lib">pico-w-ble-midi-lib</a>
A MIDI 1.0 Bluetooth LE GATT service server and client.
</li>
<li>
<a href="https://github.com/rppicomidi/tinyusb">fork of tinyusb</a> This was as far as I know the first public
USB MIDI Host driver for the Raspberry Pi Pico. It has been superceded for most uses by <a href="https://github.com/hathach/tinyusb/pull/1627">
this pull request</a> that better uses the built-in hardware for bulk endpoint transfers
and also fixes bugs that were preventing the driver from supporting USB hubs. However, this fork
does contain hooks for caching the USB device descriptor of attached USB devices; these hooks allow
the <a href="https://github.com/rppicomidi/pico-usb-midi-filter">pico-usb-midi-filter</a> and
<a href="https://github.com/rppicomidi/pico-usb-midi-processor">pico-usb-midi-processor</a> projects
to make the USB descriptor on the Pico's device port exactly the same as the USB descriptor of the
MIDI device attached to the Pico-PIO-USB host port. If the TinyUSB project merges a pull reequest
for the USB MIDI Host driver, this fork will be mostly unnecessary.
</li>
</ul>
</div>
<div class="grid main">
<h2>Other Software Libraries</h2>
<h3>SSD1306 OLED UI</h3>
<ul>
<li>
<a href="https://github.com/rppicomidi/pico-ssd1306-mono-graphics-lib">pico-ssd1306-mono-graphics-lib</a>
Raspberry Pi Pico SSD1306 graphics library that can manage multiple displays at the same time. The drivers
are non-blocking and optimized for speed. They only redraw the parts of the display that need to be redrawn.
You can update 9 displays simultaneously every 23ms or so. The library supports drawing dots, lines, rectangles
(filled or unfilled), circles (filled or unfilled) and fixed-pitch characters 8pt, 12pt, 16pt or 24pt. It
supports clipping rectangles, 0, 90, 180 and 270 screen rotation. It can generate screen dumps. The library
works without RTOS support.
</li>
<li>
<a href="https://github.com/rppicomidi/pico-mono-ui-lib">pico-mono-ui-lib</a>
A simple monochrome UI library for a small mono screen and the Raspberry Pi Pico. This library supports
multiple screen navigation, scrollable menus, button navigation, HID keyboard navigation, text entry,
and number adjustment menu items. Values modified in the UI can be serialized to JSON.
</li>
</ul>
<h3>Non-volatile storage</h3>
<ul>
<li>
<a href="https://github.com/rppicomidi/littlefs-lib">fork of littlefs-lib</a>
This fork modified the Pico littlefs-lib to add support for running littlefs
on RP2040 core 0 whilst core 1 is also active doing something else.
</li>
</ul>
<h3>Misc</h3>
<ul>
<li>
<a href="https://github.com/rppicomidi/pico-c-utilities">pico-c-utilities</a>
A collection of C & C++ functions for console I/O and other useful things for the Raspberry Pi Pico.
This library right now only has one function in it: <span>int getsn(char* cp, int size)</span>.
</li>
<li><a href="https://github.com/rppicomidi/pico-usb-host-msc-demo">pico-usb-host-msc-demo</a>
Demo code provides a command line interface for managing up to 4 USB Mass Storage Class
devices connected via a USB hub to a single Pico or Pico W. The code is different from
the MSC demo provided with the tinyusb stack.
</li>
<li><a href="https://github.com/rppicomidi/cdc_stdio_lib">cdc_stdio_lib</a>
Library allows a pico-sdk application that uses TinyUSB to add USB CDC stdio support.
For example, if you are using the RP2040's USB port as a USB MIDI device,
you can add a CDC class serial port interface as well. The stdio calls like printf
will route output to the USB port, etc.
</li>
</ul>
</div>
<div class="grid main">
<h2>Other Projects</h2>
Most of these are simple demo programs for testing libraries.
Check out <a href="https://github.com/rppicomidi">my GitHub site</a> to see for yourself.
</div>
</body>
</html>