Here's a brief technical writeup of the slide show
presentation tool I built for my Elements
of Chip Music seminar.
The board is built around a Propeller microcontroller, along with an
8 kB EEPROM and a 12-bit DAC chip. An SD card is attached using a poor
man's SD card socket. This card stores the presentation slides and the sound
clips in a raw block-based format, meaning there's no proper filesystem.
The cogs are used in the following way:
|0||Waiting for keypresses, preparing the video memory, animating the transitions.|
|1||SD card driver.|
Video is represented as two tables of line references (front and back
buffer), each line reference indicating a starting position in the character
grid (a separate RAM buffer), the Y offset within the character row,
brightness and a double-width flag. The characters are just byte
references into the font, which consists of the built-in Propeller font and
some additional graphical characters placed near the top of the RAM.
Audio is streamed from the SD card, meaning that the audio cog plays from
one buffer and instructs the SD card cog to simultaneously read the next block
into another buffer.
The slides are described using a primitive markup language, which is
compiled (on the host computer) into a card image. The image is then transferred
to the card using dd(1). The markup language allows each slide to refer
to a wav file, along with a volume adjustment parameter. The compiler
converts each wav file into raw 44.1 kHz mono audio, scaling each
sample by the requested volume factor.
Here's an excerpt from the slide description file:
Waveforms: Only a handful of timbres
Waveform design approach #2:
\* Take a cheap function:
Square wave (1-bit triangle)
\* Add a parameter \x03 pulse wave
The first line indicates that a "raw slide" will follow. This is the only
slide format supported so far. The second line instructs the compiler to read a
file called "clips/pulse.wav" and scale its volume by 25%. The remaining lines
make up the slide contents. Some characters are entered using special syntax:
\* is a solid bullet, \x03 is an arrow and \I is a
The entire presentation, including sound clips, ended up fitting into
approximately 40 MB, a rather small corner of the SD card.
Since the Propeller doesn't know how to boot directly from an SD card,
an EEPROM chip is needed. I had a couple of 8 kB chips lying around, and
the code fits. However, for some reason either the Propeller or the downloading
tool I used wouldn't work with an EEPROM of less than 32 kB, so I had to
write a wrapper program which, after being downloaded into the Propeller RAM,
would in turn write the actual program into the EEPROM chip.