diff --git a/stella/Makefile b/stella/Makefile index 870be5acb..2f39a3f25 100644 --- a/stella/Makefile +++ b/stella/Makefile @@ -13,7 +13,7 @@ ## See the file "license" for information on usage and redistribution of ## this file, and for a DISCLAIMER OF ALL WARRANTIES. ## -## $Id: Makefile,v 1.24 2006-06-09 02:45:11 urchlay Exp $ +## $Id: Makefile,v 1.25 2006-06-11 07:13:19 urchlay Exp $ ## ## Based on code from ScummVM - Scumm Interpreter ## Copyright (C) 2002-2004 The ScummVM project @@ -28,7 +28,7 @@ srcdir ?= . DEFINES := LDFLAGS := INCLUDES := -LIBS := +LIBS := -Lsrc/emucore -lrsynth OBJS := PROF := @@ -67,6 +67,7 @@ endif ####################################################################### EXECUTABLE := stella$(EXEEXT) +RSYNTH = src/emucore/librsynth.a all: tags $(EXECUTABLE) @@ -92,6 +93,10 @@ MODULES += \ src/gui \ src/common +$(RSYNTH): $(RSYNTH_OBJS) + ( cd src/emucore/rsynth && ./configure && make Rsynth/librsynth.a ) && \ + cp src/emucore/rsynth/Rsynth/librsynth.a src/emucore + ###################################################################### # The build rules follow - normally you should have no need to # touch whatever comes after here. @@ -108,7 +113,7 @@ DEPDIRS = $(addsuffix /$(DEPDIR),$(MODULE_DIRS)) DEPFILES = # The build rule for the Stella executable -$(EXECUTABLE): $(OBJS) +$(EXECUTABLE): $(OBJS) $(RSYNTH) $(LD) $(LDFLAGS) $(PRE_OBJS_FLAGS) $+ $(POST_OBJS_FLAGS) $(LIBS) $(PROF) -o $@ distclean: clean diff --git a/stella/src/emucore/AtariVox.cxx b/stella/src/emucore/AtariVox.cxx index b6c750491..ed3b4a39e 100644 --- a/stella/src/emucore/AtariVox.cxx +++ b/stella/src/emucore/AtariVox.cxx @@ -13,22 +13,27 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: AtariVox.cxx,v 1.1 2006-06-09 02:45:11 urchlay Exp $ +// $Id: AtariVox.cxx,v 1.2 2006-06-11 07:13:19 urchlay Exp $ //============================================================================ #include "Event.hxx" #include "AtariVox.hxx" +#include "SpeakJet.hxx" -#define DEBUG_ATARIVOX 1 +#define DEBUG_ATARIVOX 0 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - AtariVox::AtariVox(Jack jack, const Event& event) : Controller(jack, event), + mySpeakJet(0), + mySystem(0), myPinState(0), + myShiftCount(0), myShiftRegister(0), - myShiftCount(0) + myLastDataWriteCycle(0) { myType = Controller::AtariVox; + mySpeakJet = new SpeakJet(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -36,6 +41,11 @@ AtariVox::~AtariVox() { } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void AtariVox::setSystem(System *system) { + mySystem = system; +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool AtariVox::read(DigitalPin pin) { @@ -54,6 +64,72 @@ Int32 AtariVox::read(AnalogPin) return maximumResistance; } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void AtariVox::clockDataIn(bool value) +{ + // bool oldValue = myPinState & 0x01; + myPinState = (myPinState & 0xfe) | value; + + uInt32 cycle = mySystem->cycles(); + if(DEBUG_ATARIVOX) + cerr << "AtariVox: value " + << value + << " written to DATA line at " + << mySystem->cycles() + << " (-" + << myLastDataWriteCycle + << "==" + << (mySystem->cycles() - myLastDataWriteCycle) + << ")" + << endl; + + if(value && (myShiftCount == 0)) { + if(DEBUG_ATARIVOX) + cerr << "value && (myShiftCount == 0), returning" << endl; + return; + } + + if(cycle < myLastDataWriteCycle || cycle > myLastDataWriteCycle + 1000) { + // If this is the first write this frame, or if it's been a long time + // since the last write, start a new data byte. + myShiftRegister = 0; + myShiftCount = 0; + } + + if(cycle < myLastDataWriteCycle || cycle >= myLastDataWriteCycle + 62) { + // If this is the first write this frame, or if it's been 62 cycles + // since the last write, shift this bit into the current byte. + if(DEBUG_ATARIVOX) + cerr << "cycle >= myLastDataWriteCycle + 62, shiftIn(" + << value << ")" << endl; + shiftIn(value); + } + + myLastDataWriteCycle = cycle; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void AtariVox::shiftIn(bool value) +{ + myShiftRegister >>= 1; + myShiftRegister |= (value << 15); + if(++myShiftCount == 10) { + myShiftCount = 0; + myShiftRegister >>= 6; + if(!(myShiftRegister & (1<<9))) + cerr << "AtariVox: bad start bit" << endl; + else if((myShiftRegister & 1)) + cerr << "AtariVox: bad stop bit" << endl; + else + { + uInt8 data = ((myShiftRegister >> 1) & 0xff); + cerr << "AtariVox: output byte " << ((int)(data)) << endl; + mySpeakJet->write(data); + } + myShiftRegister = 0; + } +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void AtariVox::write(DigitalPin pin, bool value) { @@ -66,25 +142,7 @@ void AtariVox::write(DigitalPin pin, bool value) // Pin 1 is the DATA line, used to output serial data to the // speakjet case One: - if(DEBUG_ATARIVOX) - cerr << "AtariVox: value " << value << " written to DATA line" << endl; - myShiftRegister >>= 1; - myShiftRegister |= (value << 15); - // cerr << myShiftRegister << endl; - if(++myShiftCount == 10) { - myShiftCount = 0; - myShiftRegister >>= 6; - // cerr << "(<<6) == " << myShiftRegister << endl; - if(!(myShiftRegister & (1<<9))) - cerr << "AtariVox: bad start bit" << endl; - else if((myShiftRegister & 1)) - cerr << "AtariVox: bad stop bit" << endl; - else - cerr << "AtariVox: output byte " - << ((myShiftRegister >> 1) & 0xff) - << endl; - myShiftRegister = 0; - } + clockDataIn(value); break; // Pin 2 is the SDA line, used to output data to the 24LC256 @@ -92,10 +150,25 @@ void AtariVox::write(DigitalPin pin, bool value) // I'm not even trying to emulate this right now :( case Two: if(DEBUG_ATARIVOX) - cerr << "AtariVox: value " << value << " written to SDA line" << endl; + cerr << "AtariVox: value " + << value + << " written to SDA line at cycle " + << mySystem->cycles() + << endl; break; + // Pin 2 is the SCLK line, used to output clock data to the 24LC256 + // serial EEPROM, using the I2C protocol. + // I'm not even trying to emulate this right now :( case Three: + if(DEBUG_ATARIVOX) + cerr << "AtariVox: value " + << value + << " written to SCLK line at cycle " + << mySystem->cycles() + << endl; + break; + case Four: default: break; diff --git a/stella/src/emucore/AtariVox.hxx b/stella/src/emucore/AtariVox.hxx index b5c21237d..b4f29a8f0 100644 --- a/stella/src/emucore/AtariVox.hxx +++ b/stella/src/emucore/AtariVox.hxx @@ -14,21 +14,26 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: AtariVox.hxx,v 1.1 2006-06-09 02:45:11 urchlay Exp $ +// $Id: AtariVox.hxx,v 1.2 2006-06-11 07:13:19 urchlay Exp $ //============================================================================ #ifndef ATARIVOX_HXX #define ATARIVOX_HXX #include "bspf.hxx" +#include "System.hxx" #include "Control.hxx" +#include "SpeakJet.hxx" /** - Alex Herbert's AtariVox "controller": A speech synthesizer and + Richard Hutchinson's AtariVox "controller": A speech synthesizer and storage device. + This code owes a great debt to Alex Herbert's AtariVox documentation and + driver code. + @author B. Watson - @version $Id: AtariVox.hxx,v 1.1 2006-06-09 02:45:11 urchlay Exp $ + @version $Id: AtariVox.hxx,v 1.2 2006-06-11 07:13:19 urchlay Exp $ */ class AtariVox : public Controller { @@ -76,18 +81,49 @@ class AtariVox : public Controller */ virtual void write(DigitalPin pin, bool value); + void setSystem(System *system); + + private: + void clockDataIn(bool value); + void shiftIn(bool value); + + private: + // How far off (in CPU cycles) can each write occur from when it's + // supposed to happen? Eventually, this will become a user-settable + // property... or it may turn out to be unnecessary. + enum { TIMING_SLOP = 0 }; + + private: + // Instance of SpeakJet which will actually do the talking for us. + // In the future, we'll support both real and emulated SpeakJet + // chips; for now we only emulate it. + SpeakJet *mySpeakJet; + + // Hang on to a reference to the system, for timing purposes. Data + // bits are supposed to come in 62 CPU cycles apart (plus or minus + // TIMING_SLOP), so we need to be able to call mySystem.cycles(). + System *mySystem; + private: // State of the output pins uInt8 myPinState; + // How many bits have been shifted into the shift register? + uInt8 myShiftCount; + + private: // Shift register. Data comes in serially: // 1 start bit, always 0 // 8 data bits, LSB first - // 1 stop bit, always 0 + // 1 stop bit, always 1 uInt16 myShiftRegister; - // How many bits have been shifted into the shift register? - uInt8 myShiftCount; + private: + // When did the last data write start, in CPU cycles? + // The real SpeakJet chip reads data at 19200 bits/sec. Alex's + // driver code sends data at 62 CPU cycles per bit, which is + // "close enough". + uInt32 myLastDataWriteCycle; }; #endif diff --git a/stella/src/emucore/Console.cxx b/stella/src/emucore/Console.cxx index 1aa6a259e..b3626737a 100644 --- a/stella/src/emucore/Console.cxx +++ b/stella/src/emucore/Console.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: Console.cxx,v 1.90 2006-06-09 02:45:11 urchlay Exp $ +// $Id: Console.cxx,v 1.91 2006-06-11 07:13:19 urchlay Exp $ //============================================================================ #include @@ -141,6 +141,8 @@ Console::Console(const uInt8* image, uInt32 size, const string& md5, myControllers[0] = new Joystick(leftjack, *myEvent); } + AtariVox *vox = 0; + // Construct right controller if(right == "BOOSTER-GRIP") { @@ -160,7 +162,7 @@ Console::Console(const uInt8* image, uInt32 size, const string& md5, } else if(right == "ATARIVOX") { - myControllers[1] = new AtariVox(rightjack, *myEvent); + myControllers[1] = vox = new AtariVox(rightjack, *myEvent); } else { @@ -182,6 +184,11 @@ Console::Console(const uInt8* image, uInt32 size, const string& md5, // Now, we can construct the system and components mySystem = new System(13, 6); + // AtariVox is a smart peripheral; it needs access to the system + // cycles counter, so it needs a reference to the System + if(vox) + vox->setSystem(mySystem); + M6502* m6502; if(myOSystem->settings().getString("cpu") == "low") m6502 = new M6502Low(1); diff --git a/stella/src/emucore/SpeakJet.cxx b/stella/src/emucore/SpeakJet.cxx new file mode 100644 index 000000000..363d1c036 --- /dev/null +++ b/stella/src/emucore/SpeakJet.cxx @@ -0,0 +1,163 @@ +//============================================================================ +// +// SSSS tt lll lll +// SS SS tt ll ll +// SS tttttt eeee ll ll aaaa +// SSSS tt ee ee ll ll aa +// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" +// SS SS tt ee ll ll aa aa +// SSSS ttt eeeee llll llll aaaaa +// +// Copyright (c) 1995-2005 by Bradford W. Mott and the Stella team +// +// See the file "license" for information on usage and redistribution of +// this file, and for a DISCLAIMER OF ALL WARRANTIES. +// +// $Id: SpeakJet.cxx,v 1.1 2006-06-11 07:13:19 urchlay Exp $ +//============================================================================ + +#include "SpeakJet.hxx" + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +SpeakJet::SpeakJet() +{ + spawnThread(); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +SpeakJet::~SpeakJet() +{ +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void SpeakJet::spawnThread() +{ + ourThread = SDL_CreateThread(thread, 0); + ourInputSemaphore = SDL_CreateSemaphore(1); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +int SpeakJet::thread(void *data) { + cerr << "rsynth thread spawned" << endl; + return 0; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void SpeakJet::write(uInt8 code) +{ + const char *rsynthPhones = xlatePhoneme(code); + cerr << "rsynth: \"" << rsynthPhones << "\"" << endl; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +const char *SpeakJet::xlatePhoneme(uInt8 code) +{ + if(code <= 6) + return " "; + + if(code >= 128 && code <= 199) + return ourPhonemeTable[ code - 128 ]; + + return ""; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +uInt8 *SpeakJet::getSamples(int *count) { + *count = 0; + return 0; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool SpeakJet::chipReady() +{ + return true; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +/* +Table of rsynth phonemes, indexed by SpeakJet phoneme code number. +Table is offset by 128 bytes (ourPhonemeTable[0] is code #128) +see rsynth/phones.def for definitions of rsynth phonemes. +We prefix a "'" to the rsynth phoneme for stress or a "," +for relax. +FIXME: This will need a lot of tweaking, once I get a real +SpeakJet to test with. +*/ + +const char *SpeakJet::ourPhonemeTable[] = { +//"rsynth phoneme(s) (phones.def)", // SJ phonemes (p. 16 in SJ manual) + "i:", // 128 IY See, Even, Feed + "I", // 129 IH Sit, Fix, Pin + "eI", // 130 EY Hair, Gate, Beige + "E", // 131 EH Met, Check, Red + "{", // 132 AY Hat, Fast, Fan + "A:", // 133 AX Cotten // maybe "@" instead? + "V", // 134 UX Luck, Up, Uncle + "Q", // 135 OH Hot, Clock, Fox + "A:", // 136 AW Father, Fall + "oU", // 137 OW Comb, Over, Hold + "U", // 138 UH Book, Could, Should + "u:", // 139 UW Food, June + "m", // 140 MM Milk, Famous, + "n", // 141 NE Nip, Danger, Thin + "n", // 142 NO No, Snow, On + "N", // 143 NGE Think, Ping + "N", // 144 NGO Hung, Song + "l", // 145 LE Lake, Alarm, Lapel + "l", // 146 LO Clock, Plus, Hello + "w", // 147 WW Wool, Sweat + "r", // 148 RR Ray, Brain, Over + "I@", // 149 IYRR Clear, Hear, Year + "e@", // 150 EYRR Hair, Stair, Repair + "3:", // 151 AXRR Fir, Bird, Burn + "A:", // 152 AWRR Part, Farm, Yarn + "Qr", // 153 OWRR Corn, Four, Your [*] + "eI", // 154 EYIY Gate, Ate, Ray + "aI", // 155 OHIY Mice, Fight, White + "OI", // 156 OWIY Boy, Toy, Voice + "aI", // 157 OHIH Sky, Five, I + "j", // 158 IYEH Yes, Yarn, Million + "el", // 159 EHLL Saddle, Angle, Spell [*] + "U@", // 160 IYUW Cute, Few // maybe u + "aU", // 161 AXUW Brown, Clown, Thousan + "U@", // 162 IHWW Two, New, Zoo + "aU", // 163 AYWW Our, Ouch, Owl + "@U", // 164 OWWW Go, Hello, Snow // maybe "oU"? + "dZ", // 165 JH Dodge, Jet, Savage + "v", // 166 VV Vest, Even, + "z", // 167 ZZ Zoo, Zap + "Z", // 168 ZH Azure, Treasure + "D", // 169 DH There, That, This + "b", // 170 BE Bear, Bird, Beed ??? + "b", // 171 BO Bone, Book Brown ??? + "b", // 172 EB Cab, Crib, Web ??? + "b", // 173 OB Bob, Sub, Tub ??? + "d", // 174 DE Deep, Date, Divide ??? + "d", // 175 DO Do, Dust, Dog ??? + "d", // 176 ED Could, Bird ??? + "d", // 177 OD Bud, Food ??? + "g", // 178 GE Get, Gate, Guest, ??? + "g", // 179 GO Got, Glue, Goo ??? + "g", // 180 EG Peg, Wig ??? + "g", // 181 OG Dog, Peg ??? + "tS", // 182 CH Church, Feature, March + "h", // 183 HE Help, Hand, Hair + "h", // 184 HO Hoe, Hot, Hug + "hw", // 185 WH Who, Whale, White [*] + "f", // 186 FF Food, Effort, Off + "s", // 187 SE See, Vest, Plus + "s", // 188 SO So, Sweat ??? + "S", // 189 SH Ship, Fiction, Leash + "T", // 190 TH Thin, month + "t", // 191 TT Part, Little, Sit + "t", // 192 TU To, Talk, Ten + "ts", // 193 TS Parts, Costs, Robots + "k", // 194 KE Can't, Clown, Key + "k", // 195 KO Comb, Quick, Fox ??? + "k", // 196 EK Speak, Task ??? + "k", // 197 OK Book, Took, October ??? + "p", // 198 PE People, Computer + "p" // 199 PO Paw, Copy ??? +}; + diff --git a/stella/src/emucore/SpeakJet.hxx b/stella/src/emucore/SpeakJet.hxx new file mode 100644 index 000000000..94bb9d1b2 --- /dev/null +++ b/stella/src/emucore/SpeakJet.hxx @@ -0,0 +1,187 @@ +//============================================================================ +// +// SSSS tt lll lll +// SS SS tt ll ll +// SS tttttt eeee ll ll aaaa +// SSSS tt ee ee ll ll aa +// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" +// SS SS tt ee ll ll aa aa +// SSSS ttt eeeee llll llll aaaaa +// +// Copyright (c) 1995-2005 by Bradford W. Mott and the Stella team +// +// See the file "license" for information on usage and redistribution of +// this file, and for a DISCLAIMER OF ALL WARRANTIES. +// +// $Id: SpeakJet.hxx,v 1.1 2006-06-11 07:13:19 urchlay Exp $ +//============================================================================ + +#ifndef SPEAKJET_HXX +#define SPEAKJET_HXX + +/** + Emulation of the Magnevation SpeakJet. + This is the speech synthesizer chip used in the AtariVox. + See AtariVox.hxx and .cxx for AtariVox specifics. + + This class doesn't attempt 100% accurate emulation of the SpeakJet, + as the chip contains a proprietary algorithm that does some complex + modelling (in other words, it doesn't just string samples together). + For this emulation, I use a library called rsynth, which does something + similar (models the human vocal/nasal tract), but is implemented + in a totally different way. You might say I'm emulating the spirit + of the SpeakJet, not the letter :) + + Implementation details: + + Both rsynth and the SpeakJet take a stream of phoneme codes and produce + audio output. + + My SpeakJet class accepts the SpeakJet phonemes, one at a time, and + translates them to rsynth phonemes (which are not quite one-to-one + equivalent). As each phoneme is translated, it's added to a phoneme + buffer. + + Because of the way rsynth is implemented, it needs a full word's worth + of phonemes in its buffer before its speech function is called. This + means I'll only call rsynth_phones() when I receive a SpeakJet code that + indicates a pause, or end-of-word, or a control code (set parameters + or such). This will result in a slight delay (typically, games will + send one SJ code per frame). + + Also due to rsynth's implementation, I have to run it in a thread. This + is because rsynth_phones() is a monolithic function that needs a string + of phonemes, and takes a while to run (for the word "testing", it takes + 1/4 second on an Athlon 64 @ 1800MHz). We can't have the emulator pause + for a quarter second while this happens, so I'll call rsynth_phones() + in a separate thread, and have it fill a buffer from which our main + thread will pull as much data as it needs. A typical word will be + 30-40 thousand samples, and we only need fragsize/2 samples at a time. + + As always when using threads, there will be locking in play... + + rsynth's output is always 16-bit samples. This class will have to + convert them to 8-bit samples before feeding them to the SDL audio + buffer. + + When using the AtariVox, we'll use SDL stereo sound. The regular TIA + sound will come out the left channel, and the speech will come out + the right. This isn't ideal, but it's the easiest way to mix the two + (I don't want to add an SDL_mixer dependency). The real SpeakJet uses a + separate speaker from the 2600 (the 2600 TIA sound comes from the TV, + the SJ sound comes from a set of PC speakers), so splitting them to + the left and right channels isn't unreasonable... However, it means + no game can simultaneously use stereo sound and the AtariVox (for now, + anyway). + + @author B. Watson + @version $Id: SpeakJet.hxx,v 1.1 2006-06-11 07:13:19 urchlay Exp $ +*/ + +#include "bspf.hxx" + +extern "C" { +#include +#include +#include "rsynth/rsynth.h" +} + +class SpeakJet +{ + public: + /** + Create a new SpeakJet with given buffer size. We use a circular linked + list of fixed size, each node being a buffer of bufferSize 8-bit + samples. + + @param bufferSize The size of each output buffer, presumably equal + to fragsize/2. + */ + SpeakJet(); + + ~SpeakJet(); + + public: + /** + Writes a SpeakJet phoneme (or other code). + These are the codes from page 16 of the Speaket User Manual. + Not all codes are emulated. In particular, the non-speech noises + (200 thru 254) will be treated as silence. Also, not all the + control codes will actually work (will document later). + + @param code The SpeakJet code being written to the emulated chip + */ + void write(uInt8 code); + + /** + Returns a buffer full of 8-bit samples. This should be called every + frame or so, or else the older buffers will get overwritten by new + data. + + @param count This will be set to the number of samples that are + returned. Value ranges from 0 to bufferSize. + */ + uInt8 *getSamples(int *count); + + /** + Returns false if the phonemeBuffer is full, true otherwise. + */ + bool chipReady(); + + // function that spawns the rsynth thread + void spawnThread(); + + // function that the rsynth thread runs... + static int thread(void *data); + + private: + enum { INPUT_BUFFER_SIZE = 128 }; + uInt16 myBufferSize; + + // True if last code was 20 thru 29 + bool needParameter; + + // phonemeBuffer holds *translated* phonemes (e.g. rsynth phonemes, + // not SpeakJet phonemes). + char phonemeBuffer[INPUT_BUFFER_SIZE]; + uInt8 phonemeCount; // number of phonemes in the phonemeBuffer + + static const char *ourPhonemeTable[]; + + SDL_Thread *ourThread; + + // We use this semaphore like so: + // Main thread locks it initially + // Main thread gathers up phonemes, storing in the input buffer, + // until it hits a pause/space, + // then unlocks the semaphore. + // The rsynth thread blocks on the semaphore until the main thread + // is done feeding data into the buffer. + // When the rsynth thread unblocks, it quickly copies the buffer to + // a private buffer, then unlocks the semaphore so the main thread + // can re-use the buffer. + SDL_sem *ourInputSemaphore; + + // Each output buffer also needs its own locking semaphore: + // rsynth thread locks each buffer as it fills it, then unlocks it + // when it's done, and moves on to the next buffer in the circular + // list (blocking if it's locked). + + // When the main thread is ready to play audio, it grabs its idea + // of what the next buffer is (blocking if it's locked), locks it, mixes + // its contents with the TIA audio data (if it's not an empty buffer), + // clears the buffer, then unlocks it. + // Note that, if the rsynth thread has been sleeping a while, all + // the buffers might be empty. + + // When the rsynth thread runs out of input, it should probably + // listen on a condition, so it can be woken up when there's something + // to do. + + private: + // Convert a SpeakJet phoneme into one or more rsynth phonemes. + // Input range is 0 to 255, but not all codes are supported yet. + static const char *xlatePhoneme(uInt8 code); +}; + +#endif diff --git a/stella/src/emucore/module.mk b/stella/src/emucore/module.mk index 9e3728c43..8c50e2e76 100644 --- a/stella/src/emucore/module.mk +++ b/stella/src/emucore/module.mk @@ -45,6 +45,7 @@ MODULE_OBJS := \ src/emucore/Random.o \ src/emucore/Serializer.o \ src/emucore/Settings.o \ + src/emucore/SpeakJet.o \ src/emucore/Switches.o \ src/emucore/TIA.o \ src/emucore/TIASnd.o \ diff --git a/stella/src/emucore/rsynth/6, b/stella/src/emucore/rsynth/6, new file mode 100644 index 000000000..7cfab5b05 --- /dev/null +++ b/stella/src/emucore/rsynth/6, @@ -0,0 +1 @@ +yes diff --git a/stella/src/emucore/rsynth/COPYING b/stella/src/emucore/rsynth/COPYING new file mode 100644 index 000000000..60549be51 --- /dev/null +++ b/stella/src/emucore/rsynth/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/stella/src/emucore/rsynth/COPYING.LIB b/stella/src/emucore/rsynth/COPYING.LIB new file mode 100644 index 000000000..161a3d1d4 --- /dev/null +++ b/stella/src/emucore/rsynth/COPYING.LIB @@ -0,0 +1,482 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/stella/src/emucore/rsynth/Change.log b/stella/src/emucore/rsynth/Change.log new file mode 100644 index 000000000..e1a5d4ead --- /dev/null +++ b/stella/src/emucore/rsynth/Change.log @@ -0,0 +1,741 @@ +Change 2707 on 2003/07/06 by nick@llama + + SuSE 8.2 and gcc-3.* support + Mainly adding -fno-scrict-aliasing and removing -Werrors (for now) + +Change 2636 on 2003/01/08 by nick@nickwork + + Some tidy up on RedHat 7.1 + +Change 2635 on 2003/01/07 by nick@dromedary + + Depends on Audio::Data + +Change 2630 on 2003/01/05 by nick@dromedary + + Decouple dict (and hence db routines) from rest of + text-to-phones stuff. + +Change 2629 on 2003/01/05 by nick@dromedary + + Restore ability to make CC=g++ + +Change 2628 on 2003/01/05 by nick@dromedary + + Perl bindings for librsynth.a + +Change 2627 on 2003/01/05 by nick@dromedary + + Move Elements.pm under perl Rsynth dir + +Change 2626 on 2003/01/04 by nick@dromedary + + Nearly there - restructure once more to make + a usable library at two levels - text and phonetics + +Change 2625 on 2003/01/04 by nick@dromedary + + More cleanup of obsolete files. + +Change 2624 on 2003/01/04 by nick@bactrian + + Typo in ansi-izeing + +Change 2623 on 2003/01/04 by nick@dromedary + + Moderernize autoconf stuff + +Change 2622 on 2003/01/04 by nick@dromedary + + Cleanup and move things about so distribution + isn't full of my junk + +Change 2621 on 2003/01/03 by nick@dromedary + + More C++ isms and memory leak fixes. + +Change 2620 on 2003/01/03 by nick@dromedary + + More pickyness from build with CC=g++ + +Change 2619 on 2003/01/03 by nick@dromedary + + More API cleanup and portability. + +Change 2618 on 2003/01/03 by nick@bactrian + + Correct dependancies + +Change 2617 on 2003/01/03 by nick@dromedary + + Lost edit + +Change 2616 on 2003/01/03 by nick@dromedary + + Re-structure API to remove most of the globals + (Also re-indent.) + +Change 2615 on 2003/01/03 by nick@dromedary + + Comments etc. after amp_adj changes. + +Change 2614 on 2003/01/03 by nick@dromedary + + Remove sops to K&R C - this is 21st century. + +Change 2613 on 2003/01/03 by nick@dromedary + + Move amp adjsutments into Elements.def + Convert 'an' to nasal fraction. + Loose 'a1' as it never does anything in cascade scheme. + +Change 2612 on 2003/01/03 by nick@dromedary + + Collect all dB adjustments of /^a\w+/ paramters into one place. + +Change 2611 on 2003/01/02 by nick@dromedary + + [E] and [{] seemed to be swapped. + Extraction of F1..F3 from CD is less helpful than expected + very hard to get John and Jill's cardinal vowels to look + right on tkvdgm. + +Change 2610 on 2003/01/02 by nick@dromedary + + Tweak near-equivalence script, avoid $Id: Change.log,v 1.1 2006-06-11 07:13:19 urchlay Exp $ in phtoelm.def + +Change 2609 on 2003/01/02 by nick@dromedary + + Re-arange code to allow dominance on a per-paramter basis + +Change 2608 on 2003/01/02 by nick@dromedary + + Avoid special elements for affricates where lengths of normal + elements sound acceptable. + Loose "QQ" as dummy target element in middle of fricatives. + (Prepare QQ to become [?] when we can do per-parameter rank + targeting.) + Correct av for closure parts of voiced stops. + +Change 2607 on 2003/01/02 by nick@dromedary + + Read new Elements.def format + +Change 2606 on 2003/01/02 by nick@dromedary + + Loose dict/ipa strings in favour of one sampa string. + Make font slot short and fill with Unicode. + +Change 2605 on 2003/01/02 by nick@dromedary + + Re-format without "error in fixed" term now we don't have it. + +Change 2604 on 2003/01/02 by nick@dromedary + + Drop 'stdy' slot in element data and use stdy*(1-prop) instead. + (Having established that making all data was like that did + not make things worse.) + +Change 2603 on 2003/01/01 by nick@dromedary + + Prune the #if 0 code now that new voice scheme and removal + of 1st difference seems to work. + Also re-instate long mis-understood 'avc' parameter. + +Change 2602 on 2003/01/01 by nick@dromedary + + Remove some entries for words written the same but + with different pronounciation when latter cause poblems + e.g. we want gin to be [dZIn] not [gIn] (Latter seems wrong) + and put to be [pUt] not golfer's [pVt]. + +Change 2601 on 2002/12/31 by nick@dromedary + + More oddities - none of stops "stop" - weird - added + no-source and external duration to KY GY and seems to help + (Do same for [bptd]?) + +Change 2600 on 2002/12/31 by nick@dromedary + + Velars [kg] had no stimulus on in/out - no wonder they were weak! + +Change 2598 on 2002/12/30 by nick@dromedary + + "Restore" naive "f0 decline with stress pulses" approach for + un-assisted text-to-speech. Festival as a front end is + of course much better, but this restores stand-alone "prosody" + element. + +Change 2597 on 2002/12/30 by nick@dromedary + + Gate more messages with -v (verbose) switch + +Change 2596 on 2002/12/30 by nick@dromedary + + Festival binding. + +Change 2595 on 2002/12/29 by nick@dromedary + + Mend ability to say text files. Reset dumb F0 scheme on ',' etc. + as well as end of sentence. + Add a mode to use .pho file F0 data but ignore its duration data. + Correct pronounciation of 'diphones' in beep (dip-hones indeed!). + +Change 2594 on 2002/12/28 by nick@dromedary + + Another try at ms -> num-of-frames interpolation. + (Goal is to avoid non-stop elements which vanish as they + get 0 time.) + +Change 2593 on 2002/12/28 by nick@dromedary + + General overhaul of Elements.def removing duplicates + and correcting accidentally identical elements. + +Change 2591 on 2002/12/28 by nick@dromedary + + "Correct" fix contribution term + +Change 2590 on 2002/12/28 by nick@dromedary + + More info in and tidier plot file. + Turn on parameter smoothing by default. + +Change 2589 on 2002/12/28 by nick@dromedary + + Turn of debug :-( + +Change 2588 on 2002/12/28 by nick@dromedary + + Improve mbrola .pho file interpollation: + - allow length reduction for non stops + - invent new attribute 'stl' (stop locus) to mark in/out + elements of stops so only central part is marked as stp + (with above this means in/put can change length). + - Remove specific [A:] etc. entries in phtoelem.def and handle + ':' in phtoelm.c + +Change 2587 on 2002/12/28 by nick@dromedary + + At least attempt all vowels on IPA diagram. + (Missing ones F1,F2,F2 from IPA CD.) + +Change 2586 on 2002/12/27 by nick@dromedary + + Better error messages for phone translation problems + +Change 2585 on 2002/12/27 by nick@dromedary + + Experimental "rsc" resonator to lift centre of spectrum. + Inspired by frequent occurance of such in LPC spectra from tkscope. + +Change 2584 on 2002/12/27 by nick@dromedary + + Tweak [{] based on tkscope analysis of IPA CD + +Change 2581 on 2002/12/27 by nick@dromedary + + Make 1st half of [D] same as 2nd half (looks like an + old experiment that got left in. + +Change 2580 on 2002/12/27 by nick@dromedary + + Try waiting longer for /dev/dsp + +Change 2579 on 2002/12/24 by nick@dromedary + + First pass at adding Copyright and LGPL/GPL notices. + +Change 2576 on 2002/12/23 by nick@dromedary + + Switch to piece-wise linear/quadratic voicing waveform. + +Change 2575 on 2002/12/23 by nick@dromedary + + Add "Medi" (Welsh woman's christian name) to dict for personal + reasons ;-) + +Change 2574 on 2002/12/23 by nick@dromedary + + #if to switch between taking 1st diff of output + lowpass + or not doing either (supposed to be equivalent). + The non-diff case should make it easier to inject specific + voice waveform. + +Change 2573 on 2002/12/23 by nick@dromedary + + Some light tidying + +Change 2570 on 2002/12/22 by nick@dromedary + + Update comments, experiment with pitch-sync cascade update + +Change 2564 on 2002/12/19 by nick@dromedary + + Tune [N] based on tkscope analysis of "Sounds of IPA" CD + - match f4/f5/f6 to John Well's and then adjust [N]'s fn..f3 + and bandwidths till it looks best. + +Change 2563 on 2002/12/19 by nick@dromedary + + Back port the try severl times tweak + +Change 2550 on 2002/12/15 by nick@dromedary + + SAMPA corrections for sylabic consonants + +Change 2549 on 2002/12/15 by nick@dromedary + + Update/add SAMPA labels for Klatt/MITalk phones + +Change 2548 on 2002/12/12 by nick@dromedary + + Add SAMPA IPA Unicode HTML and script for manipulating it. + +Change 2547 on 2002/12/10 by nick@dromedary + + Place holders for high central vowels [1] and [}] + +Change 2545 on 2002/12/09 by nick@dromedary + + Add x-sampa [4] [K] [?] + +Change 2544 on 2002/12/04 by nick@dromedary + + Restore speed from -S + - some clicks seem to be "rapid" changes in f2 + i.e. go away with more steps as in -S 10 -m 1 + +Change 2543 on 2002/12/04 by nick@dromedary + + Adjust global gain to avoid clipping on /Q/ + +Change 2542 on 2002/12/03 by nick@dromedary + + Add check for f1-f2-f3-f4 spacing and correct problems + it showed + - raise fixed f4 above common f3 in several elements + - move f1/f2 of /A/ to rp values as perl tkvdgm + Update tkvdgm to get data from Elements.def via Elements.pm + +Change 2541 on 2002/11/28 by nick@dromedary + + Clean up tracks of /N/ - still not right (sounds too much like /n/) + +Change 2540 on 2002/11/28 by nick@dromedary + + Amplitude investigations - plot avg power + Allow amp/db fudge factor experiments. + +Change 2539 on 2002/11/26 by nick@dromedary + + Compute and plot output amplitude. + +Change 2538 on 2002/11/25 by nick@dromedary + + Tweak duration code with comment till we are clearer + about effects to shortened durations on the parameter + interpollation. + +Change 2537 on 2002/11/25 by nick@dromedary + + Support say -f whatever.pho + where whatever.pho is a mbrola phone/duration/f0 file. + Interpolation between durations in ms and frames is + still a little rough. Also have some issues when specified + duration is less than duration of stops (and maybe some others.) + +Change 2536 on 2002/11/24 by nick@dromedary + + end-of-weekend checkin + +Change 2535 on 2002/11/24 by nick@dromedary + + Some initial mbrola compatibility tweaks + +Change 2528 on 2002/11/19 by nick@dromedary + + Separate voice and parameter data for plotting + +Change 2527 on 2002/11/19 by nick@dromedary + + Parameter track plotting + +Change 2526 on 2002/11/18 by nick@dromedary + + Start reconciling element params and synth params + +Change 2525 on 2002/11/18 by nick@dromedary + + Start of cleanup removing uses of old Klatt code + +Change 2524 on 2002/11/17 by nick@dromedary + + Allow study of old synth + +Change 2522 on 2002/11/17 by nick@dromedary + + Overhaul voice generation - amplitude and basic sound + should now be sample rate independant. + +Change 2521 on 2002/11/13 by nick@dromedary + + Update comments, play with sox stats + +Change 2519 on 2002/11/08 by nick@dromedary + + Show phone table + +Change 2503 on 2002/10/05 by nick@bactrian + + Update to modern linux's math.h + +Change 2222 on 2001/05/22 by nick@dromedary + + Clean up f1 too close to f2, f2 to f3 etc. + +Change 2213 on 2001/04/30 by nick@dromedary + + Honour gain terms in impulse response output. + +Change 2212 on 2001/04/24 by nick@pluto + + Boost af gain (i.e. stop * 0.25), + move [k] near its voiced analogue [g] and apply + same changes. + +Change 2211 on 2001/04/24 by nick@pluto + + [g] edits + - av for in/out is low, av for 'nail' is high. + - silence/burst + +Change 2210 on 2001/04/24 by nick@pluto + + Support for getting impluse response from frame parameters. + +Change 2209 on 2001/04/24 by nick@pluto + + Apply Klatt f1..f3, b1..b3 to [g] + +Change 2208 on 2001/04/24 by nick@pluto + + Mark fmtelm as executable. + +Change 2207 on 2001/04/23 by nick@dromedary + + Add element trace. + +Change 2206 on 2001/04/23 by nick@dromedary + + Add klatt mapping table. Order parms as perl MITalk book by default. + +Change 2205 on 2001/04/23 by nick@dromedary + + Rename variables to match parameter struct slot names. + +Change 2204 on 2001/04/20 by nick@bactrian + + Modern nas needs -lXt + +Change 2202 on 2001/04/17 by nick@dromedary + + A few systematic adjustments + +Change 2201 on 2001/04/17 by nick@dromedary + + Perl version of Elements.def read/write prior to systematic changes. + +Change 2200 on 2001/04/17 by nick@dromedary + + Finish off the basic osay/say nsynth/opsynth decoupling. + +Change 2199 on 2001/04/17 by nick@dromedary + + Branch Elements + +Change 2198 on 2001/04/17 by nick@pluto + + Makefile tweak to allow nasay to build. + Make some of checking Linux only. + +Change 2197 on 2001/04/16 by nick@dromedary + + More flexible sorting. + +Change 2195 on 2001/04/16 by nick@dromedary + + Byteswapping issues in au_file + +Change 2194 on 2001/04/16 by nick@dromedary + + Bounds checking. + A hack for 8kHz issue, seems skirt of r5c is aliasing ? + +Change 2193 on 2001/04/16 by nick@dromedary + + Fix gross C->perl->C mis-re-translation in dB routine. + +Change 2191 on 2001/04/15 by nick@dromedary + + Start of new synth. + +Change 2190 on 2001/04/15 by nick@dromedary + + Tweak parameters-for-plot dump + +Change 2189 on 2001/04/14 by nick@dromedary + + Filter efficency and use new features in tkanal. + +Change 2186 on 2001/04/13 by nick@dromedary + + More features for analysing rsynth element tables. + +Change 2113 on 2001/01/27 by nick@dromedary + + Work better on modern linux (SuSE6.4) + +Change 1536 on 1999/11/27 by nick@bactrian_nt + + Win32 fixes + +Change 1496 on 1999/11/09 by nick@bactrian + + Cleanup alignment generation process + +Change 1481 on 1999/09/27 by nick@pluto + + Remove near duplicate file + +Change 1480 on 1999/09/27 by nick@pluto + + Inherit minor tweak on work version of txt710.dat + +Change 1478 on 1999/09/26 by nick@bactrian + + Configure searches /usr/local on linux where gcc suggests /usr + as prefix. + Bug fix in db API. + +Change 1476 on 1999/09/24 by nick@bactrian + + Builds to use /dev/dspW (16 bit) under OSS + +Change 1475 on 1999/09/22 by nick@bactrian + + Correct gdbm abstraction + +Change 1474 on 1999/09/22 by nick@bactrian + + Update autoconf versions, config.guess etc. + +Change 1455 on 1999/09/02 by nick@bactrian + + On-the-road Monterey/San Jose/Dallas changes + +Change 1316 on 1999/05/14 by nick@ni-s + + Update manifest + +Change 1226 on 1999/03/12 by nick@pluto + + Do not skip source for of Makefile, config.h etc. + +Change 1224 on 1999/03/11 by nick@pluto + + MANIFEST stuff + +Change 1215 on 1999/02/20 by nick@camel + + Fixup for Win32 + +Change 1214 on 1999/02/20 by nick@ni-s + + Add Makefile + +Change 1213 on 1999/02/20 by nick@ni-s + + Add "align" stuff + +Change 1205 on 1999/01/23 by nick@camel + + Update for VC++6.0 + +Change 1204 on 1999/01/23 by nick@camel + + Add VC++ package + +Change 898 on 1998/06/02 by nick@ni-s + + F/B splitting of text-only trie works + +Change 895 on 1998/06/01 by nick@ni-s + + Re-start from degenerate case (with bugs...) + +Change 893 on 1998/05/31 by nick@ni-s + + Bad splits break re-finding + +Change 892 on 1998/05/30 by nick@ni-s + + Don't match if cannot split both word and phon + +Change 891 on 1998/05/30 by nick@ni-s + + Basic splitting working, problem with silly partition on + Dutchmen/Dutchman + +Change 890 on 1998/05/30 by nick@ni-s + + Separate functions for forward/backward insert + +Change 889 on 1998/05/30 by nick@ni-s + + Split functions + +Change 888 on 1998/05/30 by nick@ni-s + + Dual disjoint trees + +Change 887 on 1998/05/29 by nick@pluto + + Fridays changes - try stack of nodes + +Change 886 on 1998/05/28 by nick@pluto + + End of Thur - backward match stuff + +Change 885 on 1998/05/28 by nick@pluto + + After re-structure to allow guess/build + +Change 884 on 1998/05/28 by nick@pluto + + End of Wednesday + +Change 883 on 1998/05/26 by nick@ni-s + + dtree seems to build + +Change 882 on 1998/05/26 by nick@ni-s + + Missed file + +Change 881 on 1998/05/26 by nick@pluto + + Add autoconf input file, remove Makefile as it is built + +Change 880 on 1998/05/26 by nick@pluto + + Support db as well as gdbm, update to latest autoconf + +Change 879 on 1998/05/25 by nick@ni-s + + Pre s-rule messing + +Change 878 on 1998/05/25 by nick@ni-s + + Added consonat rules as far as 's' from LPD side-bars + +Change 877 on 1998/05/25 by nick@ni-s + + Re-structure for stand-alone guess for debug + +Change 876 on 1998/05/25 by nick@ni-s + + Snapshot more rule changes + +Change 875 on 1998/05/25 by nick@ni-s + + Switched text.c rules to lower case + +Change 874 on 1998/05/25 by nick@ni-s + + Pre-downcase + +Change 873 on 1998/05/24 by nick@ni-s + + More rule tweaks + +Change 872 on 1998/05/24 by nick@ni-s + + 1st round of rule-fixups by cross check with CUVOALD + +Change 870 on 1998/05/23 by nick@ni-s + + Open as ktext + +Change 869 on 1998/05/23 by nick@ni-s + + Add integer version of synth + +Change 868 on 1998/05/23 by nick@ni-s + + Wilbur's pitch floor tweak. + +Change 867 on 1998/05/23 by nick@camel + + Builds under mingw32 + +Change 866 on 1998/05/23 by nick@camel + + Works on Win32 (watch the volume...) + +Change 865 on 1998/05/23 by nick@camel + + Links under borland + +Change 864 on 1998/05/23 by nick@camel + + Gross fixup + +Change 863 on 1998/05/23 by nick@camel + + Win32-side fixup + +Change 861 on 1998/05/23 by nick@ni-s + + Raw timidity win32 stuff + +Change 860 on 1998/05/23 by nick@ni-s + + gcc 2.8 fussyness + +Change 858 on 1998/05/23 by nick@ni-s + + Import /home/nick/speak/rsynth + +Change 857 on 1998/05/23 by nick@ni-s + + Import /home/nick/speak/rsynth-2.0 + +Change 856 on 1998/05/23 by nick@ni-s + + Import /tmp/rsynth + +Change 855 on 1998/05/23 by nick@ni-s + + Version 1.99 + +Change 854 on 1998/05/23 by nick@ni-s + + "ntalk" May 7 1994 + +Change 853 on 1998/05/23 by nick@ni-s + + Version c. 'Feb 24 1994' rsynth.tar.Z + +Change 852 on 1998/05/23 by nick@ni-s + + Version "rsynth_cuvolad.tar.gz" + +Change 851 on 1998/05/23 by nick@ni-s + + Version released as 'nsynth.tar.gz' + +Change 850 on 1998/05/23 by nick@ni-s + + Original 'synth.tar.gz' + diff --git a/stella/src/emucore/rsynth/Elements.def b/stella/src/emucore/rsynth/Elements.def new file mode 100644 index 000000000..e1e1c2df5 --- /dev/null +++ b/stella/src/emucore/rsynth/Elements.def @@ -0,0 +1,1950 @@ +/* + Copyright (c) 1994,2001-2004 Nick Ing-Simmons. All rights reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA + +*/ +{"END", 31, 5, 5,".",".",0, /* [.] */ + { + { 270, 50, 3, 3, 31}, /* fn */ + { 490, 100, 0, 0, 31}, /* f1 */ + { 1480, 100, 0, 0, 31}, /* f2 */ + { 2500, 100, 0, 0, 31}, /* f3 */ + { 60, 100, 0, 0, 31}, /* b1 */ + { 90, 100, 0, 0, 31}, /* b2 */ + { 150, 100, 0, 0, 31}, /* b3 */ + { 0, 100, 3, 0, 31}, /* pn */ + { 0, 100, 3, 0, 31}, /* a2 */ + { 0, 100, 3, 0, 31}, /* a3 */ + { 0, 100, 3, 0, 31}, /* a4 */ + { 0, 100, 3, 0, 31}, /* a5 */ + { 0, 100, 3, 0, 31}, /* a6 */ + { 0, 100, 3, 0, 31}, /* ab */ + { 0, 50, 0, 0, 31}, /* av */ + { 0, 50, 0, 0, 31}, /* avc */ + { 0, 50, 0, 0, 31}, /* asp */ + { 0, 50, 0, 0, 31} /* af */ + } +}, + +{"Q", 29, 6, 6," "," ",0, /* [ ] */ + { + { 270, 50, 3, 3, 29}, /* fn */ + { 490, 100, 3, 3, 29}, /* f1 */ + { 1480, 100, 3, 3, 29}, /* f2 */ + { 2500, 100, 3, 3, 29}, /* f3 */ + { 60, 100, 3, 3, 29}, /* b1 */ + { 90, 100, 3, 3, 29}, /* b2 */ + { 150, 100, 3, 3, 29}, /* b3 */ + { 0, 100, 3, 0, 29}, /* pn */ + { 0, 100, 3, 0, 29}, /* a2 */ + { 0, 100, 3, 0, 29}, /* a3 */ + { 0, 100, 3, 0, 29}, /* a4 */ + { 0, 100, 3, 0, 29}, /* a5 */ + { 0, 100, 3, 0, 29}, /* a6 */ + { 0, 100, 3, 0, 29}, /* ab */ + { 0, 50, 0, 0, 29}, /* av */ + { 0, 50, 0, 0, 29}, /* avc */ + { 0, 50, 0, 0, 29}, /* asp */ + { 0, 50, 0, 0, 29} /* af */ + } +}, + +{"P", 23, 8, 8,"p","p",blb|stl|vls, /* [p] */ + { + { 270, 50, 0, 0, 23}, /* fn */ + { 190, 50, 2, 2, 23}, /* f1 */ + { 760, 50, 2, 2, 23}, /* f2 */ + { 2500, 100, 0, 2, 23}, /* f3 */ + { 60, 50, 2, 2, 23}, /* b1 */ + { 90, 50, 2, 2, 23}, /* b2 */ + { 150, 100, 0, 2, 23}, /* b3 */ + { 0, 100, 0, 0, 23}, /* pn */ + { 0, 100, 0, 0, 23}, /* a2 */ + { 0, 100, 0, 0, 23}, /* a3 */ + { 0, 100, 0, 0, 23}, /* a4 */ + { 0, 100, 0, 0, 23}, /* a5 */ + { 0, 100, 0, 0, 23}, /* a6 */ + { 0, 100, 0, 0, 23}, /* ab */ + { 0, 50, 0, 0, 23}, /* av */ + { 0, 50, 0, 0, 23}, /* avc */ + { 34, 50, 0, 0, 23}, /* asp */ + { 60, 50, 0, 0, 23} /* af */ + } +}, + +{"PY", 29, 1, 1,"p","p",blb|vls|stp, /* [p] */ + { + { 270, 50, 0, 0, 29}, /* fn */ + { 190, 100, 0, 0, 29}, /* f1 */ + { 760, 100, 0, 0, 29}, /* f2 */ + { 2500, 100, 0, 0, 29}, /* f3 */ + { 60, 100, 0, 0, 29}, /* b1 */ + { 90, 100, 0, 0, 29}, /* b2 */ + { 150, 100, 0, 0, 29}, /* b3 */ + { 0, 100, 0, 0, 29}, /* pn */ + { 46.5, 100, 0, 0, 29}, /* a2 */ + { 33.4, 100, 0, 0, 29}, /* a3 */ + { 24.5, 100, 0, 0, 29}, /* a4 */ + { 0, 100, 0, 0, 29}, /* a5 */ + { 0, 100, 0, 0, 29}, /* a6 */ + { 0, 100, 0, 0, 29}, /* ab */ + { 0, 50, 0, 0, 29}, /* av */ + { 0, 50, 0, 0, 29}, /* avc */ + { 34, 50, 0, 0, 29}, /* asp */ + { 60, 50, 0, 0, 29} /* af */ + } +}, + +{"PZ", 23, 2, 2,"p","p",blb|stl|vls, /* [p] */ + { + { 270, 50, 0, 0, 23}, /* fn */ + { 190, 50, 2, 2, 23}, /* f1 */ + { 760, 50, 2, 2, 23}, /* f2 */ + { 2500, 100, 2, 2, 23}, /* f3 */ + { 60, 50, 2, 2, 23}, /* b1 */ + { 90, 50, 2, 2, 23}, /* b2 */ + { 150, 100, 2, 2, 23}, /* b3 */ + { 0, 100, 0, 0, 23}, /* pn */ + { 36, 100, 0, 0, 23}, /* a2 */ + { 22.9, 100, 0, 0, 23}, /* a3 */ + { 14, 100, 0, 0, 23}, /* a4 */ + { 0, 100, 0, 0, 23}, /* a5 */ + { 0, 100, 0, 0, 23}, /* a6 */ + { 0, 100, 0, 0, 23}, /* ab */ + { 0, 50, 0, 0, 23}, /* av */ + { 0, 50, 0, 0, 23}, /* avc */ + { 34, 50, 0, 0, 23}, /* asp */ + { 60, 50, 0, 0, 23} /* af */ + } +}, + +{"B", 26,12,12,"b","b",blb|stl|vcd, /* [b] */ + { + { 270, 50, 0, 0, 26}, /* fn */ + { 190, 50, 2, 2, 26}, /* f1 */ + { 760, 50, 2, 2, 26}, /* f2 */ + { 2500, 100, 0, 2, 26}, /* f3 */ + { 60, 50, 2, 2, 26}, /* b1 */ + { 90, 50, 2, 2, 26}, /* b2 */ + { 150, 100, 0, 2, 26}, /* b3 */ + { 0, 100, 0, 0, 26}, /* pn */ + { 0, 100, 0, 0, 26}, /* a2 */ + { 0, 100, 0, 0, 26}, /* a3 */ + { 0, 100, 0, 0, 26}, /* a4 */ + { 0, 100, 0, 0, 26}, /* a5 */ + { 0, 100, 0, 0, 26}, /* a6 */ + { 0, 100, 0, 0, 26}, /* ab */ + { 0, 50, 0, 0, 26}, /* av */ + { 49, 50, 0, 0, 26}, /* avc */ + { 0, 50, 0, 0, 26}, /* asp */ + { 0, 50, 0, 0, 26} /* af */ + } +}, + +{"BY", 29, 1, 1,"b","b",blb|stp|vcd, /* [b] */ + { + { 270, 50, 0, 0, 29}, /* fn */ + { 190, 100, 0, 0, 29}, /* f1 */ + { 760, 100, 0, 0, 29}, /* f2 */ + { 2500, 100, 0, 0, 29}, /* f3 */ + { 60, 100, 0, 0, 29}, /* b1 */ + { 90, 100, 0, 0, 29}, /* b2 */ + { 150, 100, 0, 0, 29}, /* b3 */ + { 0, 100, 0, 0, 29}, /* pn */ + { 46.5, 100, 0, 0, 29}, /* a2 */ + { 32.9, 100, 0, 0, 29}, /* a3 */ + { 24.5, 100, 0, 0, 29}, /* a4 */ + { 0, 100, 0, 0, 29}, /* a5 */ + { 0, 100, 0, 0, 29}, /* a6 */ + { 0, 100, 0, 0, 29}, /* ab */ + { 49, 50, 0, 0, 29}, /* av */ + { 49, 50, 0, 0, 29}, /* avc */ + { 0, 50, 0, 0, 29}, /* asp */ + { 0, 50, 0, 0, 29} /* af */ + } +}, + +{"BZ", 26, 0, 0,"b","b",blb|stl|vcd, /* [b] */ + { + { 270, 50, 0, 0, 26}, /* fn */ + { 190, 50, 2, 0, 26}, /* f1 */ + { 760, 50, 2, 0, 26}, /* f2 */ + { 2500, 100, 0, 0, 26}, /* f3 */ + { 60, 50, 2, 0, 26}, /* b1 */ + { 90, 50, 2, 0, 26}, /* b2 */ + { 150, 100, 0, 0, 26}, /* b3 */ + { 0, 100, 0, 0, 26}, /* pn */ + { 0, 100, 0, 0, 26}, /* a2 */ + { 0, 100, 0, 0, 26}, /* a3 */ + { 0, 100, 0, 0, 26}, /* a4 */ + { 0, 100, 0, 0, 26}, /* a5 */ + { 0, 100, 0, 0, 26}, /* a6 */ + { 0, 100, 0, 0, 26}, /* ab */ + { 49, 50, 0, 0, 26}, /* av */ + { 49, 50, 0, 0, 26}, /* avc */ + { 0, 50, 0, 0, 26}, /* asp */ + { 0, 50, 0, 0, 26} /* af */ + } +}, + +{"T", 23, 6, 6,"t","t",stl|vls|alv, /* [t] */ + { + { 270, 50, 0, 0, 23}, /* fn */ + { 190, 50, 2, 2, 23}, /* f1 */ + { 1780, 50, 2, 2, 23}, /* f2 */ + { 2680, 0, 0, 2, 23}, /* f3 */ + { 60, 50, 2, 2, 23}, /* b1 */ + { 90, 50, 2, 2, 23}, /* b2 */ + { 150, 0, 0, 2, 23}, /* b3 */ + { 0, 100, 0, 0, 23}, /* pn */ + { 0, 100, 0, 0, 23}, /* a2 */ + { 0, 100, 0, 0, 23}, /* a3 */ + { 0, 100, 0, 0, 23}, /* a4 */ + { 0, 100, 0, 0, 23}, /* a5 */ + { 0, 100, 0, 0, 23}, /* a6 */ + { 0, 100, 0, 0, 23}, /* ab */ + { 0, 50, 0, 0, 23}, /* av */ + { 0, 50, 0, 0, 23}, /* avc */ + { 34, 50, 0, 0, 23}, /* asp */ + { 60, 50, 0, 0, 23} /* af */ + } +}, + +{"TY", 29, 1, 1,"t","t",vls|stp|alv, /* [t] */ + { + { 270, 50, 0, 0, 29}, /* fn */ + { 190, 100, 0, 0, 29}, /* f1 */ + { 1780, 100, 0, 0, 29}, /* f2 */ + { 2680, 100, 0, 0, 29}, /* f3 */ + { 60, 100, 0, 0, 29}, /* b1 */ + { 90, 100, 0, 0, 29}, /* b2 */ + { 150, 100, 0, 0, 29}, /* b3 */ + { 0, 100, 0, 0, 29}, /* pn */ + { 0, 100, 0, 0, 29}, /* a2 */ + { 28.1, 100, 0, 0, 29}, /* a3 */ + { 36.8, 100, 0, 0, 29}, /* a4 */ + { 0, 100, 0, 0, 29}, /* a5 */ + { 0, 100, 0, 0, 29}, /* a6 */ + { 0, 100, 0, 0, 29}, /* ab */ + { 0, 50, 0, 0, 29}, /* av */ + { 0, 50, 0, 0, 29}, /* avc */ + { 34, 50, 0, 0, 29}, /* asp */ + { 60, 50, 0, 0, 29} /* af */ + } +}, + +{"TZ", 23, 2, 2,"t","t",stl|vls|alv, /* [t] */ + { + { 270, 50, 0, 0, 23}, /* fn */ + { 190, 50, 2, 1, 23}, /* f1 */ + { 1780, 50, 2, 1, 23}, /* f2 */ + { 2680, 0, 2, 0, 23}, /* f3 */ + { 60, 50, 2, 1, 23}, /* b1 */ + { 90, 50, 2, 1, 23}, /* b2 */ + { 150, 0, 2, 0, 23}, /* b3 */ + { 0, 100, 0, 0, 23}, /* pn */ + { 0, 100, 0, 0, 23}, /* a2 */ + { 17.6, 100, 0, 0, 23}, /* a3 */ + { 26.2, 100, 0, 0, 23}, /* a4 */ + { 0, 100, 0, 0, 23}, /* a5 */ + { 0, 100, 0, 0, 23}, /* a6 */ + { 0, 100, 0, 0, 23}, /* ab */ + { 0, 50, 0, 0, 23}, /* av */ + { 0, 50, 0, 0, 23}, /* avc */ + { 34, 50, 0, 0, 23}, /* asp */ + { 60, 50, 0, 0, 23} /* af */ + } +}, + +{"D", 26, 8, 8,"d","d",stl|vcd|alv, /* [d] */ + { + { 270, 50, 0, 0, 26}, /* fn */ + { 190, 50, 2, 2, 26}, /* f1 */ + { 1780, 50, 2, 2, 26}, /* f2 */ + { 2680, 0, 2, 2, 26}, /* f3 */ + { 60, 50, 2, 2, 26}, /* b1 */ + { 90, 50, 2, 2, 26}, /* b2 */ + { 150, 0, 2, 2, 26}, /* b3 */ + { 0, 100, 0, 0, 26}, /* pn */ + { 0, 100, 0, 0, 26}, /* a2 */ + { 0, 100, 0, 0, 26}, /* a3 */ + { 0, 100, 0, 0, 26}, /* a4 */ + { 0, 100, 0, 0, 26}, /* a5 */ + { 0, 100, 0, 0, 26}, /* a6 */ + { 0, 100, 0, 0, 26}, /* ab */ + { 0, 100, 0, 0, 26}, /* av */ + { 49, 50, 0, 0, 26}, /* avc */ + { 0, 50, 0, 0, 26}, /* asp */ + { 0, 50, 0, 0, 26} /* af */ + } +}, + +{"DY", 29, 1, 1,"d","d",stp|vcd|alv, /* [d] */ + { + { 270, 50, 0, 0, 29}, /* fn */ + { 190, 100, 0, 0, 29}, /* f1 */ + { 1780, 100, 0, 0, 29}, /* f2 */ + { 2680, 100, 0, 0, 29}, /* f3 */ + { 60, 100, 0, 0, 29}, /* b1 */ + { 90, 100, 0, 0, 29}, /* b2 */ + { 150, 100, 0, 0, 29}, /* b3 */ + { 0, 100, 0, 0, 29}, /* pn */ + { 36, 100, 0, 0, 29}, /* a2 */ + { 24.6, 100, 0, 0, 29}, /* a3 */ + { 31.5, 100, 0, 0, 29}, /* a4 */ + { 0, 100, 0, 0, 29}, /* a5 */ + { 0, 100, 0, 0, 29}, /* a6 */ + { 0, 100, 0, 0, 29}, /* ab */ + { 49, 50, 0, 0, 29}, /* av */ + { 49, 50, 0, 0, 29}, /* avc */ + { 0, 50, 0, 0, 29}, /* asp */ + { 0, 50, 0, 0, 29} /* af */ + } +}, + +{"DZ", 26, 1, 1,"d","d",stl|vcd|alv, /* [d] */ + { + { 270, 50, 0, 0, 26}, /* fn */ + { 190, 50, 2, 0, 26}, /* f1 */ + { 1780, 50, 2, 0, 26}, /* f2 */ + { 2680, 0, 2, 0, 26}, /* f3 */ + { 60, 50, 2, 0, 26}, /* b1 */ + { 90, 50, 2, 0, 26}, /* b2 */ + { 150, 0, 2, 0, 26}, /* b3 */ + { 0, 100, 0, 0, 26}, /* pn */ + { 25.5, 100, 0, 0, 26}, /* a2 */ + { 14.1, 100, 0, 0, 26}, /* a3 */ + { 21, 100, 0, 0, 26}, /* a4 */ + { 0, 100, 0, 0, 26}, /* a5 */ + { 0, 100, 0, 0, 26}, /* a6 */ + { 0, 100, 0, 0, 26}, /* ab */ + { 49, 50, 0, 0, 26}, /* av */ + { 49, 50, 0, 0, 26}, /* avc */ + { 0, 50, 0, 0, 26}, /* asp */ + { 0, 50, 0, 0, 26} /* af */ + } +}, + +{"K", 23, 8, 8,"k","k",stl|vls|vel, /* [k] */ + { + { 270, 50, 0, 0, 23}, /* fn */ + { 190, 50, 3, 3, 23}, /* f1 */ + { 1480, 50, 3, 3, 23}, /* f2 */ + { 2620, 50, 3, 3, 23}, /* f3 */ + { 60, 50, 3, 3, 23}, /* b1 */ + { 90, 50, 3, 3, 23}, /* b2 */ + { 150, 50, 3, 3, 23}, /* b3 */ + { 0, 100, 0, 0, 23}, /* pn */ + { 0, 100, 0, 0, 23}, /* a2 */ + { 0, 100, 0, 0, 23}, /* a3 */ + { 0, 100, 0, 0, 23}, /* a4 */ + { 0, 100, 0, 0, 23}, /* a5 */ + { 0, 100, 0, 0, 23}, /* a6 */ + { 0, 100, 0, 0, 23}, /* ab */ + { 0, 50, 0, 0, 23}, /* av */ + { 0, 50, 0, 0, 23}, /* avc */ + { 34, 50, 3, 3, 23}, /* asp */ + { 60, 50, 3, 3, 23} /* af */ + } +}, + +{"KY", 29, 1, 1,"k","k",vls|stp|vel, /* [k] */ + { + { 270, 50, 0, 0, 29}, /* fn */ + { 190, 100, 0, 0, 29}, /* f1 */ + { 1480, 100, 0, 0, 29}, /* f2 */ + { 2620, 100, 0, 0, 29}, /* f3 */ + { 60, 100, 0, 0, 29}, /* b1 */ + { 90, 100, 0, 0, 29}, /* b2 */ + { 150, 100, 0, 0, 29}, /* b3 */ + { 0, 100, 0, 0, 29}, /* pn */ + { 48.2, 100, 0, 0, 29}, /* a2 */ + { 40.4, 100, 0, 0, 29}, /* a3 */ + { 15.8, 100, 0, 0, 29}, /* a4 */ + { 0, 100, 0, 0, 29}, /* a5 */ + { 0, 100, 0, 0, 29}, /* a6 */ + { 0, 100, 0, 0, 29}, /* ab */ + { 0, 50, 2, 0, 29}, /* av */ + { 0, 50, 2, 0, 29}, /* avc */ + { 0, 50, 2, 0, 29}, /* asp */ + { 0, 50, 2, 0, 29} /* af */ + } +}, + +{"KZ", 23, 4, 4,"k","k",stl|vls|vel, /* [k] */ + { + { 270, 50, 0, 0, 23}, /* fn */ + { 190, 50, 3, 3, 23}, /* f1 */ + { 1480, 50, 3, 3, 23}, /* f2 */ + { 2620, 50, 3, 3, 23}, /* f3 */ + { 60, 50, 3, 3, 23}, /* b1 */ + { 90, 50, 3, 3, 23}, /* b2 */ + { 150, 50, 3, 3, 23}, /* b3 */ + { 0, 100, 0, 0, 23}, /* pn */ + { 37.8, 100, 0, 0, 23}, /* a2 */ + { 29.9, 100, 0, 0, 23}, /* a3 */ + { 5.2, 100, 0, 0, 23}, /* a4 */ + { 0, 100, 0, 0, 23}, /* a5 */ + { 0, 100, 0, 0, 23}, /* a6 */ + { 0, 100, 0, 0, 23}, /* ab */ + { 0, 50, 0, 0, 23}, /* av */ + { 0, 50, 0, 0, 23}, /* avc */ + { 34, 50, 3, 3, 23}, /* asp */ + { 60, 50, 3, 3, 23} /* af */ + } +}, + +{"G", 26,12,12,"g","g",stl|vcd|vel, /* [g] */ + { + { 270, 50, 0, 0, 26}, /* fn */ + { 190, 50, 3, 3, 26}, /* f1 */ + { 1480, 50, 3, 3, 26}, /* f2 */ + { 2620, 50, 3, 3, 26}, /* f3 */ + { 60, 50, 3, 3, 26}, /* b1 */ + { 90, 50, 3, 3, 26}, /* b2 */ + { 150, 50, 3, 3, 26}, /* b3 */ + { 0, 100, 0, 0, 26}, /* pn */ + { 0, 100, 0, 0, 26}, /* a2 */ + { 0, 100, 0, 0, 26}, /* a3 */ + { 0, 100, 0, 0, 26}, /* a4 */ + { 0, 100, 0, 0, 26}, /* a5 */ + { 0, 100, 0, 0, 26}, /* a6 */ + { 0, 100, 0, 0, 26}, /* ab */ + { 0, 50, 3, 3, 26}, /* av */ + { 49, 50, 3, 3, 26}, /* avc */ + { 0, 50, 0, 0, 26}, /* asp */ + { 0, 50, 0, 0, 26} /* af */ + } +}, + +{"GY", 29, 1, 1,"g","g",stp|vcd|vel, /* [g] */ + { + { 270, 50, 0, 0, 29}, /* fn */ + { 190, 100, 0, 0, 29}, /* f1 */ + { 1480, 100, 0, 0, 29}, /* f2 */ + { 2620, 100, 0, 0, 29}, /* f3 */ + { 60, 100, 0, 0, 29}, /* b1 */ + { 90, 100, 0, 0, 29}, /* b2 */ + { 150, 100, 0, 0, 29}, /* b3 */ + { 0, 100, 0, 0, 29}, /* pn */ + { 43, 100, 0, 0, 29}, /* a2 */ + { 29.9, 100, 0, 0, 29}, /* a3 */ + { 10.5, 100, 0, 0, 29}, /* a4 */ + { 0, 100, 0, 0, 29}, /* a5 */ + { 0, 100, 0, 0, 29}, /* a6 */ + { 0, 100, 0, 0, 29}, /* ab */ + { 0, 50, 2, 0, 29}, /* av */ + { 0, 50, 2, 0, 29}, /* avc */ + { 0, 50, 2, 0, 29}, /* asp */ + { 0, 50, 2, 0, 29} /* af */ + } +}, + +{"GZ", 26, 2, 2,"g","g",stl|vcd|vel, /* [g] */ + { + { 270, 50, 0, 0, 26}, /* fn */ + { 190, 50, 3, 2, 26}, /* f1 */ + { 1480, 50, 3, 2, 26}, /* f2 */ + { 2620, 50, 3, 2, 26}, /* f3 */ + { 60, 50, 3, 2, 26}, /* b1 */ + { 90, 50, 3, 2, 26}, /* b2 */ + { 150, 50, 3, 2, 26}, /* b3 */ + { 0, 100, 0, 0, 26}, /* pn */ + { 32.5, 100, 0, 0, 26}, /* a2 */ + { 19.4, 100, 0, 0, 26}, /* a3 */ + { 10.5, 100, 0, 0, 26}, /* a4 */ + { 0, 100, 0, 0, 26}, /* a5 */ + { 0, 100, 0, 0, 26}, /* a6 */ + { 0, 100, 0, 0, 26}, /* ab */ + { 49, 50, 3, 2, 26}, /* av */ + { 49, 50, 3, 2, 26}, /* avc */ + { 0, 50, 0, 0, 26}, /* asp */ + { 0, 50, 0, 0, 26} /* af */ + } +}, + +{"QQ", 23, 8, 8,"\312\224","?",vls|stp|glt, /* [Ê”] */ + { + { 270, 50, 0, 0, 23}, /* fn */ + { 490, 100, 0, 7, 23}, /* f1 */ + { 1480, 100, 0, 7, 23}, /* f2 */ + { 2500, 100, 0, 7, 23}, /* f3 */ + { 300, 20, 0, 7, 23}, /* b1 */ + { 90, 100, 0, 7, 23}, /* b2 */ + { 150, 100, 0, 7, 23}, /* b3 */ + { 0, 100, 0, 0, 23}, /* pn */ + { 0, 100, 0, 0, 23}, /* a2 */ + { 0, 100, 0, 0, 23}, /* a3 */ + { 0, 100, 0, 0, 23}, /* a4 */ + { 0, 100, 0, 0, 23}, /* a5 */ + { 0, 100, 0, 0, 23}, /* a6 */ + { 0, 100, 0, 0, 23}, /* ab */ + { 0, 50, 0, 0, 23}, /* av */ + { 0, 50, 0, 0, 23}, /* avc */ + { 34, 50, 0, 0, 23}, /* asp */ + { 60, 50, 0, 0, 23} /* af */ + } +}, + +{"M", 15, 8, 8,"m","m",blb|nas, /* [m] */ + { + { 360, 0, 3, 0, 15}, /* fn */ + { 480, 0, 3, 0, 15}, /* f1 */ + { 1000, 50, 3, 0, 15}, /* f2 */ + { 2200, 100, 5, 0, 15}, /* f3 */ + { 40, 50, 3, 0, 15}, /* b1 */ + { 175, 50, 3, 0, 15}, /* b2 */ + { 120, 100, 5, 0, 15}, /* b3 */ + { 1, 50, 3, 0, 15}, /* pn */ + { 27.5, 100, 3, 0, 15}, /* a2 */ + { 22.6, 100, 3, 0, 15}, /* a3 */ + { 0, 100, 3, 0, 15}, /* a4 */ + { 0, 100, 3, 0, 15}, /* a5 */ + { 0, 100, 3, 0, 15}, /* a6 */ + { 0, 100, 3, 0, 15}, /* ab */ + { 52, 50, 2, 0, 15}, /* av */ + { 52, 50, 2, 0, 15}, /* avc */ + { 0, 50, 2, 0, 15}, /* asp */ + { 0, 50, 2, 0, 15} /* af */ + } +}, + +{"N", 15, 8, 8,"n","n",alv|nas, /* [n] */ + { + { 450, 0, 3, 0, 15}, /* fn */ + { 480, 0, 3, 0, 15}, /* f1 */ + { 1780, 50, 3, 3, 15}, /* f2 */ + { 2620, 50, 3, 0, 15}, /* f3 */ + { 40, 50, 3, 0, 15}, /* b1 */ + { 300, 50, 3, 3, 15}, /* b2 */ + { 260, 50, 3, 0, 15}, /* b3 */ + { 1, 50, 3, 0, 15}, /* pn */ + { 32.5, 100, 3, 0, 15}, /* a2 */ + { 24.6, 100, 3, 0, 15}, /* a3 */ + { 6, 100, 3, 0, 15}, /* a4 */ + { 0, 100, 3, 0, 15}, /* a5 */ + { 0, 100, 3, 0, 15}, /* a6 */ + { 0, 100, 3, 0, 15}, /* ab */ + { 52, 50, 2, 0, 15}, /* av */ + { 52, 50, 2, 0, 15}, /* avc */ + { 0, 50, 2, 0, 15}, /* asp */ + { 0, 50, 2, 0, 15} /* af */ + } +}, + +{"NG", 15, 8, 8,"\305\213","N",vel|nas, /* [Å‹] */ + { + { 500, 0, 3, 0, 15}, /* fn */ + { 180, 50, 3, 0, 15}, /* f1 */ + { 820, 50, 5, 3, 15}, /* f2 */ + { 2900, 50, 3, 3, 15}, /* f3 */ + { 400, 50, 5, 0, 15}, /* b1 */ + { 40, 50, 5, 3, 15}, /* b2 */ + { 200, 50, 3, 0, 15}, /* b3 */ + { 1, 50, 3, 3, 15}, /* pn */ + { 27.5, 100, 3, 0, 15}, /* a2 */ + { 24.6, 100, 3, 0, 15}, /* a3 */ + { 0, 100, 3, 0, 15}, /* a4 */ + { 0, 100, 3, 0, 15}, /* a5 */ + { 0, 100, 3, 0, 15}, /* a6 */ + { 0, 100, 3, 0, 15}, /* ab */ + { 52, 50, 2, 0, 15}, /* av */ + { 56, 50, 2, 0, 15}, /* avc */ + { 14, 50, 2, 0, 15}, /* asp */ + { 0, 50, 2, 0, 15} /* af */ + } +}, + +{"DT", 26, 4, 4,"\311\276","4",vcd|alv|tap, /* [ɾ] */ + { + { 270, 50, 0, 0, 26}, /* fn */ + { 190, 50, 2, 2, 26}, /* f1 */ + { 1600, 50, 2, 2, 26}, /* f2 */ + { 2680, 0, 2, 2, 26}, /* f3 */ + { 120, 50, 2, 2, 26}, /* b1 */ + { 140, 50, 2, 2, 26}, /* b2 */ + { 250, 0, 2, 2, 26}, /* b3 */ + { 0, 100, 0, 0, 26}, /* pn */ + { 0, 100, 0, 0, 26}, /* a2 */ + { 0, 100, 0, 0, 26}, /* a3 */ + { 0, 100, 0, 0, 26}, /* a4 */ + { 0, 100, 0, 0, 26}, /* a5 */ + { 0, 100, 0, 0, 26}, /* a6 */ + { 0, 100, 0, 0, 26}, /* ab */ + { 44, 50, 0, 0, 26}, /* av */ + { 60, 50, 0, 0, 26}, /* avc */ + { 0, 50, 0, 0, 26}, /* asp */ + { 0, 50, 0, 0, 26} /* af */ + } +}, + +{"R", 10,11,11,"r","r",alv|apr, /* [r] */ + { + { 270, 50, 0, 0, 10}, /* fn */ + { 490, 100, 0, 5, 10}, /* f1 */ + { 1180, 50, 5, 5, 10}, /* f2 */ + { 1600, 50, 5, 5, 10}, /* f3 */ + { 60, 100, 0, 5, 10}, /* b1 */ + { 90, 50, 5, 5, 10}, /* b2 */ + { 150, 50, 5, 5, 10}, /* b3 */ + { 0, 100, 5, 5, 10}, /* pn */ + { 32.5, 50, 5, 5, 10}, /* a2 */ + { 24.6, 50, 5, 5, 10}, /* a3 */ + { 0, 50, 5, 5, 10}, /* a4 */ + { 0, 50, 5, 5, 10}, /* a5 */ + { 0, 50, 5, 5, 10}, /* a6 */ + { 0, 50, 5, 5, 10}, /* ab */ + { 52, 50, 0, 0, 10}, /* av */ + { 52, 50, 0, 0, 10}, /* avc */ + { 0, 50, 0, 0, 10}, /* asp */ + { 0, 50, 0, 0, 10} /* af */ + } +}, + +{"RX", 10,10,10,"\312\264","`",rzd, /* [Ê´] */ + { + { 270, 50, 0, 0, 10}, /* fn */ + { 490, 100, 0, 5, 10}, /* f1 */ + { 1180, 100, 0, 5, 10}, /* f2 */ + { 1600, 0, 5, 5, 10}, /* f3 */ + { 60, 50, 0, 5, 10}, /* b1 */ + { 90, 50, 5, 5, 10}, /* b2 */ + { 70, 50, 5, 5, 10}, /* b3 */ + { 0, 100, 5, 5, 10}, /* pn */ + { 32.5, 50, 5, 5, 10}, /* a2 */ + { 24.6, 50, 5, 5, 10}, /* a3 */ + { 0, 50, 5, 5, 10}, /* a4 */ + { 0, 50, 5, 5, 10}, /* a5 */ + { 0, 50, 5, 5, 10}, /* a6 */ + { 0, 50, 5, 5, 10}, /* ab */ + { 50, 50, 0, 0, 10}, /* av */ + { 16, 50, 0, 0, 10}, /* avc */ + { 0, 50, 0, 0, 10}, /* asp */ + { 0, 50, 0, 0, 10} /* af */ + } +}, + +{"F", 18,12,12,"f","f",vls|frc|lbd, /* [f] */ + { + { 270, 50, 0, 0, 18}, /* fn */ + { 400, 50, 3, 2, 18}, /* f1 */ + { 1420, 50, 3, 2, 18}, /* f2 */ + { 2560, 50, 3, 2, 18}, /* f3 */ + { 60, 50, 3, 2, 18}, /* b1 */ + { 90, 50, 3, 2, 18}, /* b2 */ + { 150, 50, 3, 2, 18}, /* b3 */ + { 0, 100, 0, 0, 18}, /* pn */ + { 0, 100, 0, 0, 18}, /* a2 */ + { 0, 100, 0, 0, 18}, /* a3 */ + { 0, 100, 0, 0, 18}, /* a4 */ + { 0, 100, 0, 0, 18}, /* a5 */ + { 0, 100, 0, 0, 18}, /* a6 */ + { 42, 50, 0, 0, 18}, /* ab */ + { 0, 50, 0, 0, 18}, /* av */ + { 0, 50, 0, 0, 18}, /* avc */ + { 6, 50, 0, 0, 18}, /* asp */ + { 54, 50, 0, 0, 18} /* af */ + } +}, + +{"V", 20, 5, 5,"v","v",vcd|frc|lbd, /* [v] */ + { + { 270, 50, 0, 0, 20}, /* fn */ + { 280, 50, 3, 2, 20}, /* f1 */ + { 1420, 50, 3, 2, 20}, /* f2 */ + { 2560, 50, 3, 2, 20}, /* f3 */ + { 60, 50, 3, 2, 20}, /* b1 */ + { 90, 50, 3, 2, 20}, /* b2 */ + { 150, 50, 3, 2, 20}, /* b3 */ + { 0, 100, 0, 0, 20}, /* pn */ + { 37.8, 100, 0, 0, 20}, /* a2 */ + { 26.4, 100, 0, 0, 20}, /* a3 */ + { 19.2, 100, 0, 0, 20}, /* a4 */ + { 0, 100, 0, 0, 20}, /* a5 */ + { 0, 100, 0, 0, 20}, /* a6 */ + { 0, 100, 0, 0, 20}, /* ab */ + { 49, 50, 0, 0, 20}, /* av */ + { 49, 50, 0, 0, 20}, /* avc */ + { 0, 50, 0, 0, 20}, /* asp */ + { 0, 50, 0, 0, 20} /* af */ + } +}, + +{"TH", 18,15,15,"\316\270","T",vls|frc|dnt, /* [θ] */ + { + { 270, 50, 0, 0, 18}, /* fn */ + { 400, 50, 3, 2, 18}, /* f1 */ + { 1780, 50, 3, 2, 18}, /* f2 */ + { 2680, 0, 3, 2, 18}, /* f3 */ + { 60, 50, 3, 2, 18}, /* b1 */ + { 90, 50, 3, 2, 18}, /* b2 */ + { 150, 0, 3, 2, 18}, /* b3 */ + { 0, 100, 0, 0, 18}, /* pn */ + { 23.8, 100, 0, 0, 18}, /* a2 */ + { 17.6, 100, 0, 0, 18}, /* a3 */ + { 8.8, 100, 0, 0, 18}, /* a4 */ + { 0, 100, 0, 0, 18}, /* a5 */ + { 0, 100, 0, 0, 18}, /* a6 */ + { 0, 100, 0, 0, 18}, /* ab */ + { 0, 50, 0, 0, 18}, /* av */ + { 0, 50, 0, 0, 18}, /* avc */ + { 34, 50, 0, 0, 18}, /* asp */ + { 60, 50, 0, 0, 18} /* af */ + } +}, + +{"DH", 20, 4, 4,"\303\260","D",vcd|frc|dnt, /* [ð] */ + { + { 270, 50, 0, 0, 20}, /* fn */ + { 280, 50, 3, 2, 20}, /* f1 */ + { 1600, 50, 3, 2, 20}, /* f2 */ + { 2560, 100, 3, 2, 20}, /* f3 */ + { 60, 50, 3, 2, 20}, /* b1 */ + { 90, 50, 3, 2, 20}, /* b2 */ + { 150, 100, 3, 2, 20}, /* b3 */ + { 0, 100, 0, 0, 20}, /* pn */ + { 29, 100, 0, 0, 20}, /* a2 */ + { 15.8, 100, 0, 0, 20}, /* a3 */ + { 14, 100, 0, 0, 20}, /* a4 */ + { 0, 100, 0, 0, 20}, /* a5 */ + { 0, 100, 0, 0, 20}, /* a6 */ + { 0, 100, 0, 0, 20}, /* ab */ + { 49, 50, 0, 0, 20}, /* av */ + { 49, 50, 0, 0, 20}, /* avc */ + { 0, 50, 0, 0, 20}, /* asp */ + { 0, 50, 0, 0, 20} /* af */ + } +}, + +{"S", 18,12,12,"s","s",vls|alv|frc, /* [s] */ + { + { 270, 50, 0, 0, 18}, /* fn */ + { 400, 50, 3, 2, 18}, /* f1 */ + { 1720, 50, 3, 2, 18}, /* f2 */ + { 2620, 100, 3, 2, 18}, /* f3 */ + { 200, 50, 3, 2, 18}, /* b1 */ + { 96, 50, 3, 2, 18}, /* b2 */ + { 220, 100, 3, 2, 18}, /* b3 */ + { 0, 100, 0, 0, 18}, /* pn */ + { 25.5, 100, 0, 0, 18}, /* a2 */ + { 17.6, 100, 0, 0, 18}, /* a3 */ + { 26.2, 100, 0, 0, 18}, /* a4 */ + { 0, 100, 0, 0, 18}, /* a5 */ + { 0, 100, 0, 0, 18}, /* a6 */ + { 0, 100, 0, 0, 18}, /* ab */ + { 0, 50, 0, 0, 18}, /* av */ + { 0, 50, 0, 0, 18}, /* avc */ + { 6, 50, 0, 0, 18}, /* asp */ + { 60, 50, 0, 0, 18} /* af */ + } +}, + +{"Z", 20, 4, 4,"z","z",vcd|alv|frc, /* [z] */ + { + { 270, 50, 0, 0, 20}, /* fn */ + { 280, 50, 3, 2, 20}, /* f1 */ + { 1720, 50, 3, 2, 20}, /* f2 */ + { 2560, 100, 3, 2, 20}, /* f3 */ + { 60, 50, 3, 2, 20}, /* b1 */ + { 90, 50, 3, 2, 20}, /* b2 */ + { 150, 100, 3, 2, 20}, /* b3 */ + { 0, 100, 0, 0, 20}, /* pn */ + { 22, 100, 0, 0, 20}, /* a2 */ + { 14.1, 100, 0, 0, 20}, /* a3 */ + { 22.8, 100, 0, 0, 20}, /* a4 */ + { 0, 100, 0, 0, 20}, /* a5 */ + { 0, 100, 0, 0, 20}, /* a6 */ + { 0, 100, 0, 0, 20}, /* ab */ + { 40, 50, 0, 0, 20}, /* av */ + { 54, 50, 0, 0, 20}, /* avc */ + { 0, 50, 0, 0, 20}, /* asp */ + { 60, 50, 0, 0, 20} /* af */ + } +}, + +{"CH", 18, 8, 8,"\312\203","S",vls|frc|pla, /* [ʃ] */ + { + { 270, 50, 0, 0, 18}, /* fn */ + { 400, 50, 3, 2, 18}, /* f1 */ + { 2020, 50, 3, 2, 18}, /* f2 */ + { 2560, 100, 3, 2, 18}, /* f3 */ + { 60, 50, 3, 2, 18}, /* b1 */ + { 90, 50, 3, 2, 18}, /* b2 */ + { 150, 100, 3, 2, 18}, /* b3 */ + { 0, 100, 0, 0, 18}, /* pn */ + { 29, 100, 0, 0, 18}, /* a2 */ + { 31.6, 100, 0, 0, 18}, /* a3 */ + { 17.5, 100, 0, 0, 18}, /* a4 */ + { 0, 100, 0, 0, 18}, /* a5 */ + { 0, 100, 0, 0, 18}, /* a6 */ + { 0, 100, 0, 0, 18}, /* ab */ + { 0, 50, 0, 0, 18}, /* av */ + { 0, 50, 0, 0, 18}, /* avc */ + { 34, 50, 0, 0, 18}, /* asp */ + { 60, 50, 0, 0, 18} /* af */ + } +}, + +{"SH", 18,12,12,"\312\203","S",vls|frc|pla, /* [ʃ] */ + { + { 270, 50, 0, 0, 18}, /* fn */ + { 400, 50, 3, 2, 18}, /* f1 */ + { 2200, 50, 3, 2, 18}, /* f2 */ + { 2560, 100, 3, 2, 18}, /* f3 */ + { 60, 50, 3, 2, 18}, /* b1 */ + { 90, 50, 3, 2, 18}, /* b2 */ + { 150, 100, 3, 2, 18}, /* b3 */ + { 0, 100, 0, 0, 18}, /* pn */ + { 29, 100, 0, 0, 18}, /* a2 */ + { 31.6, 100, 0, 0, 18}, /* a3 */ + { 17.5, 100, 0, 0, 18}, /* a4 */ + { 0, 100, 0, 0, 18}, /* a5 */ + { 0, 100, 0, 0, 18}, /* a6 */ + { 0, 100, 0, 0, 18}, /* ab */ + { 0, 50, 0, 0, 18}, /* av */ + { 0, 50, 0, 0, 18}, /* avc */ + { 34, 50, 0, 0, 18}, /* asp */ + { 60, 50, 0, 0, 18} /* af */ + } +}, + +{"ZH", 20, 4, 4,"\312\222","Z",vcd|frc|pla, /* [Ê’] */ + { + { 270, 50, 0, 0, 20}, /* fn */ + { 280, 50, 3, 2, 20}, /* f1 */ + { 2020, 50, 3, 2, 20}, /* f2 */ + { 2560, 100, 3, 2, 20}, /* f3 */ + { 60, 50, 3, 2, 20}, /* b1 */ + { 90, 50, 3, 2, 20}, /* b2 */ + { 150, 100, 3, 2, 20}, /* b3 */ + { 0, 100, 0, 0, 20}, /* pn */ + { 23.8, 100, 0, 0, 20}, /* a2 */ + { 26.4, 100, 0, 0, 20}, /* a3 */ + { 12.2, 100, 0, 0, 20}, /* a4 */ + { 0, 100, 0, 0, 20}, /* a5 */ + { 0, 100, 0, 0, 20}, /* a6 */ + { 0, 100, 0, 0, 20}, /* ab */ + { 49, 50, 0, 0, 20}, /* av */ + { 49, 50, 0, 0, 20}, /* avc */ + { 0, 50, 0, 0, 20}, /* asp */ + { 0, 50, 0, 0, 20} /* af */ + } +}, + +{"X", 18,12,12,"x","x",vls|vel|frc, /* [x] */ + { + { 270, 50, 0, 0, 18}, /* fn */ + { 190, 50, 3, 3, 18}, /* f1 */ + { 1480, 50, 3, 3, 18}, /* f2 */ + { 2620, 50, 3, 3, 18}, /* f3 */ + { 60, 50, 3, 3, 18}, /* b1 */ + { 90, 50, 3, 3, 18}, /* b2 */ + { 150, 50, 3, 3, 18}, /* b3 */ + { 0, 100, 0, 0, 18}, /* pn */ + { 37.8, 100, 0, 0, 18}, /* a2 */ + { 29.9, 100, 0, 0, 18}, /* a3 */ + { 5.2, 100, 0, 0, 18}, /* a4 */ + { 0, 100, 0, 0, 18}, /* a5 */ + { 0, 100, 0, 0, 18}, /* a6 */ + { 0, 100, 0, 0, 18}, /* ab */ + { 0, 50, 0, 0, 18}, /* av */ + { 0, 50, 0, 0, 18}, /* avc */ + { 34, 50, 0, 0, 18}, /* asp */ + { 60, 50, 0, 0, 18} /* af */ + } +}, + +{"H", 9,10,10,"h","h",vls|glt|apr, /* [h] */ + { + { 270, 50, 0, 0, 9}, /* fn */ + { 490, 100, 0, 7, 9}, /* f1 */ + { 1480, 100, 0, 7, 9}, /* f2 */ + { 2500, 100, 0, 7, 9}, /* f3 */ + { 300, 20, 0, 7, 9}, /* b1 */ + { 90, 100, 0, 7, 9}, /* b2 */ + { 150, 100, 0, 7, 9}, /* b3 */ + { 0, 100, 0, 7, 9}, /* pn */ + { 34.2, 100, 0, 7, 9}, /* a2 */ + { 15.8, 100, 0, 7, 9}, /* a3 */ + { 8.8, 100, 0, 7, 9}, /* a4 */ + { 0, 100, 0, 7, 9}, /* a5 */ + { 0, 100, 0, 7, 9}, /* a6 */ + { 0, 100, 0, 7, 9}, /* ab */ + { 0, 50, 0, 0, 9}, /* av */ + { 0, 50, 0, 0, 9}, /* avc */ + { 34, 50, 0, 0, 9}, /* asp */ + { 60, 50, 0, 0, 9} /* af */ + } +}, + +{"L", 11, 8, 8,"l","l",vcd|alv|lat, /* [l] */ + { + { 270, 50, 0, 0, 11}, /* fn */ + { 460, 50, 6, 0, 11}, /* f1 */ + { 1480, 50, 6, 0, 11}, /* f2 */ + { 2500, 50, 6, 0, 11}, /* f3 */ + { 60, 50, 6, 0, 11}, /* b1 */ + { 90, 50, 6, 0, 11}, /* b2 */ + { 150, 50, 6, 0, 11}, /* b3 */ + { 0, 100, 0, 0, 11}, /* pn */ + { 23.8, 100, 0, 0, 11}, /* a2 */ + { 15.8, 100, 0, 0, 11}, /* a3 */ + { 7, 100, 0, 0, 11}, /* a4 */ + { 0, 100, 0, 0, 11}, /* a5 */ + { 0, 100, 0, 0, 11}, /* a6 */ + { 0, 100, 0, 0, 11}, /* ab */ + { 52, 50, 0, 0, 11}, /* av */ + { 52, 50, 0, 0, 11}, /* avc */ + { 0, 50, 0, 0, 11}, /* asp */ + { 0, 50, 0, 0, 11} /* af */ + } +}, + +{"HL", 11,10,10,"\311\254","K",vls|alv|lat, /* [ɬ] */ + { + { 270, 50, 0, 0, 11}, /* fn */ + { 460, 50, 0, 7, 11}, /* f1 */ + { 1480, 50, 0, 7, 11}, /* f2 */ + { 2500, 50, 0, 7, 11}, /* f3 */ + { 60, 50, 0, 7, 11}, /* b1 */ + { 90, 50, 0, 7, 11}, /* b2 */ + { 150, 50, 0, 7, 11}, /* b3 */ + { 0, 100, 0, 7, 11}, /* pn */ + { 34.2, 100, 0, 7, 11}, /* a2 */ + { 15.8, 100, 0, 7, 11}, /* a3 */ + { 8.8, 100, 0, 7, 11}, /* a4 */ + { 0, 100, 0, 7, 11}, /* a5 */ + { 0, 100, 0, 7, 11}, /* a6 */ + { 0, 100, 0, 7, 11}, /* ab */ + { 0, 50, 0, 0, 11}, /* av */ + { 0, 50, 0, 0, 11}, /* avc */ + { 34, 50, 0, 0, 11}, /* asp */ + { 60, 50, 0, 0, 11} /* af */ + } +}, + +{"LL", 11, 8, 8,"l","l",vcd|vel|lat, /* [l] */ + { + { 270, 50, 0, 0, 11}, /* fn */ + { 460, 50, 6, 0, 11}, /* f1 */ + { 940, 50, 6, 0, 11}, /* f2 */ + { 2500, 50, 6, 0, 11}, /* f3 */ + { 60, 50, 6, 0, 11}, /* b1 */ + { 90, 50, 6, 0, 11}, /* b2 */ + { 150, 50, 6, 0, 11}, /* b3 */ + { 0, 100, 0, 0, 11}, /* pn */ + { 23.8, 100, 0, 0, 11}, /* a2 */ + { 15.8, 100, 0, 0, 11}, /* a3 */ + { 7, 100, 0, 0, 11}, /* a4 */ + { 0, 100, 0, 0, 11}, /* a5 */ + { 0, 100, 0, 0, 11}, /* a6 */ + { 0, 100, 0, 0, 11}, /* ab */ + { 52, 50, 0, 0, 11}, /* av */ + { 52, 50, 0, 0, 11}, /* avc */ + { 0, 50, 0, 0, 11}, /* asp */ + { 0, 50, 0, 0, 11} /* af */ + } +}, + +{"W", 10, 8, 8,"w","w",vcd|apr|gld|lbv, /* [w] */ + { + { 270, 50, 0, 0, 10}, /* fn */ + { 190, 50, 4, 4, 10}, /* f1 */ + { 760, 50, 4, 4, 10}, /* f2 */ + { 2020, 50, 4, 4, 10}, /* f3 */ + { 60, 50, 4, 4, 10}, /* b1 */ + { 90, 50, 4, 4, 10}, /* b2 */ + { 150, 50, 4, 4, 10}, /* b3 */ + { 0, 100, 4, 4, 10}, /* pn */ + { 25.5, 50, 4, 4, 10}, /* a2 */ + { 10.6, 50, 4, 4, 10}, /* a3 */ + { 0, 50, 4, 4, 10}, /* a4 */ + { 0, 50, 4, 4, 10}, /* a5 */ + { 0, 50, 4, 4, 10}, /* a6 */ + { 0, 50, 4, 4, 10}, /* ab */ + { 52, 50, 0, 0, 10}, /* av */ + { 52, 50, 0, 0, 10}, /* avc */ + { 0, 50, 0, 0, 10}, /* asp */ + { 0, 50, 0, 0, 10} /* af */ + } +}, + +{"Y", 10, 7, 7,"j","j",vcd|apr|gld|pal, /* [j] */ + { + { 270, 50, 0, 0, 10}, /* fn */ + { 250, 50, 4, 4, 10}, /* f1 */ + { 2500, 50, 4, 4, 10}, /* f2 */ + { 2980, 50, 4, 4, 10}, /* f3 */ + { 60, 50, 4, 4, 10}, /* b1 */ + { 90, 50, 4, 4, 10}, /* b2 */ + { 150, 50, 4, 4, 10}, /* b3 */ + { 0, 100, 4, 4, 10}, /* pn */ + { 30.8, 50, 4, 4, 10}, /* a2 */ + { 28.1, 50, 4, 4, 10}, /* a3 */ + { 17.5, 50, 4, 4, 10}, /* a4 */ + { 0, 50, 4, 4, 10}, /* a5 */ + { 0, 50, 4, 4, 10}, /* a6 */ + { 0, 50, 4, 4, 10}, /* ab */ + { 52, 50, 0, 0, 10}, /* av */ + { 16, 50, 0, 0, 10}, /* avc */ + { 0, 50, 0, 0, 10}, /* asp */ + { 0, 50, 0, 0, 10} /* af */ + } +}, + +{"AI", 2, 9, 6,"e","e",unr|lmd|fnt|vwl|dip, /* [e] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 640, 50, 5, 5, 2}, /* f1 */ + { 1600, 50, 5, 5, 2}, /* f2 */ + { 2500, 50, 5, 5, 2}, /* f3 */ + { 60, 50, 5, 5, 2}, /* b1 */ + { 90, 50, 5, 5, 2}, /* b2 */ + { 150, 50, 5, 5, 2}, /* b3 */ + { 0, 100, 5, 5, 2}, /* pn */ + { 43, 50, 5, 5, 2}, /* a2 */ + { 24.6, 50, 5, 5, 2}, /* a3 */ + { 15.8, 50, 5, 5, 2}, /* a4 */ + { 0, 50, 5, 5, 2}, /* a5 */ + { 0, 50, 5, 5, 2}, /* a6 */ + { 0, 50, 5, 5, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"aN", 2, 9, 6,"\303\243","a~",unr|low|fnt|vwl|nas, /* [ã] */ + { + { 500, 50, 0, 0, 2}, /* fn */ + { 890, 50, 5, 5, 2}, /* f1 */ + { 1120, 60, 5, 5, 2}, /* f2 */ + { 2600, 50, 5, 5, 2}, /* f3 */ + { 60, 50, 5, 5, 2}, /* b1 */ + { 90, 50, 5, 5, 2}, /* b2 */ + { 150, 50, 5, 5, 2}, /* b3 */ + { 0, 100, 5, 5, 2}, /* pn */ + { 46.5, 50, 5, 5, 2}, /* a2 */ + { 19.4, 50, 5, 5, 2}, /* a3 */ + { 8.8, 50, 5, 5, 2}, /* a4 */ + { 0, 50, 5, 5, 2}, /* a5 */ + { 0, 50, 5, 5, 2}, /* a6 */ + { 0, 50, 5, 5, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 46, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"I", 2, 8, 6,"\311\252","I",unr|lax|fnt|vwl, /* [ɪ] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 370, 50, 4, 4, 2}, /* f1 */ + { 2100, 50, 4, 4, 2}, /* f2 */ + { 2500, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 34.2, 50, 4, 4, 2}, /* a2 */ + { 24.6, 50, 4, 4, 2}, /* a3 */ + { 15.8, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"oN", 2, 9, 6,"\303\265","o~",rnd|smh|bck|vwl|nas, /* [õ] */ + { + { 370, 50, 0, 0, 2}, /* fn */ + { 470, 50, 4, 4, 2}, /* f1 */ + { 700, 50, 4, 4, 2}, /* f2 */ + { 2200, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 39.5, 50, 4, 4, 2}, /* a2 */ + { 17.6, 50, 4, 4, 2}, /* a3 */ + { 8.8, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"IE", 2, 9, 6,"a","a",unr|low|fnt|vwl|dip, /* [a] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 790, 50, 5, 5, 2}, /* f1 */ + { 1340, 50, 5, 5, 2}, /* f2 */ + { 2500, 50, 5, 5, 2}, /* f3 */ + { 60, 50, 5, 5, 2}, /* b1 */ + { 90, 50, 5, 5, 2}, /* b2 */ + { 150, 50, 5, 5, 2}, /* b3 */ + { 0, 100, 5, 5, 2}, /* pn */ + { 46.5, 50, 5, 5, 2}, /* a2 */ + { 19.4, 50, 5, 5, 2}, /* a3 */ + { 8.8, 50, 5, 5, 2}, /* a4 */ + { 0, 50, 5, 5, 2}, /* a5 */ + { 0, 50, 5, 5, 2}, /* a6 */ + { 0, 50, 5, 5, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"a", 2, 9, 6,"a","a",unr|low|fnt|vwl, /* [a] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 790, 50, 5, 5, 2}, /* f1 */ + { 1820, 50, 5, 5, 2}, /* f2 */ + { 2500, 50, 5, 5, 2}, /* f3 */ + { 60, 50, 5, 5, 2}, /* b1 */ + { 90, 50, 5, 5, 2}, /* b2 */ + { 150, 50, 5, 5, 2}, /* b3 */ + { 0, 100, 5, 5, 2}, /* pn */ + { 46.5, 50, 5, 5, 2}, /* a2 */ + { 19.4, 50, 5, 5, 2}, /* a3 */ + { 8.8, 50, 5, 5, 2}, /* a4 */ + { 0, 50, 5, 5, 2}, /* a5 */ + { 0, 50, 5, 5, 2}, /* a6 */ + { 0, 50, 5, 5, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"OI", 2, 9, 6,"\311\224","O",rnd|lmd|bck|vwl|dip, /* [É”] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 490, 50, 5, 5, 2}, /* f1 */ + { 820, 50, 5, 5, 2}, /* f2 */ + { 2500, 50, 5, 5, 2}, /* f3 */ + { 60, 50, 5, 5, 2}, /* b1 */ + { 90, 50, 5, 5, 2}, /* b2 */ + { 150, 50, 5, 5, 2}, /* b3 */ + { 0, 100, 5, 5, 2}, /* pn */ + { 43, 50, 5, 5, 2}, /* a2 */ + { 12.3, 50, 5, 5, 2}, /* a3 */ + { 3.5, 50, 5, 5, 2}, /* a4 */ + { 0, 50, 5, 5, 2}, /* a5 */ + { 0, 50, 5, 5, 2}, /* a6 */ + { 0, 50, 5, 5, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"OV", 2, 8, 6,"\312\212","U",rnd|lax|bck|vwl|dip, /* [ÊŠ] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 370, 50, 4, 4, 2}, /* f1 */ + { 1000, 50, 4, 4, 2}, /* f2 */ + { 2500, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 39.5, 50, 4, 4, 2}, /* a2 */ + { 17.6, 50, 4, 4, 2}, /* a3 */ + { 8.8, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"OA", 2, 9, 6,"\311\231","@",unr|mdl|cnt|vwl|dip, /* [É™] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 490, 50, 5, 5, 2}, /* f1 */ + { 1480, 50, 5, 5, 2}, /* f2 */ + { 2500, 50, 5, 5, 2}, /* f3 */ + { 60, 50, 5, 5, 2}, /* b1 */ + { 90, 50, 5, 5, 2}, /* b2 */ + { 150, 50, 5, 5, 2}, /* b3 */ + { 0, 100, 5, 5, 2}, /* pn */ + { 48.2, 50, 5, 5, 2}, /* a2 */ + { 22.9, 50, 5, 5, 2}, /* a3 */ + { 12.2, 50, 5, 5, 2}, /* a4 */ + { 0, 50, 5, 5, 2}, /* a5 */ + { 0, 50, 5, 5, 2}, /* a6 */ + { 0, 50, 5, 5, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"IA", 2, 9, 6,"\311\252","I",unr|smh|fnt|vwl|dip, /* [ɪ] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 310, 50, 5, 5, 2}, /* f1 */ + { 2200, 50, 5, 5, 2}, /* f2 */ + { 2900, 50, 5, 5, 2}, /* f3 */ + { 60, 50, 5, 5, 2}, /* b1 */ + { 90, 50, 5, 5, 2}, /* b2 */ + { 150, 50, 5, 5, 2}, /* b3 */ + { 0, 100, 5, 5, 2}, /* pn */ + { 32.5, 50, 5, 5, 2}, /* a2 */ + { 26.4, 50, 5, 5, 2}, /* a3 */ + { 17.5, 50, 5, 5, 2}, /* a4 */ + { 0, 50, 5, 5, 2}, /* a5 */ + { 0, 50, 5, 5, 2}, /* a6 */ + { 0, 50, 5, 5, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"IB", 2, 8, 6,"\311\231","@",unr|low|fnt|vwl|dip, /* [É™] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 490, 50, 4, 4, 2}, /* f1 */ + { 1480, 50, 4, 4, 2}, /* f2 */ + { 2500, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 48.2, 50, 4, 4, 2}, /* a2 */ + { 22.9, 50, 4, 4, 2}, /* a3 */ + { 12.2, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"AIR", 2, 9, 6,"e","e",unr|lmd|fnt|vwl|dip, /* [e] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 640, 50, 5, 5, 2}, /* f1 */ + { 2020, 50, 5, 5, 2}, /* f2 */ + { 2500, 50, 5, 5, 2}, /* f3 */ + { 60, 50, 5, 5, 2}, /* b1 */ + { 90, 50, 5, 5, 2}, /* b2 */ + { 150, 50, 5, 5, 2}, /* b3 */ + { 0, 100, 5, 5, 2}, /* pn */ + { 39.5, 50, 5, 5, 2}, /* a2 */ + { 28.1, 50, 5, 5, 2}, /* a3 */ + { 17.5, 50, 5, 5, 2}, /* a4 */ + { 0, 50, 5, 5, 2}, /* a5 */ + { 0, 50, 5, 5, 2}, /* a6 */ + { 0, 50, 5, 5, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"OOR", 2, 9, 6,"\312\212","U",rnd|lax|bck|vwl|dip, /* [ÊŠ] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 370, 50, 5, 5, 2}, /* f1 */ + { 1000, 50, 5, 5, 2}, /* f2 */ + { 2500, 50, 5, 5, 2}, /* f3 */ + { 60, 50, 5, 5, 2}, /* b1 */ + { 90, 50, 5, 5, 2}, /* b2 */ + { 150, 50, 5, 5, 2}, /* b3 */ + { 0, 100, 5, 5, 2}, /* pn */ + { 39.5, 50, 5, 5, 2}, /* a2 */ + { 17.6, 50, 5, 5, 2}, /* a3 */ + { 8.8, 50, 5, 5, 2}, /* a4 */ + { 0, 50, 5, 5, 2}, /* a5 */ + { 0, 50, 5, 5, 2}, /* a6 */ + { 0, 50, 5, 5, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"o", 2, 9, 6,"o","o",rnd|smh|bck|vwl, /* [o] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 370, 50, 4, 4, 2}, /* f1 */ + { 700, 50, 4, 4, 2}, /* f2 */ + { 2200, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 39.5, 50, 4, 4, 2}, /* a2 */ + { 17.6, 50, 4, 4, 2}, /* a3 */ + { 8.8, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"EE", 2,11, 7,"i","i",unr|hgh|fnt|vwl, /* [i] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 250, 50, 4, 4, 2}, /* f1 */ + { 2320, 50, 4, 4, 2}, /* f2 */ + { 3200, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 30.8, 50, 4, 4, 2}, /* a2 */ + { 26.4, 50, 4, 4, 2}, /* a3 */ + { 17.5, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"YY", 2,14, 9,"y","y",rnd|hgh|fnt|vwl, /* [y] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 250, 50, 4, 4, 2}, /* f1 */ + { 2100, 50, 4, 4, 2}, /* f2 */ + { 2700, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 30.8, 50, 4, 4, 2}, /* a2 */ + { 26.4, 50, 4, 4, 2}, /* a3 */ + { 17.5, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"EY", 2,11, 7,"\311\250","1",unr|hgh|cnt|vwl, /* [ɨ] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 250, 50, 4, 4, 2}, /* f1 */ + { 1600, 50, 4, 4, 2}, /* f2 */ + { 2500, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 30.8, 50, 4, 4, 2}, /* a2 */ + { 26.4, 50, 4, 4, 2}, /* a3 */ + { 17.5, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"JU", 2,11, 7,"\312\211","}",rnd|hgh|cnt|vwl, /* [ʉ] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 250, 50, 4, 4, 2}, /* f1 */ + { 1400, 50, 4, 4, 2}, /* f2 */ + { 2200, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 30.8, 50, 4, 4, 2}, /* a2 */ + { 26.4, 50, 4, 4, 2}, /* a3 */ + { 17.5, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"UW", 2,14, 9,"\311\257","M",unr|hgh|bck|vwl, /* [ɯ] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 250, 50, 4, 4, 2}, /* f1 */ + { 1080, 50, 4, 4, 2}, /* f2 */ + { 2500, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 36, 50, 4, 4, 2}, /* a2 */ + { 7.1, 50, 4, 4, 2}, /* a3 */ + { 0, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"UU", 2,14, 9,"u","u",rnd|hgh|bck|vwl, /* [u] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 250, 50, 4, 4, 2}, /* f1 */ + { 740, 50, 4, 4, 2}, /* f2 */ + { 2200, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 36, 50, 4, 4, 2}, /* a2 */ + { 7.1, 50, 4, 4, 2}, /* a3 */ + { 0, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"oeN", 2, 8, 4,"\305\223\314\203","9~",rnd|lmd|fnt|vwl|nas, /* [œ̃] */ + { + { 505, 50, 0, 0, 2}, /* fn */ + { 740, 50, 4, 4, 2}, /* f1 */ + { 1680, 50, 4, 4, 2}, /* f2 */ + { 2500, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 39.5, 50, 4, 4, 2}, /* a2 */ + { 28.1, 50, 4, 4, 2}, /* a3 */ + { 17.5, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"IU", 2, 8, 6,"\312\217","Y",rnd|lax|fnt|vwl, /* [Ê] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 380, 50, 4, 4, 2}, /* f1 */ + { 1840, 50, 4, 4, 2}, /* f2 */ + { 2200, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 34.2, 50, 4, 4, 2}, /* a2 */ + { 24.6, 50, 4, 4, 2}, /* a3 */ + { 15.8, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"OO", 2, 6, 4,"\312\212","U",rnd|lax|bck|vwl, /* [ÊŠ] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 330, 50, 4, 4, 2}, /* f1 */ + { 960, 50, 4, 4, 2}, /* f2 */ + { 2200, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 39.5, 50, 4, 4, 2}, /* a2 */ + { 17.6, 50, 4, 4, 2}, /* a3 */ + { 8.8, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"e", 2, 8, 4,"e","e",unr|smh|fnt|vwl, /* [e] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 540, 50, 4, 4, 2}, /* f1 */ + { 2040, 50, 4, 4, 2}, /* f2 */ + { 2500, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 39.5, 50, 4, 4, 2}, /* a2 */ + { 28.1, 50, 4, 4, 2}, /* a3 */ + { 17.5, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"eN", 2, 8, 4,"\341\272\275","e~",unr|smh|fnt|vwl|nas, /* [ẽ] */ + { + { 455, 50, 0, 0, 2}, /* fn */ + { 640, 50, 4, 4, 2}, /* f1 */ + { 2040, 50, 4, 4, 2}, /* f2 */ + { 2500, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 39.5, 50, 4, 4, 2}, /* a2 */ + { 28.1, 50, 4, 4, 2}, /* a3 */ + { 17.5, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"EU", 2,10, 6,"\303\270","2",rnd|smh|fnt|vwl, /* [ø] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 540, 50, 4, 4, 2}, /* f1 */ + { 1840, 50, 4, 4, 2}, /* f2 */ + { 2500, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 34.2, 50, 4, 4, 2}, /* a2 */ + { 24.6, 50, 4, 4, 2}, /* a3 */ + { 15.8, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"Ur", 2, 8, 4,"\311\230","@\\",unr|lmd|cnt|vwl, /* [ɘ] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 380, 50, 4, 4, 2}, /* f1 */ + { 1480, 50, 4, 4, 2}, /* f2 */ + { 2500, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 39.5, 50, 4, 4, 2}, /* a2 */ + { 28.1, 50, 4, 4, 2}, /* a3 */ + { 17.5, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"UR", 2, 8, 4,"\311\265","8",rnd|lmd|cnt|vwl, /* [ɵ] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 370, 50, 4, 4, 2}, /* f1 */ + { 1280, 50, 4, 4, 2}, /* f2 */ + { 2200, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 39.5, 50, 4, 4, 2}, /* a2 */ + { 28.1, 50, 4, 4, 2}, /* a3 */ + { 17.5, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"UE", 2, 9, 6,"\311\244","7",unr|smh|bck|vwl, /* [ɤ] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 390, 50, 4, 4, 2}, /* f1 */ + { 940, 50, 4, 4, 2}, /* f2 */ + { 2200, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 39.5, 50, 4, 4, 2}, /* a2 */ + { 17.6, 50, 4, 4, 2}, /* a3 */ + { 8.8, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"A", 2, 4, 4,"\311\231","@",unr|mdl|cnt|vwl, /* [É™] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 490, 50, 4, 4, 2}, /* f1 */ + { 1480, 50, 4, 4, 2}, /* f2 */ + { 2500, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 48.2, 50, 4, 4, 2}, /* a2 */ + { 22.9, 50, 4, 4, 2}, /* a3 */ + { 12.2, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"EH", 2, 8, 4,"\311\233","E",unr|lmd|fnt|vwl, /* [É›] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 630, 50, 4, 4, 2}, /* f1 */ + { 1900, 50, 4, 4, 2}, /* f2 */ + { 2500, 50, 4, 4, 2}, /* f3 */ + { 300, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 44.8, 50, 4, 4, 2}, /* a2 */ + { 28.1, 50, 4, 4, 2}, /* a3 */ + { 17.5, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"oe", 2, 8, 4,"\305\223","9",rnd|lmd|fnt|vwl, /* [Å“] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 640, 50, 4, 4, 2}, /* f1 */ + { 1680, 50, 4, 4, 2}, /* f2 */ + { 2500, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 39.5, 50, 4, 4, 2}, /* a2 */ + { 28.1, 50, 4, 4, 2}, /* a3 */ + { 17.5, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"ER", 2,16,16,"\311\234","3",unr|lmd|cnt|vwl, /* [Éœ] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 580, 50, 4, 4, 2}, /* f1 */ + { 1420, 50, 4, 4, 2}, /* f2 */ + { 2500, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 43, 50, 4, 4, 2}, /* a2 */ + { 22.9, 50, 4, 4, 2}, /* a3 */ + { 12.2, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"Er", 2,16,16,"\311\236","3\\",rnd|lmd|cnt|vwl, /* [Éž] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 580, 50, 4, 4, 2}, /* f1 */ + { 1180, 50, 4, 4, 2}, /* f2 */ + { 2200, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 43, 50, 4, 4, 2}, /* a2 */ + { 22.9, 50, 4, 4, 2}, /* a3 */ + { 12.2, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"U", 2, 9, 6,"\312\214","V",unr|lmd|bck|vwl, /* [ÊŒ] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 700, 50, 4, 4, 2}, /* f1 */ + { 1120, 50, 4, 4, 2}, /* f2 */ + { 2500, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 41.2, 50, 4, 4, 2}, /* a2 */ + { 21.1, 50, 4, 4, 2}, /* a3 */ + { 10.5, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"AW", 2,16,10,"\311\224","O",rnd|lmd|bck|vwl, /* [É”] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 500, 50, 4, 4, 2}, /* f1 */ + { 760, 50, 4, 4, 2}, /* f2 */ + { 2500, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 43, 50, 4, 4, 2}, /* a2 */ + { 12.3, 50, 4, 4, 2}, /* a3 */ + { 3.5, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"AA", 2,10, 5,"\303\246","{",unr|low|fnt|vwl, /* [æ] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 710, 50, 4, 4, 2}, /* f1 */ + { 1660, 50, 4, 4, 2}, /* f2 */ + { 2500, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 39.5, 50, 4, 4, 2}, /* a2 */ + { 28.1, 50, 4, 4, 2}, /* a3 */ + { 17.5, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"OE", 2, 9, 6,"\311\266","&",rnd|low|fnt|vwl, /* [ɶ] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 800, 50, 5, 5, 2}, /* f1 */ + { 1520, 50, 5, 5, 2}, /* f2 */ + { 2200, 50, 5, 5, 2}, /* f3 */ + { 60, 50, 5, 5, 2}, /* b1 */ + { 90, 50, 5, 5, 2}, /* b2 */ + { 150, 50, 5, 5, 2}, /* b3 */ + { 0, 100, 5, 5, 2}, /* pn */ + { 46.5, 50, 5, 5, 2}, /* a2 */ + { 19.4, 50, 5, 5, 2}, /* a3 */ + { 8.8, 50, 5, 5, 2}, /* a4 */ + { 0, 50, 5, 5, 2}, /* a5 */ + { 0, 50, 5, 5, 2}, /* a6 */ + { 0, 50, 5, 5, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"AR", 2,15,15,"\311\221","A",unr|low|bck|vwl, /* [É‘] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 790, 50, 4, 4, 2}, /* f1 */ + { 1220, 50, 4, 4, 2}, /* f2 */ + { 2500, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 46.5, 50, 4, 4, 2}, /* a2 */ + { 19.4, 50, 4, 4, 2}, /* a3 */ + { 8.8, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"O", 2, 9, 6,"\311\222","Q",rnd|low|bck|vwl, /* [É’] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 610, 50, 4, 4, 2}, /* f1 */ + { 880, 50, 4, 4, 2}, /* f2 */ + { 2500, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 44.8, 50, 4, 4, 2}, /* a2 */ + { 12.3, 50, 4, 4, 2}, /* a3 */ + { 1.8, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 58, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +}, + +{"VWL", 2,10,10,"#","#",rnd|low|bck|vwl, /* [#] */ + { + { 270, 50, 0, 0, 2}, /* fn */ + { 380, 50, 4, 4, 2}, /* f1 */ + { 700, 50, 4, 4, 2}, /* f2 */ + { 2300, 50, 4, 4, 2}, /* f3 */ + { 60, 50, 4, 4, 2}, /* b1 */ + { 90, 50, 4, 4, 2}, /* b2 */ + { 150, 50, 4, 4, 2}, /* b3 */ + { 0, 100, 4, 4, 2}, /* pn */ + { 44.8, 50, 4, 4, 2}, /* a2 */ + { 12.3, 50, 4, 4, 2}, /* a3 */ + { 1.8, 50, 4, 4, 2}, /* a4 */ + { 0, 50, 4, 4, 2}, /* a5 */ + { 0, 50, 4, 4, 2}, /* a6 */ + { 0, 50, 4, 4, 2}, /* ab */ + { 62, 50, 0, 0, 2}, /* av */ + { 16, 50, 0, 0, 2}, /* avc */ + { 0, 50, 0, 0, 2}, /* asp */ + { 0, 50, 0, 0, 2} /* af */ + } +} diff --git a/stella/src/emucore/rsynth/INSTALL b/stella/src/emucore/rsynth/INSTALL new file mode 100644 index 000000000..d37b8c054 --- /dev/null +++ b/stella/src/emucore/rsynth/INSTALL @@ -0,0 +1,169 @@ +$Id: INSTALL,v 1.1 2006-06-11 07:13:20 urchlay Exp $ + +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If at some point `config.cache' +contains results you don't want to keep, you may remove or edit it. + + The file `configure.in' is used to create `configure' by a program +called `autoconf'. You only need `configure.in' if you want to change +it or regenerate `configure' using a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source directory by typing `make clean'. To also remove the files + that `configure' created (so you can compile the package for a + different kind of computer), type `make distclean'. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure + +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + +Using a Different Build Directory +================================= + + You can compile the package in a different directory from the one +containing the source code. Doing so allows you to compile it on more +than one kind of computer at the same time. To do this, you must use a +version of `make' that supports the `VPATH' variable, such as GNU +`make'. `cd' to the directory where you want the object files and +executables to go and run the `configure' script. `configure' +automatically checks for the source code in the directory that +`configure' is in and in `..'. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' can not figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it can not guess the host type, give it the +`--host=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name with three fields: + CPU-COMPANY-SYSTEM + +See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the host type. + + If you are building compiler tools for cross-compiling, you can also +use the `--target=TYPE' option to select the type of system they will +produce code for and the `--build=TYPE' option to select the type of +system on which you are compiling the package. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Operation Controls +================== + + `configure' recognizes the following options to control how it +operates. + +`--cache-file=FILE' + Save the results of the tests in FILE instead of `config.cache'. + Set FILE to `/dev/null' to disable caching, for debugging + `configure'. + +`--help' + Print a summary of the options to `configure', and exit. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`configure' also accepts some other, not widely useful, options. + diff --git a/stella/src/emucore/rsynth/MANIFEST b/stella/src/emucore/rsynth/MANIFEST new file mode 100644 index 000000000..ac8a79f6b --- /dev/null +++ b/stella/src/emucore/rsynth/MANIFEST @@ -0,0 +1,114 @@ +COPYING GPL +COPYING.LIB LGPL +Change.log What has happened +Elements.def Definition of elements +INSTALL How to install +MANIFEST This file +MANIFEST.SKIP Things that don't get included here +Makefile.in Pre configure Makefile +OldChanges Changes from RCS days +PORTING Outline of audio driver needs +kmap Phone mappings +README Please do ;-) +Revision.c Clunky way of setting revision +Rsynth/Audio.pm Perl API to this +Rsynth/Audio.xs Perl C bindings +Rsynth/Elements.pm Perl access to Elements +Rsynth/Makefile.PL Perl API build +Rsynth/t/elem.t Test low level Perl API +Rsynth/t/phones.t Test data +Rsynth/phtoelm.def Phone to element data +Rsynth/typemap Perl/C type conversion +Sampa.pm Perl code to read sampa.htm +aufile.c Sun .au file writer +aufile.h Sun .au file writer +charset.c Locale and charcter set choices +charset.h +config.guess configure support +config.h.in configure support +config.sub configure support +config/NeXTplay.c +config/config.win32 +config/dummyplay.c +config/freebsdplay.c +config/hpuxplay.c +config/alsaplay.c New ALSA Audio driver +config/ossplay.c OSS Audio driver +config/make_dist +config/mmsystem.h +config/naplay.c NAS Audio Driver +config/pipeplay.c +config/sgiplay.c +config/sunplay.c +config/sunplay_mm.c +config/win32play.c +configure Generated build script +configure.in configure support +darray.c Dynamic array C code +darray.h +dat2au Perl script for something ... +dbif.h DB/GDBM abstraction for dictionary +deutsch.c Some support for german +deutsch.h Some support for german +dict.c Dictionary code +dict.h +dlookup.c Dictionary lookup command line application +efix +elements.c Element code +elmdgm Vowel parameter display/edit tool +english.c Letter to Sound rules +english.h +euler.pho MBrola style pho file ( say -f euler.pho ) +euler.txt Plain text of above ( say < euler.txt ) +festival/.festivalrc Copy to ~/.festivalrc to enable rsynth as a voice for festival +festival/lib/rsynth.scm Festival Hackery +festival/lib/voices/english/rsynth_br_f/festvox/rsynth_br_f.scm +festival/lib/voices/english/rsynth_br_f/mrpa-sampa +festival/lib/voices/english/rsynth_br_m/festvox/rsynth_br_m.scm +festival/lib/voices/english/rsynth_br_m/mrpa-sampa +fmtelem Re-format Elements.def +fmtfeat Re-format phfeat.h +fsay Use via festival +getarg.c Command line parser +getargs.h +getrev Build assist script +guess.c Command line tool to test letter to sound rules +holmes.c Element parameter interpolation +hplay.h Audio driver API +hpuxcc.doc +iam.txt Test data +install.sh configure support +l2u.c uLaw conversion tables +l2u.h +lang.h +ldbdict perl dump of DB dictionary +ldict perl dump of GDBM dictionary +mbrola.txt Test data +mkdictdb.c Build DB/GDBM dictionary from CMU style file +naplay.c NAS audio driver +opsynth.c Core synth +phfeat.h Phoneme features +phones.c Phoneme table +phones.def Guts of phoneme table +phones.h +phrases.txt Test data +phtoelm.c Phoneme to element layer +phtoelm.h +plotparm.h +prune_elm Perl script that for Elements.def +rsynth.h Main header +sampa.htm SAMPA IPA tables as UTF-8 HTML +sample Test data +say.c Algrorithmic conversion of numbers etc. +say.h +saydate Demo +saymain.c main() of ./say application +showphone perl/Tk app to display phones.def +text test data +text.c Letter to sound driver +text.h +tkvdgm Old perl/Tk app to show vowel diagram from formants +tracks gnuplot dumpped interpollated parameters +trie.c Trie lookup code +trie.h +useconfig.h configure support diff --git a/stella/src/emucore/rsynth/MANIFEST.SKIP b/stella/src/emucore/rsynth/MANIFEST.SKIP new file mode 100644 index 000000000..6d70d4fca --- /dev/null +++ b/stella/src/emucore/rsynth/MANIFEST.SKIP @@ -0,0 +1,21 @@ +[%~]$ +\.[oa]$ +\.d$ +\.(bak|bck|save|old|db|plot|dat|bs|au)$ +\b(RCS|CVS|comments|Solaris|makefiles|SunOS.*)/ +\b[ab]Dict$ +\b(align|710)\b +text710\. +\bcheck\b +(sampa|dist|misc|voice|dict|anal|attic|MITalk|mappings|Rsynth/blib)/ +\bconfig\.h$ +\brulebuild +\brulecheck +(GNU)?[Mm]akefile$ +hplay\.c +Rsynth/Audio\.c +pm_to_blib +^(say|nasay|rsynth|mkdictdb|dlookup|guess|mid|small|tiny)$ +config\.(cache|status|log)$ +autom4te.cache/.* +^phtoelm.def diff --git a/stella/src/emucore/rsynth/Makefile b/stella/src/emucore/rsynth/Makefile new file mode 100644 index 000000000..07a7d1425 --- /dev/null +++ b/stella/src/emucore/rsynth/Makefile @@ -0,0 +1,166 @@ +# $Id: Makefile,v 1.1 2006-06-11 07:13:20 urchlay Exp $ + + +SRCDIR = . +CC = gcc +RANLIB = ranlib +PREFIX = /usr/local +BIN_DIR = $(PREFIX)/bin +LIB_DIR = $(PREFIX)/lib/dict +LDLIBS = -lm -lgdbm -ldb -L/usr/local/lib -lasound +XLIBS = -L/usr/X11R6/lib64 -lXt -L/usr/X11R6/lib64 -lX11 -lnsl +CFLAGS = -g -O2 +CPPFLAGS = -I. -I. -I/usr/local/include -I/usr/X11R6/include +DEFS = -DDICT_DIR=\"$(LIB_DIR)\" -DDEFAULT_DICT=\"$(DEFAULT_DICT)\" +PROGS = say mkdictdb dlookup mkdictdb dlookup +ADICT = +BDICT = +BUILD = perlstuff +DICTS = +PERL = /usr/bin/perl +FESTIVAL = +DEFAULT_DICT = b +INSTALL = /usr/bin/ginstall -c +INSTALL_PROG = ${INSTALL} +INSTALL_DATA = ${INSTALL} -m 644 +EXTRA_INST = install_perl +MESSAGE = Hello there +LIBRARY = Rsynth/librsynth.a + +.c.o : + $(CC) $(CFLAGS) $(CPPFLAGS) -IRsynth $(DEFS) -c -o $@ $< + +all :: $(PROGS) $(BUILD) + +check :: all perl_check + (./say $(MESSAGE) || ./nasay $(MESSAGE)) + + +SYNOBJ = opsynth.o elements.o holmes.o trie.o phtoelm.o darray.o +PHONOBJ = say.o phones.o text.o english.o deutsch.o charset.o + +$(LIBRARY) : $(SYNOBJ) $(PHONOBJ) + $(AR) rc $@ $(SYNOBJ) $(PHONOBJ) + $(RANLIB) $@ + +SAY_OBJS = $(PHONOBJ) l2u.o aufile.o getarg.o Revision.o dict.o saymain.o + +say : $(LIBRARY) $(SAY_OBJS) hplay.o + $(CC) -o $@ $(LDFLAGS) $(SAY_OBJS) $(SYNOBJ) hplay.o $(LIBRARY) $(LDLIBS) + +nasay : $(LIBRARY) $(SAY_OBJS) naplay.o + $(CC) -o $@ $(LDFLAGS) $(SAY_OBJS) $(SYNOBJ) naplay.o $(LIBRARY) $(XLIBS) $(LDLIBS) + +mkdictdb : mkdictdb.o $(LIBRARY) + $(CC) -o $@ $(LDFLAGS) mkdictdb.o $(LIBRARY) $(LDLIBS) + +dlookup : dlookup.o getarg.o $(LIBRARY) + $(CC) -o $@ $(LDFLAGS) dlookup.o getarg.o dict.o $(LIBRARY) $(LDLIBS) + +clean :: + if test -f Rsynth/Makefile ; then cd Rsynth && make PERL=$(PERL) clean ; fi + rm -f $(LIBRARY) $(PROGS) $(DICTS) *.o tmp.par core *~ *% ,* .e[cks]1 + +distclean :: clean + if test -f Rsynth/Makefile ; then cd Rsynth && make PERL=$(PERL) distclean ; fi + rm -f Makefile config.status config.h config.log config.cache hplay.c + + +hplay.o : hplay.c getargs.h hplay.h + +aDict.db : $(ADICT) mkdictdb + LANG=en_US mkdictdb $(ADICT) aDict.db + touch $@ + +bDict.db : $(BDICT) mkdictdb + LANG=en_GB mkdictdb $(BDICT) bDict.db + touch $@ + +install : $(PROGS) $(DICTS) $(EXTRA_INST) + mkdir -p $(PREFIX) $(BIN_DIR) $(LIB_DIR) + for f in $(PROGS); do \ + $(INSTALL_PROG) $$f $(BIN_DIR); \ + done + $(INSTALL) -d $(LIB_DIR) + for f in $(DICTS); do \ + $(INSTALL_DATA) $$f $(LIB_DIR); \ + done + +perl_check : + if test -f Rsynth/Makefile ; then cd Rsynth && make PERL=$(PERL) test ; fi + +perlstuff : $(LIBRARY) Rsynth/Makefile.PL + cd Rsynth && $(PERL) Makefile.PL && $(MAKE) PERL=$(PERL) + +festival : + +install_perl : + cd Rsynth && $(MAKE) PERL=$(PERL) install + +install_festival : + +phtoelm.def : Rsynth/phtoelm.def + $(INSTALL_DATA) $< $@ + + +# This bit of Makefile only works if GNU make is available +# The classic make version would have `$(SRCDIR)/getrev $(SRCDIR)` +# which does not work as it gets evaluated by 'sh' once we have cd'ed +# elsewhere. GNU make scheme uses := and $(shell...) to evaluate +# REVISION once at Makefile parse time +# It is really only needed by developer + +REVISION := $(shell $(SRCDIR)/getrev $(SRCDIR)) + +distribution: + rm -rf /tmp/rsynth-$(REVISION) + mkdir /tmp/rsynth-$(REVISION) + (cd $(SRCDIR); tar cf - `cat MANIFEST` ) | (cd /tmp/rsynth-$(REVISION); tar xf - ) + (cd /tmp; tar cvf - rsynth-$(REVISION) ) | gzip -c > $(SRCDIR)/../rsynth-$(REVISION).tar.gz + +disttest : + rm -rf /tmp/rsynth-$(REVISION) + mkdir /tmp/rsynth-$(REVISION) + (cd $(SRCDIR); tar cf - `cat MANIFEST` ) | (cd /tmp/rsynth-$(REVISION); tar xf - ) + (cd /tmp/rsynth-$(REVISION); CC=$(CC) configure ; make CC=$(CC) -k check) + + +#MM Fri Jan 2 11:28:16 2004 +aufile.o: aufile.c config.h useconfig.h getargs.h l2u.h hplay.h aufile.h +charset.o: charset.c charset.h +darray.o: darray.c config.h useconfig.h darray.h +deutsch.o: deutsch.c config.h darray.h lang.h say.h deutsch.h +dict.o: dict.c config.h charset.h phones.h phones.def useconfig.h dbif.h \ + lang.h darray.h dict.h +dlookup.o: dlookup.c config.h useconfig.h dict.h lang.h darray.h phones.h \ + phones.def getargs.h english.h +elements.o: elements.c config.h rsynth.h darray.h trie.h phfeat.h \ + Elements.def +english.o: english.c config.h darray.h lang.h say.h charset.h english.h \ + phones.h phones.def +getarg.o: getarg.c config.h useconfig.h getargs.h +guess.o: guess.c darray.h charset.h text.h phones.h phones.def lang.h \ + english.h say.h +holmes.o: holmes.c config.h useconfig.h rsynth.h darray.h trie.h \ + getargs.h plotparm.h hplay.h +hplay.o: hplay.c config.h useconfig.h l2u.h getargs.h hplay.h +l2u.o: l2u.c +mkdictdb.o: mkdictdb.c config.h useconfig.h trie.h darray.h phones.h \ + phones.def charset.h dbif.h +opsynth.o: opsynth.c config.h useconfig.h rsynth.h darray.h trie.h \ + plotparm.h +phones.o: phones.c config.h phones.h phones.def +phtoelm.o: phtoelm.c config.h useconfig.h rsynth.h darray.h trie.h \ + hplay.h phfeat.h phtoelm.def +Revision.o: Revision.c +rulebuild.o: rulebuild.c config.h useconfig.h darray.h lang.h english.h \ + phones.h phones.def charset.h text.h say.h +say.o: say.c config.h useconfig.h darray.h rsynth.h trie.h hplay.h dict.h \ + lang.h text.h getargs.h phones.h phones.def aufile.h charset.h \ + english.h deutsch.h say.h +saymain.o: saymain.c config.h useconfig.h darray.h rsynth.h trie.h \ + hplay.h dict.h lang.h text.h getargs.h phones.h phones.def aufile.h \ + charset.h english.h deutsch.h say.h +text.o: text.c config.h useconfig.h darray.h phtoelm.h lang.h text.h \ + say.h +trie.o: trie.c config.h useconfig.h trie.h diff --git a/stella/src/emucore/rsynth/Makefile.in b/stella/src/emucore/rsynth/Makefile.in new file mode 100644 index 000000000..32792b8fd --- /dev/null +++ b/stella/src/emucore/rsynth/Makefile.in @@ -0,0 +1,145 @@ +# $Id: Makefile.in,v 1.1 2006-06-11 07:13:22 urchlay Exp $ + +VPATH = @srcdir@ +SRCDIR = @srcdir@ +CC = @CC@ +RANLIB = @RANLIB@ +PREFIX = @prefix@ +BIN_DIR = $(PREFIX)/bin +LIB_DIR = $(PREFIX)/lib/dict +LDLIBS = @LIBS@ +XLIBS = @XLIBS@ +CFLAGS = @CFLAGS@ +CPPFLAGS = @CPPFLAGS@ +DEFS = -DDICT_DIR=\"$(LIB_DIR)\" -DDEFAULT_DICT=\"$(DEFAULT_DICT)\" +PROGS = @PROGS@ +ADICT = @ADICT@ +BDICT = @BDICT@ +BUILD = @BUILD@ +DICTS = @DICTS@ +PERL = @PERL@ +FESTIVAL = @FESTIVAL@ +DEFAULT_DICT = @DEFAULT_DICT@ +INSTALL = @INSTALL@ +INSTALL_PROG = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +EXTRA_INST = @EXTRA_INST@ +MESSAGE = Hello there +LIBRARY = Rsynth/librsynth.a + +.c.o : + $(CC) $(CFLAGS) $(CPPFLAGS) -IRsynth $(DEFS) -c -o $@ $< + +all :: $(PROGS) $(BUILD) + +check :: all perl_check + (./say $(MESSAGE) || ./nasay $(MESSAGE)) + + +SYNOBJ = opsynth.o elements.o holmes.o trie.o phtoelm.o darray.o +PHONOBJ = say.o phones.o text.o english.o deutsch.o charset.o + +$(LIBRARY) : $(SYNOBJ) $(PHONOBJ) + $(AR) rc $@ $(SYNOBJ) $(PHONOBJ) + $(RANLIB) $@ + +SAY_OBJS = $(PHONOBJ) l2u.o aufile.o getarg.o Revision.o dict.o saymain.o + +say : $(LIBRARY) $(SAY_OBJS) hplay.o + $(CC) -o $@ $(LDFLAGS) $(SAY_OBJS) $(SYNOBJ) hplay.o $(LIBRARY) $(LDLIBS) + +nasay : $(LIBRARY) $(SAY_OBJS) naplay.o + $(CC) -o $@ $(LDFLAGS) $(SAY_OBJS) $(SYNOBJ) naplay.o $(LIBRARY) $(XLIBS) $(LDLIBS) + +mkdictdb : mkdictdb.o $(LIBRARY) + $(CC) -o $@ $(LDFLAGS) mkdictdb.o $(LIBRARY) $(LDLIBS) + +dlookup : dlookup.o getarg.o $(LIBRARY) + $(CC) -o $@ $(LDFLAGS) dlookup.o getarg.o dict.o $(LIBRARY) $(LDLIBS) + +clean :: + if test -f Rsynth/Makefile ; then cd Rsynth && make PERL=$(PERL) clean ; fi + rm -f $(LIBRARY) $(PROGS) $(DICTS) *.o tmp.par core *~ *% ,* .e[cks]1 + +distclean :: clean + if test -f Rsynth/Makefile ; then cd Rsynth && make PERL=$(PERL) distclean ; fi + rm -f Makefile config.status config.h config.log config.cache hplay.c + + +hplay.o : hplay.c getargs.h hplay.h + +aDict.db : $(ADICT) mkdictdb + LANG=en_US mkdictdb $(ADICT) aDict.db + touch $@ + +bDict.db : $(BDICT) mkdictdb + LANG=en_GB mkdictdb $(BDICT) bDict.db + touch $@ + +install : $(PROGS) $(DICTS) $(EXTRA_INST) + mkdir -p $(PREFIX) $(BIN_DIR) $(LIB_DIR) + for f in $(PROGS); do \ + $(INSTALL_PROG) $$f $(BIN_DIR); \ + done + $(INSTALL) -d $(LIB_DIR) + for f in $(DICTS); do \ + $(INSTALL_DATA) $$f $(LIB_DIR); \ + done + +perl_check : + if test -f Rsynth/Makefile ; then cd Rsynth && make PERL=$(PERL) test ; fi + +perlstuff : $(LIBRARY) Rsynth/Makefile.PL + cd Rsynth && $(PERL) Makefile.PL && $(MAKE) PERL=$(PERL) + +festival : + +install_perl : + cd Rsynth && $(MAKE) PERL=$(PERL) install + +install_festival : + +phtoelm.def : Rsynth/phtoelm.def + $(INSTALL_DATA) $< $@ + +@make_dist@ + +#MM Fri Jan 2 11:28:16 2004 +aufile.o: aufile.c config.h useconfig.h getargs.h l2u.h hplay.h aufile.h +charset.o: charset.c charset.h +darray.o: darray.c config.h useconfig.h darray.h +deutsch.o: deutsch.c config.h darray.h lang.h say.h deutsch.h +dict.o: dict.c config.h charset.h phones.h phones.def useconfig.h dbif.h \ + lang.h darray.h dict.h +dlookup.o: dlookup.c config.h useconfig.h dict.h lang.h darray.h phones.h \ + phones.def getargs.h english.h +elements.o: elements.c config.h rsynth.h darray.h trie.h phfeat.h \ + Elements.def +english.o: english.c config.h darray.h lang.h say.h charset.h english.h \ + phones.h phones.def +getarg.o: getarg.c config.h useconfig.h getargs.h +guess.o: guess.c darray.h charset.h text.h phones.h phones.def lang.h \ + english.h say.h +holmes.o: holmes.c config.h useconfig.h rsynth.h darray.h trie.h \ + getargs.h plotparm.h hplay.h +hplay.o: hplay.c config.h useconfig.h l2u.h getargs.h hplay.h +l2u.o: l2u.c +mkdictdb.o: mkdictdb.c config.h useconfig.h trie.h darray.h phones.h \ + phones.def charset.h dbif.h +opsynth.o: opsynth.c config.h useconfig.h rsynth.h darray.h trie.h \ + plotparm.h +phones.o: phones.c config.h phones.h phones.def +phtoelm.o: phtoelm.c config.h useconfig.h rsynth.h darray.h trie.h \ + hplay.h phfeat.h phtoelm.def +Revision.o: Revision.c +rulebuild.o: rulebuild.c config.h useconfig.h darray.h lang.h english.h \ + phones.h phones.def charset.h text.h say.h +say.o: say.c config.h useconfig.h darray.h rsynth.h trie.h hplay.h dict.h \ + lang.h text.h getargs.h phones.h phones.def aufile.h charset.h \ + english.h deutsch.h say.h +saymain.o: saymain.c config.h useconfig.h darray.h rsynth.h trie.h \ + hplay.h dict.h lang.h text.h getargs.h phones.h phones.def aufile.h \ + charset.h english.h deutsch.h say.h +text.o: text.c config.h useconfig.h darray.h phtoelm.h lang.h text.h \ + say.h +trie.o: trie.c config.h useconfig.h trie.h diff --git a/stella/src/emucore/rsynth/OldChanges b/stella/src/emucore/rsynth/OldChanges new file mode 100644 index 000000000..72f6a1843 --- /dev/null +++ b/stella/src/emucore/rsynth/OldChanges @@ -0,0 +1,42 @@ +$Log: not supported by cvs2svn $ +# Revision 1.13 1994/11/08 13:30:50 a904209 +# 2.0 release +# +# Revision 1.12 1994/11/04 13:32:31 a904209 +# 1.99.1 - Change configure stuff +# +# Revision 1.11 1994/11/02 10:55:31 a904209 +# Add autoconf. Tested on SunOS/Solaris +# +# Revision 1.10 1994/10/04 17:12:50 a904209 +# 3rd pre-release +# +# Revision 1.9 1994/10/04 09:08:27 a904209 +# Next Patch merge +# +# Revision 1.8 1994/10/03 08:41:47 a904209 +# 2nd pre-release +# +# Revision 1.7 1994/09/19 15:48:29 a904209 +# Split hplay.c, gdbm dictionary, start of f0 contour, netaudio and HP ports +# +# Revision 1.6 1994/04/15 16:47:37 a904209 +# Edits for Solaris2.3 (aka SunOs 5.3) +# +# Revision 1.5 1994/02/24 15:03:05 a904209 +# Added contributed linux, NeXT and SGI ports. +# +# Revision 1.4 93/11/18 16:28:56 a904209 +# Migrated nsyth.c towards Jon's scheme - merge still incomplete +# +# Revision 1.3 93/11/16 14:32:34 a904209 +# Added RCS Ids, partial merge of Jon's new klatt/parwave +# +# Revision 1.2 93/11/16 14:30:48 a904209 +# Applied suggested linux patches and added partial SGI support +# +# Revision 1.1 93/11/16 14:26:09 a904209 +# Add RCS version control to original posting +# +# First posting of rsynth-0.9.tar.Z + diff --git a/stella/src/emucore/rsynth/PORTING b/stella/src/emucore/rsynth/PORTING new file mode 100644 index 000000000..24896a38e --- /dev/null +++ b/stella/src/emucore/rsynth/PORTING @@ -0,0 +1,61 @@ +Hopefully most of unix/compiler variant issues should be handled by configure +process. Thus porting issues should reduce (for UNIX-ish machines at least) +to writing the audio driver. + +The interface to the driver is defined in hplay.h. +There are three routines: + +extern int audio_init PROTO((int argc, char *argv[])); + + Do what ever is necessary to initialize audio. + You can process any command line arguments to influence the + behaviour. Use getargs() function to make this easy. + Where it make sense copy options from other drivers e.g. -r for + sample rate. + + This routine should also define the global variable samp_rate + to define sample rate to the core synth. + + Sample rates in 8 - 12kHz range work best due to as yet unresolved + problems with some of the digital filters. + +extern void audio_play PROTO((int n, short *data)); + + Send a block of 'n' 16 bit signed linear samples to the + audio device. If your device requires uLaw samples (US telephone standard) + then l2u.h defines routines which may help (example is Sun driver). + +extern void audio_term PROTO((void)); + Close down audio device, probably waiting for buffer(s) to empty. + +To test your driver (which should be called xxxxplay.c where xxxx describes +the system/hardware), link it to hplay.c, and "make". + +The brave/experienced might like to obtain and install GNU autoconf-2.0 (or +latter?) and the GNU m4 it needs (m4-1.3 or latter), and try and get the new +driver auto configured. + +When you have written your driver please contact me (nick@ing-simmons.net) +if you are willing to let others use it. Please let me know the output of +config.guess script to assist in merging into autoconf. + +------------------------------------------------------------------------ + +Perfomance issues. + +For best speed in DSP is done in "float", +but with strict IEEE-754 compliance turned off where possible. +This is fastest because in general for modern RISC processors +(e.g. SPARCs or at least some of them ...) + + - There is no integer multiply hardware + - There IS floating point multiply hardware + - Floating point multiply hardware cannot handle "double" in one pass. + - Some of IEEE-754 options (e.g. denormals) are handled via software traps. + +Modern x86 (Athlon/P4 do okay with float as well.) + +The computations in opsynth.c should dominate the cpu requirements +of the other levels. + + diff --git a/stella/src/emucore/rsynth/README b/stella/src/emucore/rsynth/README new file mode 100644 index 000000000..7f24f32d0 --- /dev/null +++ b/stella/src/emucore/rsynth/README @@ -0,0 +1,233 @@ + +This is a text to speech system produced by integrating various pieces +of code and tables of data, which are all (I believe) suitable +for use in OpenSource projects. + +The files in this distribution are either under GPL or LGPL. + +For best quality it is highly desirable to use one of the dictionaries +suggested below. + +The uses GNU autoconf to build a configure script. +The generic install instructions are in INSTALL, but basically +it works like this : + +configure +make +make check +say --help +say Something of your choice +make -n install # see what it is going to do +make install # copy program(s) to /usr/local/bin + +configure --help and INSTALL file explain configure options +which may help. + +To allow the package to be built when installer cannot install the +GNU gdbm package in the "normal" place you can specify a pathname +to the gdbm source directory as follows : + +configure --with-gdbm= + +e.g. + +configure --with-gdbm=$HOME/gdbm + +Currently there are the following drivers that are actively +maintained by me: + +1. Linux - ALSA or OSS + OSS driver will probably work on netbsd/freebsd etc. + configure should sort this out. + +2. Windows - I will be supporting it, but it may not work + in this version. + +3. Any machine for which a nas/netaudio port exists. + And for which configure can find the include files and libraries. + (Nas "net audio server" does for audio what X11 does for graphics.) + +There are also drivers from the really old rsynth code +which are still there: + +* Sun SPARCStations - written & tested by me (when at TI) + on SunOS4.1.3 and Solaris2.3 +* NeXT +* SGI - this built on "mips-sgi-irix4.0.5H" +* HPUX + + +Dictionaries: + + Dictionaries convert words in "text" to phonemes in "arpabet" + symbols. The arpabet symbols are then "expanded" into an ASCII + representation of the IPA. + The IPA representation is SAMPA, as defined by J C Wells at UCL see: + + http://www.phon.ucl.ac.uk/home/sampa/home.htm + + Dictionary databases can be built from either of two ftp'able + sources: + + 1. The Carnegie Mellon Pronouncing Dictionary [cmudict.0.1] is Copyright + 1993 by Carnegie Mellon University. Use of this dictionary, for any + research or commercial purpose, is completely unrestricted. If you + make use of or redistribute this material, we would appreciate + acknowlegement of its origin. + + ftp://ftp.cs.cmu.edu/project/fgdata/dict + Latest seems to be cmudict.0.6.gz + + 2. "beep" from + ftp://svr-ftp.eng.cam.ac.uk/pub/comp.speech/dictionaries + Latest seems to be beep-1.0.tar.gz + + This is a direct desendant of CUVOLAD (british pronounciation) + (as used by previous releases of rsynth), and so + has a more restrictive copyright than CMU dictionary. + + dict.c looks for bDict.db by default. b is for british e.g. beep + I use aDict.db for CMU (american) dictionary. + You can then : + + say -d a schedule # sked... + say -d b schedule # shed... + + It is simplest to obtain dictionaries prior to configuring the + package and tell it where the source are at configure time: + + + configure --with-aDict=../dict/cmudict.0.6 --with-bDict=../dict/beep-1.0 + + If you have already built/installed the package you can + gdbm from it as follows: + + mkdictdb main-dictionary-file bDict.db + mv bDict.db /usr/local/lib + + Expect a few messages from mkdictdb about words it does not like + in either dictionary. + +It should not be too hard to port it to other hardware. For a discussion of +these issues see PORTING. + +Use say --help to get a list of command line options. + +There is an experimental hook to allow you to "say" .pho files intended +for MBrola diphone synth. This is used to provide a hacky back-end +for Festival. + +Projects: + Plan is to pre-analyze the dictionaries and produce better letter + to sound rules and smaller exception dictionaries. + + Add more of IPA repertiore so that synth can attempt more languages. + + Improve quality. + +The components (top down ) : + + saymain.c + C main() function. + Initializes lower layers and then converts words from + command line or "stdin" to phonemes. + + say.c / say.h + Some "normalization" of the text is performed, in particular + numbers can be represented as sequences of digits. + + + dict.c / dict.h + + As of this release uses a GNU "gdbm" database which has been + pre-loaded with a pronounciation dictionary. + + + text.c / english.c / text.h + + An implementation of US Naval Research Laboratory rules + for converting english (american?) text to phonemes. + + Based on the version on the comp.speech archives, main changes + were in the encoding of the phonemes from the so called "arpabet" + to a more concise form used in the above dictionary. + This form (which is nmemonic if you know the International Phonetic + Alphabet), is described in the dictionary documentation. It is + also very close to that described in the postings by Evan Kirshenbaum + (evan@hplerk.hpl.hp.com) to sci.lang and alt.usage.english. (The + differences are in the vowels and are probably due to the differences + between Britsh and American english). + + + saynum.c + + Code for "saying" numbers derived from same source as above. + It has been modified to call the higher level routines recursively + rather producing phonemes directly. This will allow any systematic + changes (e.g. British vs American switch) to affect numbers without + having to change this module. + + + holmes.c / holmes.h / elements.c / elements.def + + My implementation of a phoneme to "vocal tract parameters" system + described by Holmes et. al. [1] + + The original used an Analogue Hardware synthesizer. + + opsynth.c / rsynth.h + + My re-implementation of the "Klatt" synthesizer, described + in Klatt [2]. + + hplay.c / hplay.h + + hplay.h describes a common interface. + hplay.c is a link to play/xxxplay.c + + +Acknowledgements : + +Particular thanks to + Tony Robinson ajr@eng.cam.ac.uk + + for providing FTP site for alpha testing, and telnet access to a + variety of machines. + + Many thanks to + + Axel Belinfante Axel.Belinfante@cs.utwente.nl (World Wide Web) + + Jon Iles J.P.Iles@cs.bham.ac.uk + + Rob Hooft hooft@EMBL-Heidelberg.de (linux stuff) + + Thierry Excoffier exco@ligiahp3.univ-lyon1.fr (playpipe for hpux) + Markus Gyger mgyger@itr.ch (HPUX port) + + Ben Stuyts ben@stuyts.nl (NeXT port) + + Stephen Hocking (Preliminary Netaudio port) + Greg Renda (Netaudio cleanup) + Tracey Bernath (Netaudio testing) + + "Tom Benoist" (SGI Port) + Andrew Anselmo (SGI testing) + Mark Hanning-Lee (SGI testing) + + Cornelis van der Laan (freebsd) + + for assisting me in puting this package together. + + +References : + + [1] Holmes J. N., Mattingly I, and Shearme J. (1964) + "Speech Synthesis by Rule" , Language Speech 7, 127-143 + + [2] Dennis H. Klatt (1980) + "Software for a Cascade/Parallel Formant Synthesizer", + J. Acoust. Soc. Am. 67(3), March 1980. + + + diff --git a/stella/src/emucore/rsynth/Revision.c b/stella/src/emucore/rsynth/Revision.c new file mode 100644 index 000000000..cc134ff1a --- /dev/null +++ b/stella/src/emucore/rsynth/Revision.c @@ -0,0 +1,21 @@ +/* + Copyright (c) 1994,2001-2002 Nick Ing-Simmons. All rights reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA + +*/ +char *Revision = "Revision: 3.0.0"; +char *say_ident = "@(#)say 3.0.1 2001/04/17"; /* so 'what' works */ diff --git a/stella/src/emucore/rsynth/Rsynth/Audio.pm b/stella/src/emucore/rsynth/Rsynth/Audio.pm new file mode 100644 index 000000000..db0526fac --- /dev/null +++ b/stella/src/emucore/rsynth/Rsynth/Audio.pm @@ -0,0 +1,10 @@ +package Rsynth::Audio; +use XSLoader; +our $VERSION = '0.01'; +use Audio::Data (); + +XSLoader::load "Rsynth::Audio"; + + +1; +__END__ diff --git a/stella/src/emucore/rsynth/Rsynth/Audio.xs b/stella/src/emucore/rsynth/Rsynth/Audio.xs new file mode 100644 index 000000000..c14af8132 --- /dev/null +++ b/stella/src/emucore/rsynth/Rsynth/Audio.xs @@ -0,0 +1,156 @@ +/* + Copyright (c) 1996, 2001 Nick Ing-Simmons. All rights reserved. + This program is free software; you can redistribute it and/or + modify it under the same terms as Perl itself. +*/ +#define PERL_NO_GET_CONTEXT + +#include +#include +#include +#include "Audio.m" + +AudioVtab *AudioVptr; + +#include "rsynth.h" +#include "english.h" + +lang_t *lang = &English; + +static void * +Rsynth_sample(void *user_data,float sample,unsigned nsamp, rsynth_t *rsynth) +{ + dTHX; + Audio *au = (Audio *) user_data; + float *p = Audio_more(aTHX_ au,1); + /* FIXME - avoid this divide my adjusting gain on create */ + *p = sample/32768; + return user_data; +} + +static Elm_t * +SVtoElm(pTHX_ SV *sv) +{ + if (sv_isobject(sv) && SvTYPE(SvRV(sv)) == SVt_PVHV) + { + HV *hv = (HV *) SvRV(sv); + SV **svp = hv_fetch(hv,"idx",3,0); + if (svp) + { + Elm_t *elm = &Elements[SvIV(*svp)]; + return elm; + } + } + croak("%_ is not an Element",sv); + return NULL; +} + +MODULE = Rsynth::Audio PACKAGE = Rsynth::Element PREFIX = elm_ + +void +elm_update(SV *sv) +CODE: + { + if (sv_isobject(sv) && SvTYPE(SvRV(sv)) == SVt_PVHV) + { + HV *hv = (HV *) SvRV(sv); + SV **svp = hv_fetch(hv,"idx",3,0); + if (svp) + { + Elm_t *elm = &Elements[SvIV(*svp)]; + unsigned p; + for (p = 0; p < nEparm; p++) + { + char *pname = Ep_name[p]; + svp = hv_fetch(hv,pname,strlen(pname),0); + if (svp) + { + if (SvROK(*svp) && SvTYPE(SvRV(*svp)) == SVt_PVAV) + { + AV *av = (AV *) SvRV(*svp); + if (av_len(av) != 4) + { + croak("%_->{%s} has %d values",sv,pname,av_len(av)+1); + } + svp = av_fetch(av, 0, 0); + if (svp) + { + elm->p[p].stdy = (float) SvNV(*svp); + } + svp = av_fetch(av, 1, 0); + if (svp) + { + elm->p[p].prop = (char) SvIV(*svp); + } + svp = av_fetch(av, 2, 0); + if (svp) + { + elm->p[p].ed = (char) SvIV(*svp); + } + svp = av_fetch(av, 3, 0); + if (svp) + { + elm->p[p].id = (char) SvIV(*svp); + } + svp = av_fetch(av, 4, 0); + if (svp) + { + elm->p[p].rk = (char) SvIV(*svp); + } + } + else + { + croak("%_->{%s} isn't an array",sv,pname); + } + } + } + XSRETURN(0); + } + } + croak("%_ is not an Element",sv); + XSRETURN(0); + } + + +MODULE = Rsynth::Audio PACKAGE = Rsynth::Audio PREFIX = rsynth_ + +PROTOTYPES: ENABLE + +rsynth_t * +rsynth_new(char *Class, Audio *au, float F0Hz = 133.3, float ms_per_frame = 10.0, long gain = 57) +CODE: + { + speaker_t *speaker = rsynth_speaker(F0Hz, gain, Elements); + RETVAL = rsynth_init(au->rate,ms_per_frame, speaker,Rsynth_sample,0,au); + } +OUTPUT: + RETVAL + +void +rsynth_interpolate(rsynth_t *rsynth,SV *elm,SV *f0ref = 0) +CODE: + { + STRLEN len = 0; + unsigned char *eptr = (unsigned char *) SvPV(elm,len); + float *f0 = 0; + unsigned nf0 = 0; + rsynth_flush(rsynth,rsynth_interpolate(rsynth, eptr, len, f0, nf0)); + XSRETURN(0); + } + +void +rsynth_pho(rsynth_t *rsynth, char *file, int dodur = 1, char *phones = "sampa") + +void +rsynth_phones(rsynth_t *rsynth, char *s, int len = strlen(s)) + +void +say_string(rsynth_t *rsynth, char *s) + +void +rsynth_term(rsynth_t *rsynth) + +BOOT: + { + AudioVptr = (AudioVtab *) SvIV(perl_get_sv("Audio::Data::AudioVtab",0)); + } diff --git a/stella/src/emucore/rsynth/Rsynth/Elements.pm b/stella/src/emucore/rsynth/Rsynth/Elements.pm new file mode 100755 index 000000000..bed8a54c0 --- /dev/null +++ b/stella/src/emucore/rsynth/Rsynth/Elements.pm @@ -0,0 +1,219 @@ +package Rsynth::Elements; +use strict; +use Exporter; +use base 'Exporter'; +use vars qw(@EXPORT %elem %parms @pNames @eNames); +@EXPORT = qw(read_elements write_elements write_features feature + height front round features + %elem %parms @pNames @eNames); +use Getopt::Std; +# use Sampa (); +my %opt; +getopts('c',\%opt); + + +my %height = ( hgh => 1.0, lax => 0.8, smh => 0.67, mdl => 0.5, lmd => 0.33, low => 0 ); +my %front = ( fnt => 1.0, cnt => 0.5, bck => 0); +my %round = ( unr => 0, rnd => 1); + +my %unit = (f1 => 10, f2 => 20, f3 => 100); + +sub rank +{ + my $name = shift; + my $hash = shift; + my $e = shift; + my $f = $e->{features}; + my @h = grep { exists $hash->{$_} } keys %$f; + die "No $name : ".$e->{sampa}.' '.join(' ',keys %$f).' : '.join(' ',keys %$hash) unless @h == 1; + return $hash->{$h[0]}; +} + +sub height { rank(height => \%height, @_) } +sub front { rank(front => \%front, @_) } +sub round { rank(round => \%round, @_) } + +my %fset; +my @fNames; + +my $file = "Elements.def"; + +sub NULL () {undef} + +sub feature +{ + my $f = shift; + unless (exists $fset{$f}) + { + $fset{$f} = @fNames; + push(@fNames,$f); + } +} + +sub features +{ + my $e = shift; + return sort { $fset{$a} <=> $fset{$b} } keys %{$e->{features}}; +} + +foreach my $h (\%round,\%height,\%front) + { + foreach my $f ( sort { $h->{$a} <=> $h->{$b} } keys %$h ) + { + feature($f); + } + } +feature('vwl'); +feature('dip'); + +sub read_elements +{ + $file = shift if @_; + open(my $eh,$file) || die "Cannot read $file:$!"; + my $name; + while(<$eh>) + { + if (/^\{(".*",\s*.*),\s*(\/\*.*\*\/)?\s*$/) + { + my %args; + my (@args) = split(/\s*,\s*/,$1); + my @feat = split(/\|/,pop(@args)); + my %feat; + foreach my $f (@feat) + { + next unless $f =~ /^[a-z]/i; + $feat{$f} = 1; + feature($f); + } + ($name,@args) = map(eval($_),@args); + push(@args,\%feat); + foreach my $parm (qw(rk du ud unicode sampa features)) + { + $args{$parm} = shift(@args); + $parms{$parm} = $args{$parm}; + } + utf8::decode($args{unicode}); + $elem{$name} = bless {%args,name => $name, idx => scalar(@eNames)},'Rsynth::Element'; + push(@eNames,$name); + } + elsif (/^\s*\{\s*(.*?)\s*\},?\s*\/\*\s*(\w+)/) + { + my $parm = $2; + my @val = split(/\s*,\s*/,$1); + if ($parm =~ /^a/) + { + $val[0] = 0 if ($val[0] < 0); + $val[0] = sprintf("%+6.1f",$val[0]); + } + unless (exists $parms{$parm}) + { + $parms{$parm} = $val[0]; + push(@pNames,$parm); + } + $elem{$name}{$parm} = [@val]; + } + } + my $nf = @fNames; + # warn "$nf features: @fNames\n"; + close($eh); +} + +sub write_features +{ + for (my $i=0; $i < @fNames; $i++) + { + my $val = ($i) ? (1 << ($i-1)) : 0; + printf "#define $fNames[$i] 0x%08x\n",$val; + } +} + +sub write_elements +{ + my $fh = shift; + unless (ref $fh) + { + open(my $tmp,">$fh") || die "Cannot open $fh:$!"; + $fh = $tmp; + } + binmode($fh,":utf8"); + my $save = select $fh; + print $fh <<'END'; +/* + Copyright (c) 1994,2001-2004 Nick Ing-Simmons. All rights reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA + +*/ +END + + my @ename = @eNames; + while (@ename) + { + my $name = shift(@ename); + my @feat = features($elem{$name}); + my $sampa = $elem{$name}{sampa}; + my @args = qw(rk du ud); + @args = @{$elem{$name}}{@args}; + my $uni = $elem{$name}{unicode}; + utf8::encode($elem{$name}{unicode}); + foreach my $k (qw(unicode sampa)) + { + my $v = $elem{$name}{$k}; + if (defined $v) + { + $v =~ s#([\\"])#\\$1#g; + $v =~ s/([^\x20-\x7e])/sprintf("\\%03o",ord($1))/eg; + } + $v = (defined $v) ? qq["$v"] : 'NULL'; + push(@args,$v); + } + push(@args,(@feat) ? join('|',@feat) : 0); + printf qq({"$name", %3d,%2d,%2d,%s,%s,%s, /* [$uni] */\n {\n),@args; + my @pname = @pNames; + while (@pname) + { + my $parm = shift(@pname); + my @vals = @{$elem{$name}{$parm}}; + if ($elem{$name}{features}{vwl} && exists $unit{$parm}) + { + my $u = $unit{$parm}; + $vals[0] = int($vals[0]/$u+0.5)*$u; + } + printf " {%6g,%4d,%3d,%3d,%3d}%s /* %-3s */\n", + @vals,((@pname) ? ',' : ' '),$parm; + } + printf " }\n}%s\n",((@ename) ? ",\n" : ' '); + } + select $save; +} + +{ + package Rsynth::Phones; + our %phtoelm; + do "Rsynth/phtoelm.def"; + our @U = '@U'; + + sub NULL () {return ()}; + + sub COMMENT {} + sub enter + { + my ($sampa,@seq) = @_; + $phtoelm{$sampa} = [@seq]; + } +} + +1; diff --git a/stella/src/emucore/rsynth/Rsynth/Makefile.PL b/stella/src/emucore/rsynth/Rsynth/Makefile.PL new file mode 100644 index 000000000..2ceb999c0 --- /dev/null +++ b/stella/src/emucore/rsynth/Rsynth/Makefile.PL @@ -0,0 +1,33 @@ +use ExtUtils::MakeMaker; +use File::Basename; + +my $audio = ".../Audio"; +eval "require Audio::Data"; +unless ($@) + { + $audio = dirname($INC{"Audio/Data.pm"}); + } +else + { + warn "_Need_ Audio::Data:$@" + } + +WriteMakefile( + NAME => "Rsynth::Audio", + MYEXTLIB => "librsynth.a", + INC => "-I.. -I$audio", + TYPEMAPS => ["typemap","$audio/typemap"], + VERSION_FROM => "Audio.pm", + PREREQ_PM => { 'Audio::Data' => 1.000 }, + PREREQ_FATAL => 1, +); + +package MY; + +sub post_initialize +{ + my ($self) = @_; + my ($ret) = ''; + $self->{PM}->{'phtoelm.def'} = $self->catfile('$(INST_LIBDIR)','phtoelm.def'); + return $ret; +} diff --git a/stella/src/emucore/rsynth/Rsynth/phtoelm.def b/stella/src/emucore/rsynth/Rsynth/phtoelm.def new file mode 100644 index 000000000..5fcabc1d7 --- /dev/null +++ b/stella/src/emucore/rsynth/Rsynth/phtoelm.def @@ -0,0 +1,111 @@ +COMMENT("We are using COMMENT() so this file can be perl or C"); + +COMMENT("Silences"); +enter(".","END",NULL); COMMENT("This is 1st non-aware upper layer can inject"); +enter(" ","Q",NULL); COMMENT("This is 1st non-aware upper layer can inject"); +enter("_","Q",NULL); COMMENT("'mbrola' compatibility"); +enter("#","Q",NULL); COMMENT("'mbrola' compatibility"); + +COMMENT("Affricates (compounds) - put before singles to aid lookup"); +enter("tS","T","CH",NULL); +enter("dZ","D","DY","DZ","ZH","ZH",NULL); + +COMMENT("Plosives"); +enter("p","P","PY","PZ",NULL); +enter("b","B","BY","BZ",NULL); +enter("t","T","TY","TZ",NULL); +enter("d","D","DY","DZ",NULL); +enter("k","K","KY","KZ",NULL); +enter("g","G","GY","GZ",NULL); +enter("?","QQ",NULL); COMMENT("stop-ness - not quite glottal stop"); + +COMMENT("Nasals"); +enter("m","M",NULL); +enter("n","N",NULL); +enter("N","NG",NULL); + +COMMENT("Trills and flaps"); +enter("4","DT",NULL); +enter("rr","R","QQ","R",NULL); +enter("R","RX",NULL); +enter("`","RX",NULL); COMMENT("rhoticity diacritic - fallback"); + +COMMENT("Fricatives"); +enter("f","F",NULL); +enter("v","V",NULL); +enter("T","TH",NULL); +enter("D","DH",NULL); +enter("s","S",NULL); +enter("z","Z",NULL); +enter("S","SH",NULL); +enter("Z","ZH",NULL); +enter("x","X",NULL); +enter("h","H",NULL); + +COMMENT("Latterals"); +enter("l","L",NULL); +enter("K","HL",NULL); +enter("5","LL",NULL); + +COMMENT("Approximants"); +enter("w","W",NULL); +enter("j","Y",NULL); +enter("r","R",NULL); + +COMMENT("Dipthongs"); +enter("eI","AI","I",NULL); +enter("aI","IE","I",NULL); +enter("OI","OI","I",NULL); +enter("aU","AI","OV",NULL); +enter("@U","OA","OV",NULL); +enter("I@","IA","IB",NULL); +enter("e@","AIR","IB",NULL); +enter("U@","OOR","IB",NULL); +enter("O@","OI","IB",NULL); +enter("oU","o","OV",NULL); + +COMMENT("close vowels"); +enter("i","EE",NULL); +enter("y","YY",NULL); +enter("1","EY",NULL); +enter("}","JU",NULL); +enter("M","UW",NULL); +enter("u","UU",NULL); + +COMMENT("lax vowels"); +enter("I","I",NULL); +enter("Y","IU",NULL); +enter("U","OO",NULL); + +COMMENT("close-mid vowels"); +enter("e","e",NULL); +enter("e~","eN",NULL); +enter("2","EU",NULL); +enter("@\\","Ur",NULL); +enter("8","UR",NULL); +enter("7","UE",NULL); +enter("o","o",NULL); +enter("o~","oN",NULL); + +COMMENT("schwa"); +enter("@","A",NULL); + +COMMENT("open-mid vowels"); +enter("E","EH",NULL); +enter("9","oe",NULL); +enter("9~","oeN",NULL); +enter("3","ER",NULL); +enter("3\\","Er",NULL); +enter("V","U",NULL); +enter("O","AW",NULL); + +enter("{","AA",NULL); +enter("6","AA",NULL); + +COMMENT("open vowels"); +enter("a", "a",NULL); +enter("a~", "aN",NULL); +enter("&", "OE",NULL); +enter("A","AR",NULL); +enter("Q","O",NULL); + diff --git a/stella/src/emucore/rsynth/Rsynth/t/elem.t b/stella/src/emucore/rsynth/Rsynth/t/elem.t new file mode 100644 index 000000000..cead1b566 --- /dev/null +++ b/stella/src/emucore/rsynth/Rsynth/t/elem.t @@ -0,0 +1,28 @@ +use Test::More( tests => 42 ); +BEGIN { use_ok("Rsynth::Audio") } +BEGIN { use_ok("Rsynth::Elements") } +use Audio::Play; + +read_elements("../Elements.def"); +my $elm = ''; +# Next line isn't general - all phones happen to be single SAMPA chars +for my $ph (split(//,'sInT.frQm.elIm@nts')) + { + my $list = $Rsynth::Phones::phtoelm{$ph}; + ok(defined($list),"Mapping for $ph"); + foreach my $ename (@{$list}) + { + my $e = $elem{$ename}; + ok(defined($e),"Element for $ename"); + $elm .= chr($e->{idx}); + $elm .= chr($e->{du}); + } + } +my $au = Audio::Data->new(rate => 11025); +my $synth = Rsynth::Audio->new($au); +is(ref($synth),"Rsynth::Audio","Correct class"); +$synth->interpolate($elm); +ok($au->duration > 1.0,"Created some samples"); +my $svr = Audio::Play->new; +$svr->play($au) if $svr; + diff --git a/stella/src/emucore/rsynth/Rsynth/t/phones.t b/stella/src/emucore/rsynth/Rsynth/t/phones.t new file mode 100644 index 000000000..e440d2815 --- /dev/null +++ b/stella/src/emucore/rsynth/Rsynth/t/phones.t @@ -0,0 +1,16 @@ +use Test::More( tests => 5 ); +BEGIN { use_ok("Rsynth::Audio") } +use Audio::Play; +my $au = Audio::Data->new(rate => 11025); +my $synth = Rsynth::Audio->new($au); +is(ref($synth),"Rsynth::Audio","Correct class"); +$synth->phones("sInTIsIs frQm p3l"); +# print "# ",$au->duration,"\n"; +ok($au->duration > 1.0,"Created some samples"); +my $svr = Audio::Play->new; +$svr->play($au) if $svr; +$au->length(0); +is($au->duration,0,"Cleared samples"); +$synth->say_string("Plain text too!"); +ok($au->duration > 1.0,"Created some samples"); +$svr->play($au) if $svr; diff --git a/stella/src/emucore/rsynth/Rsynth/typemap b/stella/src/emucore/rsynth/Rsynth/typemap new file mode 100644 index 000000000..5ae70ff12 --- /dev/null +++ b/stella/src/emucore/rsynth/Rsynth/typemap @@ -0,0 +1,22 @@ +TYPEMAP +rsynth_t * T_RSYNTH +Elm_t * T_ELM + +INPUT +T_RSYNTH + if (sv_isobject($arg)) { + $var = ($type) SvIV((SV*)SvRV($arg)); + } + else + croak(\"$var is not an object\") + +T_ELM + $var = ($type) SVtoElm(aTHX_ $arg); + +OUTPUT +T_RSYNTH + sv_setref_iv($arg, (Class) ? Class : \"${Package}\", (IV) $var); + +T_ELM + ElmToSV(aTHX_ $arg, $var); + diff --git a/stella/src/emucore/rsynth/Sampa.pm b/stella/src/emucore/rsynth/Sampa.pm new file mode 100644 index 000000000..91b17866b --- /dev/null +++ b/stella/src/emucore/rsynth/Sampa.pm @@ -0,0 +1,28 @@ +package Sampa; +use Exporter; +use base qw(Exporter); +@EXPORT_OK = qw(%unicode %description %example); + +open(my $sampa,"sampa.htm") || die "Cannot open sampa.htm:$!"; +while (<$sampa>) + { + my @td = m!]*>([^<>]*)!g; + if (@td >= 5) + { + my ($sampa,$IPA,$hex,$dec,$desc,$example) = @td; + die "$IPA != $dec" unless $IPA =~ /&#$dec;/; + die "0x$hex != $dec" unless hex($hex) == $dec; + $sampa =~ s/&/&/; + $unicode{$sampa} = chr($dec); + $description{$sampa} = $desc; + $example{$sampa} = $example; + # warn "'$sampa' => $dec\n"; + } + elsif (//) + { + warn "Skip [@td]:$_"; + } + } + +1; +__END__ diff --git a/stella/src/emucore/rsynth/aufile.c b/stella/src/emucore/rsynth/aufile.c new file mode 100644 index 000000000..cf2449545 --- /dev/null +++ b/stella/src/emucore/rsynth/aufile.c @@ -0,0 +1,241 @@ +/* + Copyright (c) 1994,2001-2002 Nick Ing-Simmons. All rights reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA + +*/ +#include "config.h" +#include +#include +#include "useconfig.h" +#include "getargs.h" +#include "l2u.h" +#include "hplay.h" +#include "aufile.h" + +#ifndef HAVE_FTRUNCATE +#ifdef HAVE_CHSIZE +#define ftruncate(fd,size) chsize(fd,size) +#else +#define ftruncate(fd,size) /* oh well */ +#endif +#endif +static const short endian = 0x1234; + +#define SUN_MAGIC 0x2e736e64 /* Really '.snd' */ +#define SUN_HDRSIZE 24 /* Size of minimal header */ +#define SUN_UNSPEC ((unsigned)(~0)) /* Unspecified data size */ +#define SUN_ULAW 1 /* u-law encoding */ +#define SUN_LIN_8 2 /* Linear 8 bits */ +#define SUN_LIN_16 3 /* Linear 16 bits */ + +file_write_p file_write = NULL; +file_term_p file_term = NULL; + +static char *linear_file; +static char *au_file; +static int au_fd = -1; /* file descriptor for .au ulaw file */ +static int linear_fd = -1; + +static unsigned au_encoding = SUN_ULAW; +static unsigned au_size = 0; + +static void wblong(int fd, unsigned long x); +static void +wblong(int fd, long unsigned int x) +{ + int i; + for (i = 24; i >= 0; i -= 8) + { + char byte = (char) ((x >> i) & 0xFF); + write(fd, &byte, 1); + } +} + +extern void au_header(int fd,unsigned enc,unsigned rate,unsigned size,char *comment); + +void +au_header(int fd, unsigned int enc, unsigned int rate, unsigned int size, char *comment) +{ + if (!comment) + comment = ""; + wblong(fd, SUN_MAGIC); + wblong(fd, SUN_HDRSIZE + strlen(comment)); + wblong(fd, size); + wblong(fd, enc); + wblong(fd, rate); + wblong(fd, 1); /* channels */ + write(fd, comment, strlen(comment)); +} + +static void aufile_write(int n,short *data); + +static void +aufile_write(int n, short int *data) +{ + if (n > 0) + { + if (linear_fd >= 0) + { + unsigned size = n * sizeof(short); + if (write(linear_fd, data, n * sizeof(short)) != (int) size) + perror("write"); + } + if (au_fd >= 0) + { + if (au_encoding == SUN_LIN_16) + { + unsigned size = n * sizeof(short); + if (*((const char *)(&endian)) == 0x12) + { + if (write(au_fd, data, size) != (int) size) + perror("write"); + else + au_size += size; + } + else + { + int i; + for (i=0; i < n; i++) + { + if (write(au_fd, ((char *)data)+1, 1) != 1) + perror("write"); + if (write(au_fd, ((char *)data)+0, 1) != 1) + perror("write"); + au_size += 2; + data++; + } + } + } + else if (au_encoding == SUN_ULAW) + { + unsigned char *plabuf = (unsigned char *) malloc(n); + if (plabuf) + { + unsigned char *p = plabuf; + unsigned char *e = p + n; + while (p < e) + { + *p++ = short2ulaw(*data++); + } + if (write(au_fd, plabuf, n) != n) + perror(au_file); + else + au_size += n; + free(plabuf); + } + else + { + fprintf(stderr, "%s : No memory for ulaw data\n", program); + } + } + else + { + abort(); + } + } + } +} + +static void aufile_term(void); + +static void +aufile_term(void) +{ + /* Finish ulaw file */ + if (au_fd >= 0) + { + off_t here = lseek(au_fd, 0L, SEEK_CUR); + if (here >= 0) + { + /* can seek this file - truncate it */ + ftruncate(au_fd, here); + /* Now go back and overwite header with actual size */ + if (lseek(au_fd, 8L, SEEK_SET) == 8) + { + wblong(au_fd, au_size); + } + } + if (au_fd != 1) + close(au_fd); + au_fd = -1; + } + /* Finish linear file */ + if (linear_fd >= 0) + { + ftruncate(linear_fd, lseek(linear_fd, 0L, SEEK_CUR)); + if (linear_fd != 1) + close(linear_fd); + linear_fd = -1; + } +} + + +int +file_init(int argc, char **argv) +{ + argc = getargs("File output", argc, argv, + "l", "", &linear_file, "Raw 16-bit linear pathname", + "o", "", &au_file, "Sun/Next audio file name", + NULL); + if (help_only) + return argc; + + if (au_file) + { + if (strcmp(au_file, "-") == 0) + { + au_fd = 1; /* stdout */ + } + else + { + au_fd = open(au_file, O_WRONLY | O_CREAT | O_TRUNC, 0666); + if (au_fd < 0) + perror(au_file); + } + if (au_fd >= 0) + { + if (samp_rate > 8000) + au_encoding = SUN_LIN_16; + else + au_encoding = SUN_ULAW; + au_header(au_fd, au_encoding, samp_rate, SUN_UNSPEC, ""); + au_size = 0; + } + } + + if (linear_file) + { + if (strcmp(linear_file, "-") == 0) + { + linear_fd = 1 /* stdout */ ; + } + else + { + linear_fd = open(linear_file, O_WRONLY | O_CREAT | O_TRUNC, 0666); + if (linear_fd < 0) + perror(linear_file); + } + } + if (au_fd >= 0 || linear_fd >= 0) + { + file_write = aufile_write; + file_term = aufile_term; + } + return argc; +} + + diff --git a/stella/src/emucore/rsynth/aufile.h b/stella/src/emucore/rsynth/aufile.h new file mode 100644 index 000000000..b90983426 --- /dev/null +++ b/stella/src/emucore/rsynth/aufile.h @@ -0,0 +1,6 @@ +extern int file_init(int argc,char *argv[]); +typedef void (*file_write_p)(int n, short *data); +typedef void (*file_term_p)(void); + +extern file_write_p file_write; +extern file_term_p file_term; diff --git a/stella/src/emucore/rsynth/charset.c b/stella/src/emucore/rsynth/charset.c new file mode 100644 index 000000000..907b95aa6 --- /dev/null +++ b/stella/src/emucore/rsynth/charset.c @@ -0,0 +1,272 @@ +/* + Copyright (c) 1994,2001-2002 Nick Ing-Simmons. All rights reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA + +*/ +#include +#include +#include +#include "charset.h" + +void +init_locale(void) +{ + char *s = setlocale(LC_ALL, ""); + if (s) + { + s = setlocale(LC_CTYPE, NULL); + if (s && !strcmp(s, "C")) + { + s = setlocale(LC_CTYPE, "iso_8859_1"); + if (!s) + s = setlocale(LC_CTYPE, "C"); + } + } +} + +int +deaccent(int ch) +{ + /* Cast to char (type of litterals) as signedness may differ */ + switch ((char)ch) + { + case 'à': + case 'á': + case 'â': + case 'ã': + case 'ä': + case 'å': + return 'a'; + case 'ç': + return 'c'; + break; + case 'è': + case 'é': + case 'ê': + case 'ë': + return 'e'; + case 'ì': + case 'í': + case 'î': + case 'ï': + return 'i'; + case 'ñ': + return 'n'; + case 'ò': + case 'ó': + case 'ô': + case 'õ': + case 'ö': + return 'o'; + case 'ù': + case 'ú': + case 'û': + case 'ü': + return 'u'; + case 'ý': + case 'ÿ': + return 'y'; + case 'À': + case 'Á': + case 'Â': + case 'Ã': + case 'Ä': + case 'Å': + return 'A'; + case 'Ç': + return 'C'; + case 'È': + case 'É': + case 'Ê': + case 'Ë': + return 'E'; + case 'Ì': + case 'Í': + case 'Î': + case 'Ï': + return 'I'; + case 'Ñ': + return 'N'; + case 'Ò': + case 'Ó': + case 'Ô': + case 'Õ': + case 'Ö': + return 'O'; + case 'Ù': + case 'Ú': + case 'Û': + case 'Ü': + return 'U'; + case 'Ý': + return 'Y'; + } + if ((ch & 0xFF) > 0x7F) + abort(); + return ch; +} + +int +accent(int a, int c) +{ + if (a && c) + { + switch (a) + { + case '<': + case ',': + switch (c) + { + case 'c': + return 'ç'; + case 'C': + return 'Ç'; + default: + return c; + } + case '~': + switch (c) + { + case 'n': + return 'ñ'; + case 'a': + return 'ã'; + case 'o': + return 'õ'; + case 'N': + return 'Ñ'; + case 'A': + return 'Ã'; + case 'O': + return 'Õ'; + default: + return c; + } + case '\'': + switch (c) + { + case 'a': + return 'á'; + case 'e': + return 'é'; + case 'i': + return 'í'; + case 'o': + return 'ó'; + case 'u': + return 'ú'; + case 'y': + return 'ý'; + case 'A': + return 'Á'; + case 'E': + return 'É'; + case 'I': + return 'Í'; + case 'O': + return 'Ó'; + case 'U': + return 'Ú'; + case 'Y': + return 'Ý'; + default: + return c; + } + case '`': + switch (c) + { + case 'a': + return 'à'; + case 'e': + return 'è'; + case 'i': + return 'ì'; + case 'o': + return 'ò'; + case 'u': + return 'ù'; + case 'A': + return 'À'; + case 'E': + return 'È'; + case 'I': + return 'Ì'; + case 'O': + return 'Ò'; + case 'U': + return 'Ù'; + default: + return c; + } + case '^': + switch (c) + { + case 'a': + return 'â'; + case 'e': + return 'ê'; + case 'i': + return 'î'; + case 'o': + return 'ô'; + case 'u': + return 'û'; + case 'A': + return 'Â'; + case 'E': + return 'Ê'; + case 'I': + return 'Î'; + case 'O': + return 'Ô'; + case 'U': + return 'Û'; + default: + return c; + } + case '"': + switch (c) + { + case 'a': + return 'ä'; + case 'e': + return 'ë'; + case 'i': + return 'ï'; + case 'o': + return 'ö'; + case 'u': + return 'ü'; + case 'y': + return 'ÿ'; + case 'A': + return 'Ä'; + case 'E': + return 'Ë'; + case 'I': + return 'Ï'; + case 'O': + return 'Ö'; + case 'U': + return 'Ü'; + default: + return c; + } + } + } + return c; +} diff --git a/stella/src/emucore/rsynth/charset.h b/stella/src/emucore/rsynth/charset.h new file mode 100644 index 000000000..7194bb215 --- /dev/null +++ b/stella/src/emucore/rsynth/charset.h @@ -0,0 +1,18 @@ +#ifndef CHARSET_H +#define CHARSET_H +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef HAS_NL_LANGINFO +#include +#endif + +extern void init_locale(void); +extern int deaccent(int ch); +extern int accent(int a, int c); + +#ifdef __cplusplus +} +#endif +#endif /* CHARSET_H */ diff --git a/stella/src/emucore/rsynth/config.guess b/stella/src/emucore/rsynth/config.guess new file mode 100755 index 000000000..822947132 --- /dev/null +++ b/stella/src/emucore/rsynth/config.guess @@ -0,0 +1,1453 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + +timestamp='2004-11-12' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Per Bothner . +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit 0 ;; + amd64:OpenBSD:*:*) + echo x86_64-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + cats:OpenBSD:*:*) + echo arm-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + luna88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + macppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvmeppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mips64-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sun3:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit 0 ;; + macppc:MirBSD:*:*) + echo powerppc-unknown-mirbsd${UNAME_RELEASE} + exit 0 ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit 0 ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit 0 ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit 0 ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit 0 ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit 0;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit 0 ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit 0 ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit 0 ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit 0 ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit 0;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit 0 ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit 0 ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit 0 ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7 && exit 0 ;; + esac ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit 0 ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit 0 ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit 0 ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit 0 ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit 0 ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c \ + && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && exit 0 + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit 0 ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit 0 ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit 0 ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit 0 ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit 0 ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit 0 ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit 0 ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit 0 ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit 0 ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 + echo rs6000-ibm-aix3.2.5 + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit 0 ;; + *:AIX:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit 0 ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit 0 ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit 0 ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit 0 ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit 0 ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + # avoid double evaluation of $set_cc_for_build + test -n "$CC_FOR_BUILD" || eval $set_cc_for_build + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit 0 ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit 0 ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit 0 ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit 0 ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit 0 ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit 0 ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:FreeBSD:*:*) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit 0 ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit 0 ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit 0 ;; + x86:Interix*:[34]*) + echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' + exit 0 ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit 0 ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit 0 ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit 0 ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit 0 ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit 0 ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit 0 ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit 0 ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit 0 ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit 0 ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 + ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit 0 ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit 0 ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit 0 ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit 0 ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit 0 ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit 0 ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit 0 ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit 0 ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit 0 ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit 0 ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #ifdef __INTEL_COMPILER + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 + test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit 0 ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit 0 ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit 0 ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit 0 ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit 0 ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit 0 ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit 0 ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit 0 ;; + i*86:*:5:[78]*) + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit 0 ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit 0 ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit 0 ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit 0 ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit 0 ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit 0 ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit 0 ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit 0 ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4.3${OS_REL} && exit 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit 0 ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit 0 ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit 0 ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit 0 ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit 0 ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit 0 ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit 0 ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit 0 ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit 0 ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit 0 ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit 0 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + *86) UNAME_PROCESSOR=i686 ;; + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit 0 ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit 0 ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit 0 ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit 0 ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit 0 ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit 0 ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit 0 ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit 0 ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit 0 ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit 0 ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit 0 ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit 0 ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit 0 ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit 0 ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit 0 ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms && exit 0 ;; + I*) echo ia64-dec-vms && exit 0 ;; + V*) echo vax-dec-vms && exit 0 ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit 0 ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/stella/src/emucore/rsynth/config.h b/stella/src/emucore/rsynth/config.h new file mode 100644 index 000000000..6432f9543 --- /dev/null +++ b/stella/src/emucore/rsynth/config.h @@ -0,0 +1,170 @@ +/* config.h. Generated by configure. */ +/* config.h.in. Generated from configure.in by autoheader. */ + +/* Old ALSA API without pointers */ +/* #undef ALSA_PCM_OLD_HW_PARAMS_API */ + +/* Define to 1 if you have the header file. */ +#define HAVE_ALSA_ASOUNDLIB_H 1 + +/* Define to 1 if you have the