YAMAHA Sound Generator LSI YMZ294 interface

Dependents:   Workshop_SSG

Files at this revision

API Documentation at this revision

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