Converting Piano Toy to MIDI Keyboard.

Dependencies:   mbed mbed-STM32F103C8T6 USBDevice_STM32F103

How to turn kids' old piano toy to a MIDI keyboard

Inspired by http://www.codetinkerhack.com/2012/11/how-to-turn-piano-toy-into-midi.html I did the same with a Blue Pill module using Mbed.

The old toy was capable to play only one tone at a time:
Zoom in
https://os.mbed.com/media/uploads/hudakz/minikeyboardtoy01.jpg



A bit of reverse-engineering was needed to re-use the original printed boards. The results are below.

Original PCBs with switches traced to the connector pins:

Zoom in
https://os.mbed.com/media/uploads/hudakz/keys.jpg Zoom in
https://os.mbed.com/media/uploads/hudakz/buttons.jpg

Schematic:

Zoom in
https://os.mbed.com/media/uploads/hudakz/schematic.png

Wiring:

https://os.mbed.com/media/uploads/hudakz/wiring.png



Then I replaced the original chip with a Blue Pill module and added a USB connector:
Zoom in
https://os.mbed.com/media/uploads/hudakz/minikeyboardtoy02.jpg

Works great when connected over an USB cable to a Linux Ubuntu 18.04 machine

Installed software:

  • Yoshimi: An excellent MIDI software synthesizer for Linux.
    Zoom in
    https://os.mbed.com/media/uploads/hudakz/yoshimi.png
  • Patchage: Provides a graphical interface to connect jack and midi inputs and outputs.
    Zoom in
    https://os.mbed.com/media/uploads/hudakz/patchage.png

How to use it:

  • Connect the Keyboard to the PC over an USB cable.
  • Run Yoshimi.
  • Run Patchage and connect the Mbed USB Audio MIDI 1 output to Yoshimi's input (drag Mbed Audio MIDI 1 over yoshimi input and drop)

https://os.mbed.com/media/uploads/hudakz/connection.png

  • To apply the changes close the Patchage!
  • On Yoshimi's toolbar click on Instruments and select Show Stored ...
  • Select a bank and click on the instrument you'd like to play.
    https://os.mbed.com/media/uploads/hudakz/instruments.png

Have fun :-)

main.cpp

Committer:
hudakz
Date:
2020-04-08
Revision:
0:75d307e38488
Child:
1:41d2a3984dd7

File content as of revision 0:75d307e38488:

#include "stm32f103c8t6.h"
#include "mbed.h"
#include "MidiKey.h"

DigitalIn       a3(PA_3, PullDown);
DigitalIn       a4(PA_4, PullDown);
DigitalIn       a5(PA_5, PullDown);
DigitalIn       a6(PA_6, PullDown);
DigitalIn       a7(PA_7, PullDown);

DigitalInOut    a0(PA_0, PIN_INPUT, PullDown, 0);
DigitalInOut    a1(PA_1, PIN_INPUT, PullDown, 0);
DigitalInOut    a2(PA_2, PIN_INPUT, PullDown, 0);
DigitalInOut    b0(PB_0, PIN_INPUT, PullDown, 0);
DigitalInOut    b1(PB_1, PIN_INPUT, PullDown, 0);
DigitalInOut    b10(PB_10, PIN_INPUT, PullDown, 0);
DigitalInOut    b11(PB_11, PIN_INPUT, PullDown, 0);
DigitalInOut    c15(PC_15, PIN_INPUT, PullDown, 0);

/**
 * @brief
 * @note
 * @param
 * @retval
 */
int main()
{
    confSysClock();                 //Configure system clock (72MHz HSE clock, 48MHz USB clock)
    USBMIDI midi;
    MidiKey key[] =
    {
        MidiKey(midi, 53, a0, a5),  // S1
        MidiKey(midi, 54, a1, a5),  // S2
        MidiKey(midi, 55, a2, a5),  // S3
        MidiKey(midi, 56, b11, a5), // S4
        MidiKey(midi, 57, b10, a5), // S5
        MidiKey(midi, 58, b1, a5),  // S6
        MidiKey(midi, 59, b0, a5),  // S7
        MidiKey(midi, 60, c15, a6), // S8
        MidiKey(midi, 61, a0, a6),  // S9
        MidiKey(midi, 62, a1, a6),  // S10
        MidiKey(midi, 63, a2, a6),  // S11
        MidiKey(midi, 64, b11, a6), // S12
        MidiKey(midi, 65, b10, a6), // S13
        MidiKey(midi, 66, b1, a6),  // S14
        MidiKey(midi, 67, b0, a6),  // S15
        MidiKey(midi, 68, c15, a7), // S16
        MidiKey(midi, 69, a0, a7),  // S17
        MidiKey(midi, 70, a1, a7),  // S18
        MidiKey(midi, 71, a2, a7),  // S19
        MidiKey(midi, 72, b11, a7), // S20
        MidiKey(midi, 73, b10, a7), // S21
        MidiKey(midi, 74, b1, a7),  // S22
        MidiKey(midi, 75, b0, a7),  // S23
        MidiKey(midi, 76, c15, a4), // S24
        MidiKey(midi, 77, a0, a4),  // S25
        MidiKey(midi, 78, a1, a4),  // S26
        MidiKey(midi, 79, a2, a4),  // S27
        MidiKey(midi, 80, b11, a4), // S28
        MidiKey(midi, 81, b10, a4), // S29
        MidiKey(midi, 82, b1, a4),  // S30
        MidiKey(midi, 83, b0, a4),  // S31
        MidiKey(midi, 84, c15, a3)  // S32
    };
    size_t  keyLen = sizeof(key) / sizeof(*key);

    while (1) {
        for (uint8_t i = 0; i < keyLen; i++) {
            key[i].scan();
        }
    }
}