Sappy2006:OMFGHELP!
OMFGHELP!WhenItrytoplayacertainsong,Igetagenericerrormessage.What'supwiththat?
TheEOTcommandisnotfullysupported.Asinglenoteworksfine,butfullchordsfail.Theactualerrorthat'ssupposedtoappearis"SubscriptoutofRange",whichdoesn'thelpmucheither.
I'mafraidthere'slittletobedoneherebuttoavoidplayingthesesongs.
Developers,ifyouhaveasongwithpassageslikethis:
.byteEOT,As2
.byteCs3
.byteFn3
...thatwouldn'twork.TIEsstartfine,butEOTsspanningmorethanonenotebreakthings.
Lacking.Sfiles,Pokémon's"CavesandDarkness"songisabitdifficulttofixbutyoucouldlook,inthesongdata,for0xCEand0xCFwhichareEOTandTIErespectively.
MySappy-enabledhomebrewdoesn'tworkinSappy.Theheaderpointersareallwrong!
SinceClassicVBonlysupportssignedLongs/DWords,certainpointerrangestranslatetoanegativedecimalnumber.IhadthisproblemmyselfwhileworkingontheDemoJukebox.IfixedthisbymovingallSOUND_FILEStothestartoftheromuntilthepointerwasinacorrectlyinterpretedrange:
$(TARGET_ELF):$(SOUND_FILES)$(.OFILES)Makefile$(DEPENDFILE)
@echo>$(MAPFILE)
$(CC)-g-o$@$(SOUND_FILES)$(.OFILES)-Wl,$(LDFLAGS)
Thisiscausedbysmallprogramsandthemusicdatabeingputattheendoftherombydefault.
WhenusingtheMIDIdriver,theinstrumentsareallwrong!That'sbecausethegamesdon'tneedtoadheretotheGeneralMIDIstandard.Anygiveninstrumentor"patch"asit'softencalledcanhaveanysound.It'suptothesoundandmusicartistsofthegamein
questionhowmuchthegamepatchesmatchuptotheGeneralMIDIstandard.Youcanremapthepatcheswiththe<midimap>XMLtag.PleaserefertotheSappy.XMLdocumentationfordetails.
Ihavethosemediakeysonmykeyboard,butsomedon'tworkinSappylike"Eject"!
Asofversion1.1,SappyonlylistenstoPlay/Pause(whichdoesn'tpause),Stop,Next,Previous,VolumeUpandVolumeDown.It'signoringofEjectisquitenatural.Eachkeymustbecodedinseperately.
I'mrunningonaJapanesesystem,andthetextisallgarbled!It'snoteasytogetJapanesetextrenderedproperly.We'restillfiguringthisout.Inthemeantime,youcangetanon-localizedversionwhereyougotthis.
BuiltonWednesday,April12th,2006
Sappy2006:What'sNew
What'sNewFrom1.1to1.2
Super-fastsampleloading-askfordetailsifyoudare!
Anti-earbleedingsystemtodisableunneededbutear-piercingsoundslikesomeinFinalFantasy4.
MIDIsupportlikeintheoldSappy.
MIDImappingeditor.
MIDIexport,thankstoDragforfixingit.
AbilitytochoosewhichMIDIOUTdevicetouse.
Variousbugfixes.
From1.0to1.1
Idiot-proofexporters.You'llbenotifiedwhenyoumisread"filepattern"for"filename"or"pathname".
Non-braindeadassembler.Itnolongerfailsonpointers.
Volumecontrolslider.Respondstokeyboard(ifithasfocus)andmousewheel.
WM_APPCOMMANDsupport.Ifyouhavededicatedmediacontrolbuttonsonyourkeyboard,Sappywilllistentothem.
Soundloadingonbytearraysinsteadofcharacterstrings,asurgedbyBouché.
Feedbackwhileloadingasongtoplay.
RudimentarySappyClassic-styleMIDIsupportwithequallyrudimentaryGameBoyClassicmodeandinstrumentremap.
Wishlist
SupportformoreMIDIcontrols.
Tempofixforexports.
GameBoyClassicmodeforthenewdriver.
Fullsoundloadingfix.Asof1.1,onlyPCMwavesareproperlyloaded.Tonegeneratorsarestillloadedinstrings.
BuiltonFriday,December22nd,2006
Sappy2006:XMLdefinition
XMLdefinitionRootelementSAPPY→oneormoreROMelements.ElementROM→oneormorePLAYLISTelements,oneoptionalBLEEDINGEARSelement,oneoptionalMIDIMAPelement.
AttributeCODE,required.AttributeNAME,required.AttributeSONGTABLE,pointer,required.AttributeSCREENSHOT,file.AttributeCREATOR.AttributeTAGGER.ElementPLAYLIST→oneormoreSONGelements.AttributeNAME,required.AttributeSTEAL,anotherCODE.ElementSONG→thesong'sname.AttributeTRACK,required.
ElementBLEEDINGEARS→oneormoreINSTelements.
ElementINST.AttributeID,MIDIpatchnumber,or...AttributesFROMandTO,rangeofMIDIpatchnumbers.
ElementMIDIMAP→oneormoreINSTelements,oneormoreDRUMelements.
ElementINST.AttributeFROM,MIDIpatchnumber,required.AttributeTO,MIDIpatchnumber,required.AttributeTRANSPOSE.AttributeSECOND.Notusedinthisversion.AttributeTHIRD.Notusedinthisversion.
ElementDRUM.AttributeFROM,note,required.AttributeTO,note,required.AttributeKIT.Notusedinthisversion.
BuiltonWednesday,July26th,2006
Sappy2006:HackerStuff
MID2AGBandtheBuilt-InAssemblerIfyouhavetheMID2AGBconverter,youcanuseittoconvertmostMIDIfilestotheSappyengine'snativeformat.Butthisisonlyhalftheprocedure.Theresulting.Sfilesmustbeconvertedtobinarycode.Thiscanbedonewithmoststandards-compliantassemblers,suchastheoneusedinGCC.
Unfortunately,whenusinganassemblerthepointersarealloffandtheVoiceGroupisundefined.Weusedtohand-editthe.SfilesinNotePadorwhateverandaddtheintendedlocationinROMtoallreferencedpointers.
Sappy2006packsabuilt-inassembler-liketoolthat'scustom-builtforthespecificpurposeofconvertingSappy.Sfiles.Itdoesn'tgenerateasinglebyteofcode,onlysongdata.Butitdoesautomaticallyfixthepointers,andevenrecognizestheheaderbyteswhenitseesthemsothenewsongheadercanautomaticallybelinkedintotheSongTable!
Usage
First,youmustcopyorrenamethefilemusicplaydef.stomplaydef.s.Forsomereason,Nintendogaveitanothernamethanisreferencedinthesongfiles,andcopiesto\srcwiththepropername.Makesurethatmplaydef.sisinthesamefolderasyoursongfiles.
Afterconvertingyoursong,pickingavoicegroupoffsetfromanothersonganddeterminingwhereintheROMyouwanttoputthenewone,opentheassemblerandfillinallthreefields.Therestshouldbeprettymuchautomatic.
TheassemblerworksonlybecauseSappysongfileshavecertaincharacteristics:
Noforwardjumps,onlybackwards.
Wordsareusedexclusivelyinjumpsandtheheader.
Theonly.globalisalsothesongnameandthereforeheaderlabel.
BuiltonTuesday,November8th,2005
Sappy2006:HackerStuff
SongTransplantsAnygamethatusestheM4Aenginetoplaybackitsmusicandsoundscanbeusedinasongtransplantation.Thisusedtobeaverybigtask,findingasong'sheaderandhand-dumpingeachtrack.Then,you'dhavetogothrougheachtrackandediteverysinglepointer.Oneslip-upandthesongwouldn'twork.
Nowallyouhavetodobetweenexportingandimportingthetracksistoeditthetracks'VOICEcommands(mosttrackshavingonlyoneofthose),andpickinganicevoicegroupthatmoreorlesssuitsyourneeds.
Thefollowingthingsmustbedoneforapropersongtransplant:
Exporttracks
Editvoicecommands
Importtracks
BuiltonFriday,November4th,2005
Sappy2006:HackerStuff
ExportTracksTheExportTracksdialoghasalistoftrackpointersandapattern-sensitivefilenametextbox.
Ifyouenter,forexample."RCRIntrotrack$T.bin",you'llgettrackfilescalled"RCRIntrotrack0.bin","RCRIntrotrack1.bin"etcetera.Anypointersfoundthereinwillbeautomaticallyrecalculated.Entering"$P"addsthetracks'pointerstotheirfilenames.
BuiltonMonday,November28th,2005
Sappy2006:HackerStuff
EditvoicecommandsBecauseinstrumentshardlyevermatchupbetweengames,transplantedsongsmustbeeditedtousethetargetgame'sinstruments.Therearetwostepstodothis:
Figureoutwhichinstrumentstouse.
Edittrackdata.
Todostep1,openthetargetgameandfindasongthathastherequiredinstruments,orsomethingclose.ThenpressExtractSamplesandmakesureyouusethe$Ifilenamepattern.Identifytheinstrumentsyouwantandwritethemdownsomewhere.Thisisonlyoneofseveralmethods.
Todostep2,openeachtrackfileinahexeditorandfindtheBDbytes.Theycanoftenbefoundnearthebeginningofeachfile.Thebytethatfollowsitisthetrack'sinstrument.Replacethesevalueswiththeonesyouwrotedowninstep1.
BuiltonFriday,November4th,2005
Sappy2006:HackerStuff
ImportTracksTheImportTracksdialogisalittlemorecomplexthantheExportdialog.Selectthetrackfilesyouwanttoimportinthelistbox,andenterthreepointervalues.Defaultsareprovided,thesearethecurrentlyselectedsong'spointers.
Tracksarehandledintheordertheyappearinthelistbox.Toimportalater-appearingfilebeforeanearlier-appearingfile,renametheminExplorertochangetheirsortingorder.In-trackpointersarerecalculatedwhenneeded.
Whenimportingisdone,SappywillaskforconfirmationtoautomaticallychangetheMasterSongTabletoreflectyourchanges.
BuiltonFriday,November28th,2005
Sappy2006:HackerStuff
Dataformats
Samples
Type Name Descriptionu16 type Notusedu16 stat 0x0000foroneshot,0x4000forforwardloopu32 freq "Normal"frequency<<10u32 loop Loopstartpositioninsamplesu32 size Totalnumberofsamples
s8 data[] Size+1samplesintotal.Lastbyteiszeroforone-shots,sameaslooppointerforloopedsamples.
Musicheaders
Type Name Descriptionu8 NumTrks Numberoftracksinthesongu8 NumBlks Numberofblocks(?)u8 Priorityu8 Reverbu32 Voicegroup Pointertoinstrumentbanku32... Track Pointerstotracks
BuiltonMonday,March7th,2006
Sappy2006:HackerStuff
MIDIReferenceNotethatnosingleGBAgamehastoconformtothisstandard.
DrumKeys
Nuffsaid.
PatchAssignments
Piano ChromaticPercussion Organ0Acousticgrandpiano 8Celesta 16Hammondorgan1Brightacousticpiano 9Glockenspiel 17Percussiveorgan2Electricgrandpiano 10Musicbox 18Rockorgan3Honky-tonkpiano 11Vibraphone 19Churchorgan4Rhodespiano 12Marimba 20Reedorgan5Chorusedpiano 13Xylophone 21Accordion6Harpsichord 14Tubularbells 22Harmonica7Clavinet 15Dulcimer 23Tangoaccordion
Guitar Bass Strings24Acousticguitar(nylon) 32Acousticbass 40Violin25Acousticguitar(steel) 33Electricbass(finger) 41Viola26Electricguitar(jazz) 34Electricbass(pick) 42Cello27Electricguitar(clean) 35Fretlessbass 43Contrabass28Electricguitar(muted) 36Slapbass1 44Tremolostrings29Overdrivenguitar 37Slapbass2 45Pizzicatostrings30Distortionguitar 38Synthbass1 46Orchestralharp31Guitarharmonics 39Synthbass2 47Timpani
Ensemble Brass Reed48Stringensemble1 56Trumpet 64Sopranosax49Stringensemble2 57Trombone 65Altosax50Synth.strings1 58Tuba 66Tenorsax51Synth.strings2 59Mutedtrumpet 67Baritonesax52ChoirAahs 60Frenchhorn 68Oboe53VoiceOohs 61Brasssection 69Englishhorn54Synthvoice 62Synth.brass1 70Bassoon55Orchestrahit 63Synth.brass2 71Clarinet
Pipe SynthLead SynthPad72Piccolo 80Lead1(square) 88Pad1(newage)73Flute 81Lead2(sawtooth) 89Pad2(warm)
74Recorder 82Lead3(calliopelead) 90Pad3(polysynth)75Panflute 83Lead4(chifflead) 91Pad4(choir)76Bottleblow 84Lead5(charang) 92Pad5(bowed)77Shakuhachi 85Lead6(voice) 93Pad6(metallic)78Whistle 86Lead7(fifths) 94Pad7(halo)79Ocarina 87Lead8(brass+lead) 95Pad8(sweep)
SoundEffects120Guitarfretnoise121Breathnoise122Seashore123Birdtweet124Telephonering125Helicopter126Applause
BuiltonWednesday,April12th,2006
Sappy2006:Jukebox
JukeboxDemoRomTheJukeboxDemoRomiswrittenbyKyoufuKawa,basedoncodefromCatnipDreams.EventhoughitdemonstratessimplepaletterotationandlesssimpleVariableWidthFonts,it'smainfocusistoplaysongsusingtheM4Aengine.
ControlsLeft/Right-Selectsong.Yourselectionwrapsaroundifneeded.Abutton-Playthecurrentlyselectedsong.Bbutton-Stopplaying.Shoulderbuttons-Playsoundeffects.
MiscellaneousinformationTherom'sinternalnameandgamecodeisKAWAJUKE2K6-KWJ6.IthasaMakerCodeof0xFF.ItwasmadewiththeofficialNintendo-brandGBAdevelopmentkit.IthastheuniquequalityofhavingallthesongdataatthestartoftheROM.
BuiltonThursday,September28th,2006
Sappy2006:Jukebox
JukeboxSongCreditsListedintrackorder.Instrumentationhasbeenalteredandsometrackshavebeencompletelyremoved.
TestsongHand-codedbyKyoufuKawa
Keitaro'sTheme-"Memories"From"CatnipDreams",2005TheHelmetedRodent.ComposedbyMajinBluedragon.Thegamewasneverreleased,andsongsmayreturninlatergamesfromthesameauthors.
MonkeyIsland2ThemeSongFrom"MonkeyIsland2",LucasArts.RecordedfromDOSBox.
GRNFINALFrom"TheIncredibleToonMachine",Sierra.GameusedMIDIfiles.
CanonByPachelbel.FoundbyGoogle.
GrabbagFrom"DukeNukem3D",3DRealms.GameusesMIDIfiles.
AtDoom'sGate,KitchenAceandISawedtheDemonsFrom"Doom",iDsoftware.DownloadedfromDoomWorld.
EyecatcherFrom"AzumangaDaioh-TheAnime".
TIM1From"Lemmings",Psychnosis.
???From"NinjaGaiden".
Kawa'sComin'
OriginalbyDJBouché,extendedversionbyBaro.
ZeroWingMedleyFrom"ZeroWing",Toaplan.SequencedandarrangedbyMarsJenkar.DownloadedfromVGMusic.
Hu-HaDschinghisKahnByDschinghisKahn.DownloadedfromsomeRussiansite.
500Miles(I'mGonnaBe)ByTheProclaimers.Downloadedfromakaraokesite.
PalletTownPortedfromPokémon.
ThexderthemeSequencedbyJanvanValburg.DownloadedfromVGMusic.
BuiltonFriday,December22nd,2006
Sappy2006:Registrykeys
RegistrykeysAutoAdvance
Doesn'tdoanything.
BarXstateCollapsed/ExpandedstateoftheExplorerBarbars.
DriverWhichdrivertouse.
ForceNiceBarUsesystemstyleorfakeitout.Non-XPsystemsarefakedbydefault.
FMODVolumeVolumeatwhichtoplaythemusicwhenusingtheFMODdriver.
HideBarHidetheExplorerBarcompletely.MakestheplayerlooklikeBouché'soriginal.Taskscanbeselectedfromthemenu,butROMinformationisunavailable.
IncessantSoundOverrideDon'tplayanyIncessantSoundsiftrue.
LastROMFullfilenameofthelastROMyouopened.
MIDIDeviceIndexoftheMIDIOUTdevicetouse.
MIDIinGBModeReplacesallinstrumentswithsquareandsaw-wavesifset.
mIRCNowPlayingWriteNowPlayinginformationtosappy.stt.Usesappy.mrctoshowthisduringIRCsessions.
MSNNowPlayingSendNowPlayinginformationtoMSNMessenger.
NiceMenusWhenenabled,useOffice2003stylewhitemenus.Whendisabled,
useolderstylegraymenus.
ReloadROMReloadthefilespecifiedin"LastROM"whenstartingup.
SeekbyPlaylistWhenenabled,thePrevious/Nextbuttonsgobyplaylistentriesinsteadofrawsongnumbers.
SettingsPageTheindexofthecurrentpageontheSettingswindow.Quickre-entry.
SkinSkin#touse.
SkinHue/SaturationColorizingvaluesfortheskin
SongRepeatsDeterminesthenumberoftimestorepeatplayback.
WindowHeightHeightofthemainwindowintwips.
WindowFont(Size)Allowsyoutochangethefontusedinthewindows.Defaultsto"LucidaSansUnicode",8points.
XMLFileXMLfiletouse.
BuiltonThursday,September28th,2006
Sappy2006:Trackbytecode
TrackbytecodeWxx(0x80++)
Waitforthespecifiednumberofclockticks
FINE(0xB1)Musicalterm.Endsthetrack.
GOTO,label(0xB2)Unconditionaljump.
PATT,label(0xB3)Unconditionaljump,butrememberswheretoreturn.Canbenesteduptothreetimes.
PEND(0xB4)Endsapatternandreturnstoit'scallsource.Ignoredifnotcalledfromsomewhere.
REPT,xx,label(0xB5)Jumpstothespecifiedlabelxxtimes.Ifxxiszero,itrepeatsadinfinitumlikeaGOTO.REPTcommandscannotbenested,andcannotbespecifiedinaMIDIsequencer.
PRIO,xx(0xBA)Setsthepriorityofthetrack.xxisfrom0to255whendirectlyeditingthe.sfile,0to127inaMIDIsequencer.
TEMPO,xx/2(0xBB)Thissetsthetempooftheentiresong.xxisfrom22to510.
KEYSH,xx(0xBC)Thismodulatesthekeyofthetrack.xxisfrom-128to127.ThiscommandcannotbespecifiedinaMIDIsequencer.
Thefollowingcommandsarein"RunningStatus"mode.Thisallowsoperationfromtheirparametersalone,whichisgoodwhenawholelotareseeninsequence,likeapitchbendorvolumeslide.
VOICE,xx(0xBD)Selectsapatchforthistrack.xxisfrom0to127.
VOL,xx(0xBC)
Setsthetrackvolume.xxisfrom0to127.
PAN,xx(0xBF)Setsthetrack'sstereopanposition.xxisfrom-64to63,butifit'saCGBinstrument,hardwarerestrictionslimityoutojust"left","center"and"right".
BEND,cV+xx(0xC0)
BENDR,xx(0xC1)
LFOS,xx(0xC2)
LFODL,xx(0xC3)
MOD,xx(0xC4)
MODT,xx(0xC5)
TUNE,cV+xx(0xC8)
Thesearenotecommands.TheycanbeusedseamlesslywithRunningStatuscommandsbecauseoftheirbytecodes.
Nxx[,key[,vel]](0xD0++)Playsanote.xxisthenotelengthfrom00to96.24isaquarternote,96awhole.Keyisinthe"Cn3"formatwherethefirstcharacteristhenameofthenote("CDEFGAB"),thesecondeither"n"foranaturalor"s"forasharpandthethirdtheoctave.Therearealso"minusoctaves",writtenlike"CnM2"andstuff.OctaveseffectivelyrangefromM2to8.FromCnM2toGn8coversall127MIDIkeynumbers.Velocityrangesfrom0to127,butunlikeinMIDI,velocity0isnotsynonimousto"noteoff".
EOT[,key](0xCE)StopsthematchingTIEnote.
TIE[,key,[,vel]](0xCF)Thisnote,whichworksjustlikeNxx,continuestosounduntilthenextmatchingEOTcommand.
BuiltonFriday,November4th,2005