YAMAHA Sound Generator LSI YMZ294 interface

Dependents:   Workshop_SSG

Committer:
yamaguch
Date:
Wed Jul 06 09:34:54 2011 +0000
Revision:
0:4d1fe8f35716
0.9

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yamaguch 0:4d1fe8f35716 1 #include "YMZ294.h"
yamaguch 0:4d1fe8f35716 2
yamaguch 0:4d1fe8f35716 3 const int ADDR_FREQ[] = {0, 2, 4};
yamaguch 0:4d1fe8f35716 4 const int ADDR_NOISE = 6;
yamaguch 0:4d1fe8f35716 5 const int ADDR_MIXER = 7;
yamaguch 0:4d1fe8f35716 6 const int ADDR_VOL[] = {8, 9, 10};
yamaguch 0:4d1fe8f35716 7 const int ADDR_ENV_FREQ = 11;
yamaguch 0:4d1fe8f35716 8 const int ADDR_ENV_SHAPE = 13;
yamaguch 0:4d1fe8f35716 9
yamaguch 0:4d1fe8f35716 10 YMZ294::YMZ294(PinName dataPin0, PinName dataPin1, PinName dataPin2, PinName dataPin3,
yamaguch 0:4d1fe8f35716 11 PinName dataPin4, PinName dataPin5, PinName dataPin6, PinName dataPin7,
yamaguch 0:4d1fe8f35716 12 PinName csPin, PinName wrPin, PinName a0Pin) :
yamaguch 0:4d1fe8f35716 13 dataPins(dataPin0, dataPin1, dataPin2, dataPin3, dataPin4, dataPin5, dataPin6, dataPin7),
yamaguch 0:4d1fe8f35716 14 csPin(csPin), wrPin(wrPin), a0Pin(a0Pin) {}
yamaguch 0:4d1fe8f35716 15
yamaguch 0:4d1fe8f35716 16 void YMZ294::setTone(Channel channel, float freq) {
yamaguch 0:4d1fe8f35716 17 if (freqs[channel] != freq) {
yamaguch 0:4d1fe8f35716 18 int tp = 125000.0 / freq; // tp <= 4095 or freq > 30.525
yamaguch 0:4d1fe8f35716 19 writeData(ADDR_FREQ[channel], tp, 2);
yamaguch 0:4d1fe8f35716 20 freqs[channel] = freq;
yamaguch 0:4d1fe8f35716 21 }
yamaguch 0:4d1fe8f35716 22 }
yamaguch 0:4d1fe8f35716 23
yamaguch 0:4d1fe8f35716 24 void YMZ294::setVolume(Channel channel, int volume) {
yamaguch 0:4d1fe8f35716 25 if (volumes[channel] != volume || volume == 16) {
yamaguch 0:4d1fe8f35716 26 writeData(ADDR_VOL[channel], volume & 0x1F);
yamaguch 0:4d1fe8f35716 27 volumes[channel] = volume;
yamaguch 0:4d1fe8f35716 28 }
yamaguch 0:4d1fe8f35716 29 }
yamaguch 0:4d1fe8f35716 30
yamaguch 0:4d1fe8f35716 31 void YMZ294::setNoise(int freq) {
yamaguch 0:4d1fe8f35716 32 if (noiseFreq != freq) {
yamaguch 0:4d1fe8f35716 33 writeData(ADDR_NOISE, freq & 0x1F);
yamaguch 0:4d1fe8f35716 34 noiseFreq = freq;
yamaguch 0:4d1fe8f35716 35 }
yamaguch 0:4d1fe8f35716 36 }
yamaguch 0:4d1fe8f35716 37
yamaguch 0:4d1fe8f35716 38 void YMZ294::setEnvelope(int freq, int shape) {
yamaguch 0:4d1fe8f35716 39 writeData(ADDR_ENV_FREQ, freq, 2);
yamaguch 0:4d1fe8f35716 40 writeData(ADDR_ENV_SHAPE, shape);
yamaguch 0:4d1fe8f35716 41 }
yamaguch 0:4d1fe8f35716 42
yamaguch 0:4d1fe8f35716 43 void YMZ294::setMixer(Mixer m0, Mixer m1, Mixer m2, Mixer m3, Mixer m4, Mixer m5) {
yamaguch 0:4d1fe8f35716 44 writeData(ADDR_MIXER, m0 & m1 & m2 & m3 & m4 & m5);
yamaguch 0:4d1fe8f35716 45 }
yamaguch 0:4d1fe8f35716 46
yamaguch 0:4d1fe8f35716 47 void YMZ294::write(char data, bool dataWrite) {
yamaguch 0:4d1fe8f35716 48 wrPin = 0;
yamaguch 0:4d1fe8f35716 49 csPin = 0;
yamaguch 0:4d1fe8f35716 50 a0Pin = dataWrite;
yamaguch 0:4d1fe8f35716 51 dataPins = data;
yamaguch 0:4d1fe8f35716 52 wrPin = 1;
yamaguch 0:4d1fe8f35716 53 csPin = 1;
yamaguch 0:4d1fe8f35716 54 }
yamaguch 0:4d1fe8f35716 55
yamaguch 0:4d1fe8f35716 56 void YMZ294::writeData(char address, int data, int nBytes) {
yamaguch 0:4d1fe8f35716 57 write(address);
yamaguch 0:4d1fe8f35716 58 write(data & 0xFF, true);
yamaguch 0:4d1fe8f35716 59 while (--nBytes) {
yamaguch 0:4d1fe8f35716 60 write(++address);
yamaguch 0:4d1fe8f35716 61 write((data >>= 8) & 0xFF, true);
yamaguch 0:4d1fe8f35716 62 }
yamaguch 0:4d1fe8f35716 63 }