Ejemplo n.º 1
0
        public List <InstrumentBase> CreateInstrumentList(RiffChunkListPdta pdtaList, RiffChunkListSdta[] sdtaBodyList, Dictionary <string, Instrument> instrumentDictionary, string aName)
        {
            List <InstrumentBase> lInstrumentList = new List <InstrumentBase>();

            RiffChunkInst instChunk = pdtaList.instBody;
            RiffChunkIbag ibagChunk = pdtaList.ibagBody;

            for (int i = 0; i < instChunk.instDataArray.Length; i++)
            {
                IbagData ibagData0 = ibagChunk.dataArray[instChunk.instDataArray[i].bagNdx];

                IbagData ibagData1 = null;

                if (i < instChunk.instDataArray.Length - 1)
                {
                    ibagData1 = ibagChunk.dataArray[instChunk.instDataArray[i + 1].bagNdx];
                }

                lInstrumentList.Add(new InstrumentSfbk(pdtaList, sdtaBodyList, instChunk.instDataArray[i], ibagData0, ibagData1, aName));
            }

            return(lInstrumentList);
        }
Ejemplo n.º 2
0
        public InstrumentSfbk(RiffChunkListPdta pdtaList, RiffChunkListSdta[] sdtaBodyList, InstData instData, IbagData ibagData0, IbagData ibagData1, string aName)
            : base()
        {
            RiffInfoIbag ibagChunk = pdtaList.ibagBody;
            RiffInfoIgen igenChunk = pdtaList.igenBody;
            RiffInfoImod imodChunk = pdtaList.imodBody;

            ShdrData[] shdrDataArray = pdtaList.shdrBody.shdrDataArray;

            byte lokey                  = 0xFF;
            byte hikey                  = 0xFF;
            byte rootkey                = 0;
            int  fineTune               = 0;
            bool loopMode               = false;
            int  startAddrsOffset       = 0;
            int  endAddrsOffset         = 0;
            int  startLoopAddrsOffset   = 0;
            int  endLoopAddrsOffset     = 0;
            int  startAddrsCoarseOffset = 0;
            int  modEnvToPitch          = 0;

            int gens = igenChunk.igenDataArray.Length - ibagData0.genNdx;
            int mods = imodChunk.imodDataArray.Length - ibagData0.modNdx;

            if (ibagData1 != null)
            {
                gens = ibagData1.genNdx - ibagData0.genNdx;
                mods = ibagData1.modNdx - ibagData0.modNdx;
            }

            for (int j = 0; j < gens; j++)
            {
                IgenData  igenData  = igenChunk.igenDataArray[ibagData0.genNdx + j];
                Generator generator = igenData.amount;

                switch (igenData.genOper)
                {
                case SFGenerator.StartAddrsOffset:
                    startAddrsOffset = generator.GetInt16();
                    Logger.Normal(instData.name + "/Start Addrs Offset:" + startAddrsOffset);
                    break;

                case SFGenerator.EndAddrsOffset:
                    endAddrsOffset = generator.GetInt16();
                    Logger.Normal(instData.name + "/End Addrs Offset:" + endAddrsOffset);
                    break;

                case SFGenerator.StartLoopAddrsOffset:
                    startLoopAddrsOffset = generator.GetInt16();
                    Logger.Normal(instData.name + "/Start Loop Addrs Offset:" + startLoopAddrsOffset);
                    break;

                case SFGenerator.EndLoopAddrsOffset:
                    endLoopAddrsOffset = generator.GetInt16();
                    Logger.Normal(instData.name + "/End Loop Addrs Offset:" + endLoopAddrsOffset);
                    break;

                case SFGenerator.StartAddrsCoarseOffset:
                    startAddrsCoarseOffset = generator.GetInt16();
                    Logger.Normal("Start Addrs Coarse Offset:" + startAddrsCoarseOffset);
                    break;

                case SFGenerator.ModLfoToPitch:
                    //startAddrsCoarseOffset = generator.GetUInt16();
                    //Log( "Start Addrs Coarse Offset:" + startAddrsCoarseOffset );
                    break;

                case SFGenerator.VibLfoToPitch:
                    //startAddrsCoarseOffset = generator.GetUInt16();
                    //Log( "Start Addrs Coarse Offset:" + startAddrsCoarseOffset );
                    break;

                case SFGenerator.ModEnvToPitch:
                    modEnvToPitch = generator.GetInt16();
                    Logger.Normal(instData.name + "/Mod Env To Pitch:" + modEnvToPitch);
                    break;

                case SFGenerator.DelayModEnv:
                    //modEnvToPitch = generator.GetInt16();
                    Logger.Normal("Delay Mod Env:" + generator.GetInt16());
                    break;

                case SFGenerator.AttackModEnv:
                    //modEnvToPitch = generator.GetInt16();
                    Logger.Normal("Attack Mod Env:" + generator.GetInt16());
                    break;

                case SFGenerator.HoldModEnv:
                    //modEnvToPitch = generator.GetInt16();
                    Logger.Normal("Hold Mod Env:" + generator.GetInt16());
                    break;

                case SFGenerator.DecayModEnv:
                    //modEnvToPitch = generator.GetInt16();
                    Logger.Normal("Decay Mod Env:" + generator.GetInt16());
                    break;

                case SFGenerator.SustainModEnv:
                    //modEnvToPitch = generator.GetInt16();
                    Logger.Normal("Sustain Mod Env:" + generator.GetInt16());
                    break;

                case SFGenerator.ReleaseModEnv:
                    //modEnvToPitch = generator.GetInt16();
                    Logger.Normal("Release Mod Env:" + generator.GetInt16());
                    break;

                case SFGenerator.DelayVolEnv:
                    //VolEnvToPitch = generator.GetInt16();
                    Logger.Normal("Delay Vol Env:" + generator.GetInt16());
                    break;

                case SFGenerator.AttackVolEnv:
                    //VolEnvToPitch = generator.GetInt16();
                    Logger.Normal("Attack Vol Env:" + generator.GetInt16());
                    break;

                case SFGenerator.HoldVolEnv:
                    //VolEnvToPitch = generator.GetInt16();
                    Logger.Normal("Hold Vol Env:" + generator.GetInt16());
                    break;

                case SFGenerator.DecayVolEnv:
                    //VolEnvToPitch = generator.GetInt16();
                    Logger.Normal("Decay Vol Env:" + generator.GetInt16());
                    break;

                case SFGenerator.SustainVolEnv:
                    //VolEnvToPitch = generator.GetInt16();
                    Logger.Normal("Sustain Vol Env:" + generator.GetInt16());
                    break;

                case SFGenerator.ReleaseVolEnv:
                    //VolEnvToPitch = generator.GetInt16();
                    Logger.Normal("Release Vol Env:" + generator.GetInt16());
                    break;

                case SFGenerator.KeyRange:
                    RangesType keyRange = generator.GetRangesType();
                    lokey = keyRange.lo;
                    hikey = keyRange.hi;

                    Logger.Normal("Key Range:" + lokey + "," + hikey);

                    break;

                case SFGenerator.SampleId:
                    UInt16 sampleId = generator.GetUInt16();

                    AddSoundfont(new SoundfontSfbk(sdtaBodyList, shdrDataArray[sampleId], lokey, hikey, rootkey, fineTune, loopMode, startAddrsOffset, endAddrsOffset, startLoopAddrsOffset, endLoopAddrsOffset, modEnvToPitch, new Instrument(), aName));

                    Logger.Normal(instData.name + "Sample Id:" + sampleId);

                    lokey                  = 0xFF;
                    hikey                  = 0xFF;
                    rootkey                = 0;
                    fineTune               = 0;
                    loopMode               = false;
                    modEnvToPitch          = 0;
                    startAddrsOffset       = 0;
                    endAddrsOffset         = 0;
                    startLoopAddrsOffset   = 0;
                    endLoopAddrsOffset     = 0;
                    startAddrsCoarseOffset = 0;

                    break;

                case SFGenerator.FineTune:
                    fineTune = generator.GetInt16();

                    Logger.Normal("Fine Tune:" + fineTune);

                    break;

                case SFGenerator.SampleModes:
                    if (generator.GetUInt16() == 0)
                    {
                        loopMode = false;
                    }
                    else if (generator.GetUInt16() == 1)
                    {
                        loopMode = true;
                    }
                    else
                    {
                        loopMode = false;
                    }

                    Logger.Normal("Sample Modes:" + loopMode);

                    break;

                case SFGenerator.Instrument:
                    Console.WriteLine("Error");
                    break;

                case SFGenerator.OverridingRootKey:
                    rootkey = ( byte )generator.GetUInt16();

                    Logger.Normal("Root key:" + rootkey);

                    break;

                case SFGenerator.VelRange:
                    RangesType VelRange = generator.GetRangesType();

                    Logger.Normal("    Vel Range:" + VelRange.lo + "," + VelRange.hi);
                    break;

                default:
                    Logger.Warning("    " + igenData.genOper + ":" + generator.GetUInt16());

                    break;
                }
            }

            for (int j = 0; j < mods; j++)
            {
                ImodData imodData = imodChunk.imodDataArray[ibagData0.modNdx + j];
            }
        }