Download free music MP3s on genuine quality, the world’s largest online music catalogue, powered by your scrobbles. Free listening, videos, photos, The world’s largest online music catalogue, powered by your scrobbles. Free listening, videos, photos, stats, charts, biographies and concerts. stats, charts, biographies and concerts.
Saturday, July 5, 2025
Arduino and AY-3-8910
I've had some AY-3-8910 programmable sound generators for a while and planned to do something with them, but they've sat in the "to think about" box for a while. But recently getting hold of the WhyEm sound card for the RC2014 has re-awakened my intere…
I've had some AY-3-8910 programmable sound generators for a while and planned to do something with them, but they've sat in the "to think about" box for a while. But recently getting hold of the WhyEm sound card for the RC2014 has re-awakened my interest.
This is some "first looks" experiments with the AY-3-8910 and an Arduino.
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 tutorials for the main concepts used in this project:
Either GadgetReboot's PCB or patch using solderless breadboard or prototyping boards.
The AY-3-8910 PSG
The AY-3-8910 programmable sound generator is quite an iconic chip of its time. Not as popular maybe as the SID used in the Commodore 64, but still pretty widespread use in 8-bit computers of the time and apparently a number of arcade machines too.
There are a number of "compatible" chips, including the Yamaha YM2149. There is also the AY-3-8912 which is the same as the 8910 but without one of the general purpose IO ports, which take no part in the sound generation.
I'm not going to go into the details of the device itself, for that I'll refer to the following resources:
The summary of the specification though is as follows:
Three square wave output channels.
Global AD envelope generator, with a selection of fixed envelopes.
Noise generator an option on the channels.
Mixer.
There is an 8-bit data register interface to the chip along with three control signals (BDIR, BC1 and BC2).
I should point out that it isn't possible to buy new AY-3-8910 or YM2419 chips these days, so any that can be found online are almost certainly reclaimed from older hardware. These may or may not work reliably, but it will be a bit of a lottery.
But there is a PCB that was designed by GadgetReboot here: https://github.com/GadgetReboot/AY-3-8910. This can be ordered directly from PCBWay and so that is what I've used.
The only thing to watch out for, is that D2/D3 are reversed compared to the protoboard hardware. So whilst all other pin definitions in the library examples are fine, D2 and D3 need to be swapped to use them with the PCB.
I also didn't bother to add the power LED (and R5), the toggle switch or the additional header pins.
The full pinout interface for the Arduino is as follows:
AY-3-8910
Arduino
DA0-DA7
D2-D8, A3
BC1
A0
BC2
A1
BDIR
A2
CLOCK
D9
The most critical one from a re-use point of view is the clock as the code uses the ATmega328P hardware Timer 1 to output a 50% duty cycle PWM signal on output OC1A (D9) to generate the 1MHz clock required by the AY-3-8910.
Using a different microcontroller will mean re-writing this part of the code for a suitable replacement timer.
The Code
Taking the "AY3891x_EX3_Simple_Tone" example as a starting point, the following line needs updating as shown below:
// Original line AY3891x psg( 17, 8, 7, 6, 5, 4, 2, 3, 16, 15, 14);
// Required for use with the PCB AY3891x psg( 17, 8, 7, 6, 5, 4, 3, 2, 16, 15, 14);
I also switch any Serial.begin() statements to use 9600 baud for preference too.
With these changes, the simple tone example just works, as does the "AY3891x_EX8_Check_Orig_or_Clone", which tells me I have an AY-3-8910 rather than a YM2149.
But what I really wanted was to play one of the tunes from a game I remembered. My first introduction to AY-3-8910 music was the 128K Spectrum version of The Neverending Story. This was one of the two games that came bundled with the original machine, and for someone used to the 48K beeps and boops it was an amazing upgrade.
Unfortunately I don't seem able at present to find a "YM" file version of that tune to play, so instead I turned to a David Whittaker classic - "Glider Rider". The "YM Jukebox" GitHub repository has a whole pile of YM files ready to use here: https://github.com/nguillaumin/ym-jukebox/tree/master/data/David%20Whittaker
There are (I believe) two key ways to get "chiptunes" for the AY-3-8910. A YM file is a stream of the register values sent to the chip to direct the sound generation. With one of these files, it is simply a case of turning these values into a C array and it can be included in an Arduino sketch (there are several steps required, see below, but it is all doable).
Another common way to get tunes is an "AY" file. As I understand things these are the actual Z80 assembler instructions required to drive the AY-3-8910 chip, so extracting the required data for use on another system is not so easy. These are really designed to be used on the original systems or via emulation.
Take the resulting const PROGMEM structure into the "chiptunes.h" file of the "AY3891x_EX6_Chiptunes_Flash" example sketch.
Note that due to the memory limitations of the Arduino Nano, the resulting C structure for the tune will have to be cut-off at around 2000 lines, but be sure to leave the termnating part of the structure:
If there are build errors, then it might be because the structure is still too long. 2000 lines fits for me using around 97% of the programme memory of the Arduino Nano.
If full (longer) tunes are required, then the PCB has the option to hook up to an SD card and longer files can be stored there.
Closing Thoughts
I've really not done very much myself this time. The PCB was from GadgetReboot. The library from Andy4495. The tune data provided by the YM jukebox and all other scripts and bits of the process were available online.
Now I need to decide what I'd like to do with all this.
No comments:
Post a Comment