Пример #1
0
 public override void InitPart(partWork pw)
 {
     foreach (partPage page in pw.pg)
     {
         page.beforeVolume        = -1;// (page.Type == enmChannelType.FMOPL) ? 15 : -1;
         page.volume              = 0;
         page.MaxVolume           = 15;
         page.beforeEnvInstrument = 0;
         page.envInstrument       = 0;
         page.port  = port;
         page.mixer = 0;
         page.noise = 0;
     }
 }
Пример #2
0
 public override void InitPart(partWork pw)
 {
     foreach (partPage pg in pw.pg)
     {
         pg.FNum                = 0;
         pg.beforeFNum          = -1;
         pg.MaxVolume           = 15;
         pg.volume              = pg.MaxVolume;
         pg.beforeLVolume       = -1;
         pg.beforeEnvInstrument = -1;
         pg.keyOn               = false;
         pg.port                = port;
     }
 }
Пример #3
0
        public override void CmdVolumeDown(partWork pw, MML mml)
        {
            int n = (int)mml.args[0];

            n             = pw.volumeEasy - n;
            n             = Common.CheckRange(n, 0, pw.MaxVolumeEasy);
            pw.volumeEasy = n;
            if (pw.Type == enmChannelType.FMOPL || pw.Type == enmChannelType.RHYTHM)
            {
                n         = FMVDAT[n + 4];
                pw.volume = Common.CheckRange(n, 0, pw.MaxVolume);
                SetFmVolume(pw);
            }
        }
Пример #4
0
        public override void CmdVolume(partWork pw, MML mml)
        {
            int n;

            n               = (mml.args != null && mml.args.Count > 0) ? (int)mml.args[0] : pw.latestVolume;
            pw.volumeEasy   = n;
            pw.latestVolume = n;
            if (pw.Type == enmChannelType.FMOPL || pw.Type == enmChannelType.RHYTHM)
            {
                n         = FMVDAT[n + 4];
                pw.volume = Common.CheckRange(n, 0, pw.MaxVolume);
                SetFmVolume(pw);
            }
        }
Пример #5
0
 public void SetHuC6280Envelope(MML mml, partWork pw, int volume)
 {
     if (pw.huc6280Envelope != volume)
     {
         SetHuC6280CurrentChannel(mml, pw);
         if (!pw.keyOn)
         {
             volume = 0;
         }
         byte data = (byte)((volume != 0 ? 0x80 : 0) + (volume & 0x1f));
         OutHuC6280Port(mml, port[0], 4, data);
         pw.huc6280Envelope = volume;
     }
 }
Пример #6
0
 public override void InitPart(partWork pw)
 {
     foreach (partPage page in pw.pg)
     {
         page.slots       = 0xf;
         page.volume      = 127;
         page.MaxVolume   = 127;
         page.port        = port;
         page.mixer       = 0;
         page.noise       = 0;
         page.beforeMixer = -1;
         page.beforeNoise = -1;
     }
 }
Пример #7
0
        public override void InitPart(partWork pw)
        {
            pw.slots     = (byte)((pw.Type == enmChannelType.FMOPN || pw.ch == 2) ? 0xf : 0x0);
            pw.volume    = 127;
            pw.MaxVolume = 127;
            if (pw.Type == enmChannelType.SSG)
            {
                //pw.volume = 32767;
                pw.MaxVolume = 15;
                pw.volume    = pw.MaxVolume;
            }

            pw.port = port;
        }
Пример #8
0
        public override void SetupPageData(partWork pw, partPage page)
        {
            page.keyOff         = true;
            page.spg.instrument = -1;

            page.spg.beforeEnvInstrument = -1;

            //周波数
            page.spg.beforeFNum = -1;

            //音量
            page.spg.beforeVolume = -1;
            SetVolume(page, null);
        }
Пример #9
0
        public void OutPsgKeyOn(partWork pw, MML mml)
        {
            pw.keyOn = true;
            SetFNum(pw, mml);
            SetVolume(pw, mml);

            MML vmml = new MML();

            vmml.type = enmMMLType.Volume;
            vmml.args = new List <object>();
            vmml.args.Add(pw.volume);
            vmml.line = mml.line;
            SetDummyData(pw, vmml);
        }
Пример #10
0
        public override void SetupPageData(partWork pw, partPage page)
        {
            OutC140KeyOff(null, page);
            page.spg.instrument = -1;

            //周波数
            page.spg.freq = -1;
            SetFNum(page, null);

            //音量(パン兼用)
            page.spg.beforeLVolume = -1;
            page.spg.beforeRVolume = -1;
            SetVolume(page, null);
        }
Пример #11
0
        public override void CmdVelocity(partWork pw, MML mml)
        {
            int vel = (int)mml.args[0];

            pw.velocity = vel & 0x7f;

            MML vmml = new MML();

            vmml.type = enmMMLType.Velocity;
            vmml.args = new List <object>();
            vmml.args.Add(pw.velocity);
            vmml.line = mml.line;
            SetDummyData(pw, vmml);
        }
Пример #12
0
        public override void CmdY(partWork pw, MML mml)
        {
            base.CmdY(pw, mml);

            if (mml.args[0] is string)
            {
                return;
            }

            byte adr = (byte)mml.args[0];
            byte dat = (byte)mml.args[1];

            parent.OutData(mml, port[0], adr, dat);
        }
Пример #13
0
        public override void SetVolume(partWork pw, MML mml)
        {
            //if (pw.beforeExpression == pw.expression) return;
            //pw.beforeExpression = pw.expression;
            //OutMidiControlChange(pw, mml, enmControlChange.Expression, (byte)pw.expression);

            int vol = pw.expression;

            //if (pw.keyOn)
            {
                if (pw.envelopeMode)
                {
                    vol = 0;
                    if (pw.envIndex != -1)
                    {
                        vol = pw.envVolume - (127 - pw.expression);
                    }
                }

                for (int lfo = 0; lfo < 4; lfo++)
                {
                    if (!pw.lfo[lfo].sw)
                    {
                        continue;
                    }
                    if (pw.lfo[lfo].type != eLfoType.Tremolo)
                    {
                        continue;
                    }

                    vol += pw.lfo[lfo].value + pw.lfo[lfo].param[6];
                }
            }
            //else
            {
                //vol = 0;
            }

            vol = Common.CheckRange(vol, 0, 127);

            if (pw.beforeExpression != vol)
            {
                if (!pw.directModeTre)
                {
                    OutMidiControlChange(pw, mml, enmControlChange.Expression, (byte)vol);
                }
                pw.beforeExpression = vol;
            }
        }
Пример #14
0
        public override void SetFNum(partWork pw, MML mml)
        {
            int f = GetC140FNum(mml, pw, pw.octaveNow, pw.noteCmd, pw.shift + pw.keyShift);//

            if (pw.bendWaitCounter != -1)
            {
                f = pw.bendFnum;
            }
            f = f + pw.detune;
            for (int lfo = 0; lfo < 4; lfo++)
            {
                if (!pw.lfo[lfo].sw)
                {
                    continue;
                }
                if (pw.lfo[lfo].type != eLfoType.Vibrato)
                {
                    continue;
                }
                f += pw.lfo[lfo].value + pw.lfo[lfo].param[6];
            }

            f = Common.CheckRange(f, 0, 0xffff);
            if (pw.freq == f)
            {
                return;
            }

            pw.freq = f;


            //Delta
            int data = f & 0xffff;

            if (pw.beforeFNum != data)
            {
                int adr = pw.ch * 16 + 0x02;
                OutC140Port(mml, pw
                            , (byte)(adr >> 8)
                            , (byte)adr
                            , (byte)(data >> 8));
                adr++;
                OutC140Port(mml, pw
                            , (byte)(adr >> 8)
                            , (byte)adr
                            , (byte)data);
                pw.beforeFNum = data;
            }
        }
Пример #15
0
        public virtual void CmdRenpuEnd(partWork pw, MML mml)
        {
            //popしない内からスタックが空の場合は何もしない。
            if (pw.stackRenpu.Count == 0)
            {
                return;
            }

            pw.stackRenpu.Pop();

            if (pw.stackRenpu.Count == 0)
            {
                pw.renpuFlg = false;
            }
        }
Пример #16
0
 public override void SetVolume(partWork pw)
 {
     if (pw.Type == enmChannelType.FMOPN ||
         pw.Type == enmChannelType.FMOPNex || //効果音モード対応チャンネル
         (pw.Type == enmChannelType.FMPCM && !pw.pcm) || //OPN2PCMチャンネル
         (pw.Type == enmChannelType.FMPCMex && !pw.pcm)    //OPN2XPCMチャンネル
         )
     {
         SetFmVolume(pw);
     }
     else if (pw.Type == enmChannelType.SSG)
     {
         SetSsgVolume(pw);
     }
 }
Пример #17
0
        public void SetRf5c164SampleStartAddress(MML mml, partWork pw)
        {
            //Address shift
            int stAdr = pw.pcmStartAddress + pw.addressShift;

            //if (stAdr >= pw.pcmEndAddress) stAdr = pw.pcmEndAddress - 1;

            if (pw.beforepcmStartAddress != stAdr && stAdr >= 0)
            {
                SetRf5c164CurrentChannel(mml, pw);
                byte data = (byte)(stAdr >> 8);
                OutRf5c164Port(mml, port[0], pw.chipNumber, 0x6, data);
                //pw.pcmStartAddress = stAdr;
            }
        }
Пример #18
0
 public override void InitPart(partWork pw)
 {
     foreach (partPage pg in pw.pg)
     {
         pg.MaxVolume = 31;
         pg.volume    = pg.MaxVolume;
         pg.keyOn     = false;
         pg.pan       = 0;
         pg.mixer     = 0;
         pg.noise     = 0;
         pg.port      = port;
         pg.freq      = -1;
     }
     pw.spg.freq = -1;
 }
Пример #19
0
        public virtual void CmdDetune(partWork pw, MML mml)
        {
            int n = (int)mml.args[0];

            //n = Common.CheckRange(n, -127, 127);
            if (mml.args.Count > 1 && (string)mml.args[1] == "+")
            {
                //相対指定
                pw.detune += n;
            }
            else
            {
                pw.detune = n;
            }
        }
Пример #20
0
        public override void InitChip()
        {
            if (!use)
            {
                return;
            }

            for (int ch = 0; ch < ChMax; ch++)
            {
                partWork pw = lstPartWork[ch];
                pw.MaxVolume = Ch[ch].MaxVolume;
                pw.volume    = 3000;// pw.MaxVolume;
                pw.panL      = 16;
            }
        }
Пример #21
0
 public override void InitPart(ref partWork pw)
 {
     pw.slots         = (byte)(((pw.Type == enmChannelType.FMOPN || pw.Type == enmChannelType.FMPCM) || pw.ch == 2) ? 0xf : 0x0);
     pw.volume        = 127;
     pw.MaxVolume     = 127;
     pw.MaxVolumeEasy = 15;
     pw.port0         = (byte)(0x2 | (pw.isSecondary ? 0xa0 : 0x50));
     pw.port1         = (byte)(0x3 | (pw.isSecondary ? 0xa0 : 0x50));
     pw.octaveNew     = 6;
     pw.octaveNow     = 6;
     pw.beforeTLOP1   = -1;
     pw.beforeTLOP3   = -1;
     pw.beforeTLOP2   = -1;
     pw.beforeTLOP4   = -1;
 }
Пример #22
0
        public override void CmdPan(partWork pw, MML mml)
        {
            int n = (int)mml.args[0];

            //強制的にモノラルにする
            if (parent.info.monoPart != null &&
                parent.info.monoPart.Contains(Ch[5].Name))
            {
                n = 3;
            }

            n          = Common.CheckRange(n, 0, 3);
            pw.pan.val = n;
            ((ClsOPN)pw.chip).OutOPNSetPanAMSPMS(pw, n, pw.ams, pw.fms);
        }
Пример #23
0
        public override void SetVolume(partWork pw, MML mml)
        {
            byte data = 0;
            int  vol  = pw.volume;

            if (pw.keyOn)
            {
                if (pw.envelopeMode)
                {
                    vol = 0;
                    if (pw.envIndex != -1)
                    {
                        vol = pw.envVolume - (15 - pw.volume);
                    }
                    else
                    {
                        pw.keyOn = false;
                    }
                }

                for (int lfo = 0; lfo < 4; lfo++)
                {
                    if (!pw.lfo[lfo].sw)
                    {
                        continue;
                    }
                    if (pw.lfo[lfo].type != eLfoType.Tremolo)
                    {
                        continue;
                    }

                    vol += pw.lfo[lfo].value + pw.lfo[lfo].param[6];
                }
            }
            else
            {
                vol = 0;
            }

            vol = Common.CheckRange(vol, 0, 15);

            if (pw.beforeVolume != vol)
            {
                data = (byte)(0x80 + (pw.ch << 5) + 0x10 + (15 - vol));
                OutPsgPort(mml, port[0], data);
                pw.beforeVolume = vol;
            }
        }
Пример #24
0
        public override void CmdInstrument(partWork pw, MML mml)
        {
            char type = (char)mml.args[0];
            int  n    = (int)mml.args[1];

            if (type == 'I')
            {
                msgBox.setErrMsg(msg.get("E23001")
                                 , mml.line.Lp);
                return;
            }

            if (type == 'T')
            {
                msgBox.setErrMsg(msg.get("E23002")
                                 , mml.line.Lp);
                return;
            }

            if (type == 'E')
            {
                n = SetEnvelopParamFromInstrument(pw, n, mml);
                return;
            }

            n = Common.CheckRange(n, 0, 255);

            if (!parent.instPCM.ContainsKey(n))
            {
                msgBox.setErrMsg(string.Format(msg.get("E23003"), n)
                                 , mml.line.Lp);
                return;
            }

            if (parent.instPCM[n].chip != enmChipType.K053260)
            {
                msgBox.setErrMsg(string.Format(msg.get("E23004"), n)
                                 , mml.line.Lp);
                return;
            }

            pw.instrument      = n;
            pw.pcmStartAddress = (int)parent.instPCM[n].stAdr;
            pw.pcmEndAddress   = (int)parent.instPCM[n].edAdr;
            pw.pcmLoopAddress  = (int)parent.instPCM[n].loopAdr;
            pw.pcmBank         = (int)((parent.instPCM[n].stAdr >> 16));
            SetDummyData(pw, mml);
        }
Пример #25
0
        public override void CmdInstrument(partWork pw, MML mml)
        {
            char type = (char)mml.args[0];
            int  n    = (int)mml.args[1];

            if (type == 'I')
            {
                msgBox.setErrMsg(msg.get("E16005"));//, mml.line.Lp);
                return;
            }

            if (type == 'T')
            {
                n = Common.CheckRange(n, 0, 255);
                pw.toneDoubler = n;
                return;
            }

            if (type == 'E')
            {
                SetEnvelopParamFromInstrument(pw, n, mml);
                return;
            }

            n = Common.CheckRange(n, 0, 255);
            if (pw.instrument == n)
            {
                return;
            }

            pw.instrument = n;
            int modeBeforeSend = 0;// parent.info.modeBeforeSend;

            if (type == 'N')
            {
                modeBeforeSend = 0;
            }
            else if (type == 'R')
            {
                modeBeforeSend = 1;
            }
            else if (type == 'A')
            {
                modeBeforeSend = 2;
            }

            OutSetInstrument(pw, n, pw.volume, modeBeforeSend);
        }
Пример #26
0
        public override void SetVolume(partWork pw, MML mml)
        {
            int vol = pw.volume;

            if (pw.envelopeMode)
            {
                vol = 0;
                if (pw.envIndex != -1)
                {
                    vol = pw.envVolume - (pw.MaxVolume - pw.volume);
                }
            }

            for (int lfo = 0; lfo < 4; lfo++)
            {
                if (!pw.lfo[lfo].sw)
                {
                    continue;
                }
                if (pw.lfo[lfo].type != eLfoType.Tremolo)
                {
                    continue;
                }
                vol += pw.lfo[lfo].value + pw.lfo[lfo].param[6];
            }

            int vl = vol * pw.panL / pw.MaxVolume;
            int vr = vol * pw.panR / pw.MaxVolume;

            vl = Common.CheckRange(vl, 0, pw.MaxVolume);
            vr = Common.CheckRange(vr, 0, pw.MaxVolume);

            if (pw.beforeLVolume != vl)
            {
                //Volume(Left)
                int adr = pw.ch * 8 + 0x02;
                OutSegaPcmPort(mml, port[0], pw, adr, (byte)vl);
                pw.beforeLVolume = vl;
            }

            if (pw.beforeRVolume != vr)
            {
                //Volume(Right)
                int adr = pw.ch * 8 + 0x03;
                OutSegaPcmPort(mml, port[0], pw, adr, (byte)vr);
                pw.beforeRVolume = vr;
            }
        }
Пример #27
0
 public override void InitPart(partWork pw)
 {
     foreach (partPage pg in pw.pg)
     {
         pg.volume           = 127;
         pg.expression       = 127;
         pg.beforeExpression = -1;
         pg.MaxVolume        = 127;
         pg.MaxExpression    = 127;
         pg.tblNoteOn        = new bool[128];
         pg.directModeVib    = false;
         pg.directModeTre    = false;
         pg.pitchBend        = 0;
         pg.MIDIch           = pg.ch % 16;
     }
 }
Пример #28
0
        public override void CmdVolumeDown(partWork pw, MML mml)
        {
            int n = (int)mml.args[0];

            n              = Common.CheckRange(n, 1, pw.MaxExpression);
            pw.expression -= n;
            pw.expression  = Common.CheckRange(pw.expression, 0, pw.MaxExpression);

            MML vmml = new MML();

            vmml.type = enmMMLType.Volume;
            vmml.args = new List <object>();
            vmml.args.Add(pw.expression);
            vmml.line = mml.line;
            SetDummyData(pw, vmml);
        }
Пример #29
0
        /// <summary>
        /// Expression
        /// </summary>
        /// <param name="pw"></param>
        /// <param name="mml"></param>
        public override void CmdVolume(partWork pw, MML mml)
        {
            int n;

            n = (mml.args != null && mml.args.Count > 0) ? (int)mml.args[0] : pw.latestVolume;
            pw.latestVolume = n;
            pw.expression   = Common.CheckRange(n, 0, pw.MaxExpression);

            MML vmml = new MML();

            vmml.type = enmMMLType.Volume;
            vmml.args = new List <object>();
            vmml.args.Add(pw.expression);
            vmml.line = mml.line;
            SetDummyData(pw, vmml);
        }
Пример #30
0
 public override void InitPart(ref partWork pw)
 {
     pw.slots         = (byte)((pw.Type == enmChannelType.FMOPN || pw.ch == 2 || pw.ch == 5) ? 0xf : 0x0);
     pw.volume        = 127;
     pw.MaxVolume     = 127;
     pw.MaxVolumeEasy = 15;
     pw.port0         = 0x52;
     pw.port1         = 0x53;
     pw.pcm           = (pw.ch == 6 || pw.ch > 13);
     pw.octaveNew     = 6;
     pw.octaveNow     = 6;
     pw.beforeTLOP1   = -1;
     pw.beforeTLOP3   = -1;
     pw.beforeTLOP2   = -1;
     pw.beforeTLOP4   = -1;
 }