YAMAHA Sound Generator LSI YMZ294 interface
Revision 0:4d1fe8f35716, committed 2011-07-06
- Comitter:
- yamaguch
- Date:
- Wed Jul 06 09:34:54 2011 +0000
- Commit message:
- 0.9
Changed in this revision
YMZ294.cpp | Show annotated file Show diff for this revision Revisions of this file |
YMZ294.h | Show annotated file Show diff for this revision Revisions of this file |
diff -r 000000000000 -r 4d1fe8f35716 YMZ294.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/YMZ294.cpp Wed Jul 06 09:34:54 2011 +0000 @@ -0,0 +1,63 @@ +#include "YMZ294.h" + +const int ADDR_FREQ[] = {0, 2, 4}; +const int ADDR_NOISE = 6; +const int ADDR_MIXER = 7; +const int ADDR_VOL[] = {8, 9, 10}; +const int ADDR_ENV_FREQ = 11; +const int ADDR_ENV_SHAPE = 13; + +YMZ294::YMZ294(PinName dataPin0, PinName dataPin1, PinName dataPin2, PinName dataPin3, + PinName dataPin4, PinName dataPin5, PinName dataPin6, PinName dataPin7, + PinName csPin, PinName wrPin, PinName a0Pin) : + dataPins(dataPin0, dataPin1, dataPin2, dataPin3, dataPin4, dataPin5, dataPin6, dataPin7), + csPin(csPin), wrPin(wrPin), a0Pin(a0Pin) {} + +void YMZ294::setTone(Channel channel, float freq) { + if (freqs[channel] != freq) { + int tp = 125000.0 / freq; // tp <= 4095 or freq > 30.525 + writeData(ADDR_FREQ[channel], tp, 2); + freqs[channel] = freq; + } +} + +void YMZ294::setVolume(Channel channel, int volume) { + if (volumes[channel] != volume || volume == 16) { + writeData(ADDR_VOL[channel], volume & 0x1F); + volumes[channel] = volume; + } +} + +void YMZ294::setNoise(int freq) { + if (noiseFreq != freq) { + writeData(ADDR_NOISE, freq & 0x1F); + noiseFreq = freq; + } +} + +void YMZ294::setEnvelope(int freq, int shape) { + writeData(ADDR_ENV_FREQ, freq, 2); + writeData(ADDR_ENV_SHAPE, shape); +} + +void YMZ294::setMixer(Mixer m0, Mixer m1, Mixer m2, Mixer m3, Mixer m4, Mixer m5) { + writeData(ADDR_MIXER, m0 & m1 & m2 & m3 & m4 & m5); +} + +void YMZ294::write(char data, bool dataWrite) { + wrPin = 0; + csPin = 0; + a0Pin = dataWrite; + dataPins = data; + wrPin = 1; + csPin = 1; +} + +void YMZ294::writeData(char address, int data, int nBytes) { + write(address); + write(data & 0xFF, true); + while (--nBytes) { + write(++address); + write((data >>= 8) & 0xFF, true); + } +} \ No newline at end of file
diff -r 000000000000 -r 4d1fe8f35716 YMZ294.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/YMZ294.h Wed Jul 06 09:34:54 2011 +0000 @@ -0,0 +1,35 @@ +#ifndef MBED_YMZ294_H +#define MBED_YMZ294_H + +#include "mbed.h" + +enum Channel {CHANNEL_A = 0, CHANNEL_B, CHANNEL_C}; + +enum Mixer {NONE = 0x3F, + TONE_A = ~(1 << 0), TONE_B = ~(1 << 1), TONE_C = ~(1 << 2), + NOISE_A = ~(1 << 3), NOISE_B = ~(1 << 4), NOISE_C = ~(1 << 5) + }; + +class YMZ294 { +public: + YMZ294(PinName dataPin0, PinName dataPin1, PinName dataPin2, PinName dataPin3, + PinName dataPin4, PinName dataPin5, PinName dataPin6, PinName dataPin7, + PinName csPin, PinName wrPin, PinName a0Pin); + void setTone(Channel channel, float freq); + void setVolume(Channel channel, int volume); + void setNoise(int freq); + void setEnvelope(int freq, int shape); + void setMixer(Mixer m0, Mixer m1 = NONE, Mixer m2 = NONE, Mixer m3 = NONE, Mixer m4 = NONE, Mixer m5 = NONE); +private: + void write(char data, bool dataWrite = false); + void writeData(char address, int data, int nBytes = 1); + + BusOut dataPins; + DigitalOut csPin; + DigitalOut wrPin; + DigitalOut a0Pin; + char volumes[3]; + float freqs[3]; + float noiseFreq; +}; +#endif \ No newline at end of file