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; } }
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; } }
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); } }
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); } }
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; } }
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; } }
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; }
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); }
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); }
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); }
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); }
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); }
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; } }
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; } }
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; } }
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); } }
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; } }
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; }
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; } }
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; } }
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; }
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); }
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; } }
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); }
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); }
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; } }
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; } }
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); }
/// <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); }
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; }