I've persuaded my SP0256A-AL2 to "sing" the Twelve Days of Christmas.
https://diyelectromusic.com/2025/12/23/sp0256a-al2-sings-the-twelve-days-of-christmas/
#SP0256AAL2 #ArduinoUno #MusicAdventCalendar #MyApologies #FiveGoldRings
@futzle Ok. So, I've not done any fancy programming, but I have managed to get my vintage SP0256A-AL2 speech synthesizer chip to "sing" it for you...
Hopefully that tends a bit towards the weird :)

I've persuaded my SP0256A-AL2 to "sing" the Twelve Days of Christmas.
https://diyelectromusic.com/2025/12/23/sp0256a-al2-sings-the-twelve-days-of-christmas/
#SP0256AAL2 #ArduinoUno #MusicAdventCalendar #MyApologies #FiveGoldRings
SP0256A-AL2 Twelve Days of Christmas

SP0256A-AL2 Sings the Twelve Days of Christmas
Partly prompted by a programming challenge by Futzle on Mastodon, I thought it might be interesting to try to get my Arduino and SP0256A-AL2 to sing the Twelve Days of Christmas.
https://makertube.net/w/diBkzrhkh3tekAPBhGzrVj
Warning! I strongly recommend using old or second hand equipment for your experiments. I am not responsible for any damage to expensive instruments!
These are the key Arduino tutorials for the main concepts used in this project:
If you are new to Arduino, see the Getting Started pages.
Parts list
The Code
I wasn’t aiming for a clever code solution, as can be seen submitted to the programming competition already, but I was hoping to get the computer to do at least some of the work for me.
The first issue is getting a useful range for the song. My original MIDI SP0256 project managed around an octave and a half. Well it so happens that the 12 Days of Christmas is just over 1 octave, so if I can position that to the top end of the range, I should be ok.
This is the most compact notation of the tune that I know of. This is from the “Christmas Praise” Brass Band carol book, which seems to be one of the most common references for any band out caroling at this time of year.
Ignoring the introduction, I’m going to transpose this into concert Bb (i.e. up a minor third) which gives me a note range from F2 through to G3. This allows me to use a sensible range of the SP0256A without it getting too slow down at the bottom end of things.
The main text/lyric structure will be set up in a series of functions as follows:
intro() - "on the nth day of Christmas my true love gave to me"Some variations are required as follows:
In order to capture the variations and repeats for each verse, I’ve opted to use an increasing bitmask for each time through to trigger the various phrases. Bit 0 always indicates one() must be called. Bit 1 indicates two(), and so on. It starts with the value 1 but will keep adding another bit as the verses change, so will have the values 1, 3, 7, 15, 31, 63, etc. thus allowing me to build up the verses with one bit per verse.
one() takes bool parameters to indicate first time and last time through. two(), three(), four() take a bool parameter to indicate if it is a “post five gold rings” verse. Using the bitmask this is pretty easy as it just means any of the bits 0x0FF0 will be set for verses 5+.
Here is the main code loop.
uint16_t phrase=1;The timings were really quite tricky as I have several variables to work to:
In principle I could probably work out the slowest interval and work back from there to get some accurate timings, but I just did a bit of trial and error on each phrase until it was close enough. The unevenness remaining was because I didn’t want to slow the whole thing down to the slowest phrases being “sung”. It is slow enough already!
Also, as it doesn’t look much, I’ve added an LED to light up at the start of an allophone and to go off whenever a pause is encountered.
Closing Thoughts
I’m actually really pleased with this. It is a good balance of close enough to show the principle without me undertaking complex timing and endless fiddling.
I could probably get a bit cleverer with the code, but that wasn’t really the point for me. I’ve used an algorithm where it mattered to me, and was quite happy to spell out the allophones, frequencies, and timings by hand as I went.
Lastly, let me wish you the compliments of the season, to you and yours.
Kevin
Interesting project.
Thank you 💕 for sharing
#Raspberry #Pi #arduino #programming #audio #raspberrypipico #sp0256aal2
And so, finally, I can drive a SP0256A-AL2 vintage speech chip using a MIDI keyboard.
This uses all the principles from previous posts and my recent Uno Shield PCB.
It really isn't very responsive at all and can only comfortably do an octave and a bit.
But hey, I'm getting an 80s speech synth chip to "sing" :)
https://diyelectromusic.com/2025/09/24/arduino-and-sp0256a-al2-part-6/
#Arduino #MIDI #SP0256AAL2 #JustBecauseYouCanDoesntMeanYouShould
Arduino and SP0256A-AL2 – Part 6
Finally I’m doing something arguably slightly musical with my SP0256A-AL2! Playing it over MIDI.
https://makertube.net/w/wLRxeVHtMatYo7NGWCw54U
Warning! I strongly recommend using old or second hand equipment for your experiments. I am not responsible for any damage to expensive instruments!
If you are new to microcontrollers, see the Getting Started pages.
The Circuit
This is using my Arduino SP0256A-AL2 Shield with an SI5351 programmable clock module, so this is essentially the circuit from Arduino and SP0256A-AL2 – Part 5 with the addition of a MIDI module.
I also used my Arduino MIDI Proto Shield but any MIDI RX circuit on the Arduino RX pin would work.
The same circuit can be made on solderless breadboard, but I’ve opted to use my PCBs for convenience as that is why I designed them in the first place.
The Code
I’m using all the main code from Arduino and SP0256A-AL2 – Part 5 but I’ve split the speaking into “start” and “stop” parts so I can drive them from MIDI NoteOn and NoteOff messages.
The main “speak” code now looks like the following:
void speak (uint8_t note) {So when called with note==0 it will stop the speaking by sending PA3, but for any note between 36 and 56 it will set the frequency and then say the appropriate “Do, Re, Mi” word. I’ve used the same word for the natural and sharp equivalent. I’ve also allowed for two octaves. This is why there are four note values that result in the word “Do” being said: MIDI notes 36, 37 (C2 and C#2), 48, and 49 (C3 and C#3).
This can now be called from the code that handles MIDI Note On and Note Off messages.
Closing Thoughts
It works, but it isn’t very responsive due to the time it takes to say each allophone.
I guess when I started thinking about doing this, I thought I’d get more of a frequency range from the device and wasn’t anticipating it being so “low” in the musical range either.
But it is quite fun to see it finally being driven by a music keyboard, even if it isn’t particularly practical!
I know there is emulation of an SP0256A-AL2 in the RC2040 (an emulation of the RC2014 on a Raspberry Pi Pico) so I might at some point look at seeing if I can just drop the hardware and doing it all in software at some point by adjusting sample and playback rates.
I suspect that will work a lot better, but it isn’t quite the same as driving the real thing 🙂
Kevin
I've stuck my SP0256A-AL2 circuit onto an Uno shield format board.
It has an option for a fixed oscillator or the SI5351 programmable clock and should make any further messing around a bit easier.
https://diyelectromusic.com/2025/09/23/arduino-sp0256a-al2-shield-design/
Arduino SP0256A-AL2 Shield PCB Build Guide
Here are the build notes for my Arduino SP0256A-AL2 Shield Design.
Warning! I strongly recommend using old or second hand equipment for your experiments. I am not responsible for any damage to expensive instruments!
If you are new to electronics and microcontrollers, see the Getting Started pages.
Bill of Materials
Build Steps
Taking a typical “low to high” soldering approach, this is the suggested order of assembly:
It should be decided up front if the board will use a fixed oscillator or a SI5351 programmable clock. Both could be installed, but there is a solder bridge that has to be used to determined which will be used. It isn’t possible to use both at the same time.
This shows the solder bridge configured to use the SI5351. This might be easiest to do prior to soldering other components on the board.
Here are some build photos.
Here is a photo with the oscillator installed, and one with the SI5351 instead.
Note: I didn’t solder the pin headers of the SI5351 to the PCB, but instead used the “fishing line trick” to push the board into the PCB without soldering. This means I have the option of reusing the board again for something else in the future.
By default the SP0256A-AL2 /RESET line is connected to the Arduino RESET pin. It is possible to break this link by cutting the solder bridge shown below and wiring the RESET pad to another Arduino GPIO pin.
Testing
I recommend performing the general tests described here: PCBs.
PCB Errata
There are no known issues with this PCB at this time.
Enhancements:
Sample Applications
Here are some applications to get started with:
Closing Thoughts
Now it is a bit easier to experiment I can explore a few other musical possibilities.
But this has shown up a slight issue with the chips I have. The highest frequency that the chip can support without locking up seems to be somewhat device dependent.
I’ve seen nothing in the datasheet, application manual, or design guide that suggests it will function at all with anything other than a 3.12MHz oscillator, so I am running it quite a bit out of specification now.
Kevin
Arduino SP0256A-AL2 Shield Design
Having spent quite a bit of time with an Arduino hooked up to an SP0256A-AL2 on a solderless breadboard, and now that I’ve got some ideas for how I want to sort out the clock, I thought it time to create a PCB to save the unreliable wiring getting in the way!
Warning! I strongly recommend using old or second hand equipment for your experiments. I am not responsible for any damage to expensive instruments!
If you are new to electronics and microcontrollers, see the Getting Started pages.
The Circuit
This is the basic circuit I’ve been using since Part 1 but I’ve added in an option to support the SI5351 from Part 5 instead of the oscillator, too. A solder jumper selects the clock source – there is no default setting.
There is also a (default closed) solder jumper on the RESET line in case there is a need to separate out the reset of the SP0256A-AL2 from the Arduino.
PCB Design
The PCB design is relatively straight forward. Using an Arduino Uno Shield template, all the components have fitted in quite well.
I had to create a custom symbol and footprint for both the SP0256A-AL2 itself and the SI5351 module I’m using.
The following GPIO pins are in use.
ArduinoSP0256A-AL2D2-D7A1-A6D8/ALDD9SBYGNDVSS, A7, A8, TEST, OSC2+5VVDD, VDI, SE, /SBY_RESET/RESET/RESETSI5351 (Optional)A4SDAA5SCLGNDGND+5VVINAs already mentioned, the link between the two /RESET pins is via a solder jumper and pin header connection which can be broken if required.
I’ve added in additional breakout headers for all GPIO that isn’t connected to the SP0256A-AL2: D0-D1, D10-D13, A0-A3.
I’ve not included A4-A5 as these are connected to the SI5351 (if used).
Closing Thoughts
Hopefully this is a fairly straight forward design with no major surprises.
Kevin