diff --git a/src/engine/instrument.cpp b/src/engine/instrument.cpp index 9f9482d9..06fce17d 100644 --- a/src/engine/instrument.cpp +++ b/src/engine/instrument.cpp @@ -1809,96 +1809,499 @@ void DivInstrument::readFeatureFM(SafeReader& reader) { void DivInstrument::readFeatureMA(SafeReader& reader) { READ_FEAT_BEGIN; + unsigned short macroHeaderLen=reader.readS(); + + DivInstrumentMacro& target=std.volMacro; + + while (reader.tell()>=6; + + target.delay=reader.readC(); + target.speed=reader.readC(); + + reader.seek(endOfMacroHeader,SEEK_SET); + + // read macro + switch (wordSize) { + case 0: + for (int i=0; i>4)&15; + c64.d=next&15; + + next=reader.readC(); + c64.s=(next>>4)&15; + c64.r=next&15; + + c64.duty=reader.readS()&4095; + + unsigned short cr=reader.readS(); + c64.cut=cr&2047; + c64.res=cr>>12; + READ_FEAT_END; } void DivInstrument::readFeatureGB(SafeReader& reader) { READ_FEAT_BEGIN; + unsigned char next=reader.readC(); + gb.envLen=(next>>5)&7; + gb.envDir=(next&16)?1:0; + gb.envVol=next&15; + + gb.soundLen=reader.readC(); + + next=reader.readC(); + gb.alwaysInit=next&2; + gb.softEnv=next&1; + + gb.hwSeqLen=reader.readC(); + for (int i=0; i>=6; + + target.delay=reader.readC(); + target.speed=reader.readC(); + + reader.seek(endOfMacroHeader,SEEK_SET); + + // read macro + switch (wordSize) { + case 0: + for (int i=0; i>4)&7; + snes.a=next&15; + + next=reader.readC(); + snes.s=(next>>5)&7; + snes.r=next&31; + + next=reader.readC(); + snes.useEnv=next&16; + snes.sus=next&8; + snes.gainMode=(DivInstrumentSNES::GainMode)(next&7); + + if (snes.gainMode==1 || snes.gainMode==2 || snes.gainMode==3) snes.gainMode=DivInstrumentSNES::GAIN_MODE_DIRECT; + + snes.gain=reader.readC(); + + READ_FEAT_END; } void DivInstrument::readFeatureN1(SafeReader& reader) { READ_FEAT_BEGIN; + n163.wave=reader.readI(); + n163.wavePos=(unsigned char)reader.readC(); + n163.waveLen=(unsigned char)reader.readC(); + n163.waveMode=(unsigned char)reader.readC(); + READ_FEAT_END; } void DivInstrument::readFeatureFD(SafeReader& reader) { READ_FEAT_BEGIN; + fds.modSpeed=reader.readI(); + fds.modDepth=reader.readI(); + fds.initModTableWithFirstWave=reader.readC(); + reader.read(fds.modTable,32); + READ_FEAT_END; } void DivInstrument::readFeatureWS(SafeReader& reader) { READ_FEAT_BEGIN; + ws.wave1=reader.readI(); + ws.wave2=reader.readI(); + ws.rateDivider=reader.readC(); + ws.effect=reader.readC(); + ws.enabled=reader.readC(); + ws.global=reader.readC(); + ws.speed=reader.readC(); + ws.param1=reader.readC(); + ws.param2=reader.readC(); + ws.param3=reader.readC(); + ws.param4=reader.readC(); + READ_FEAT_END; } void DivInstrument::readFeatureSL(SafeReader& reader, const DivSong* song) { READ_FEAT_BEGIN; + unsigned int samplePtr[256]; + unsigned char sampleIndex[256]; + memset(samplePtr,0,256*sizeof(unsigned int)); + memset(sampleIndex,0,256); + + unsigned char sampleCount=reader.readC(); + + for (int i=0; i