static UINT jswrite(COMMNG self, UINT8 data) { CMJAST js; SINT32 pcm; js = (CMJAST)(self + 1); pcm = data << 5; js->pcm = pcm; #if defined(JSEVENTS) if (js->events < JSEVENTS) { JSEVT *e; e = js->event + js->events; e->clock = CPU_CLOCK + CPU_BASECLOCK - CPU_REMCLOCK - soundcfg.lastclock; e->pcm = pcm; js->events++; if (js->events == JSEVENTS) { sound_sync(); } } #else sound_sync(); #endif return(1); }
static void midisetparam(CMMIDI midi) { UINT8 i; UINT j; MIDICH mch; mch = midi->mch; sound_sync(); for (i=0; i<16; i++, mch++) { if (mch->press != 0xff) { midiout_shortmsg(midi->midihdl, MIDIOUTS(0xa0+i, mch->press, 0)); } if (mch->bend != 0xffff) { midiout_shortmsg(midi->midihdl, (mch->bend << 8) + 0xe0+i); } for (j=0; j<NELEMENTS(midictrltbl); j++) { if (mch->ctrl[j+1] != 0xff) { midiout_shortmsg(midi->midihdl, MIDIOUTS(0xb0+i, midictrltbl[j], mch->ctrl[j+1])); } } if (mch->prog != 0xff) { midiout_shortmsg(midi->midihdl, MIDIOUTS(0xc0+i, mch->prog, 0)); } } }
void fmport_b(NEVENTITEM item) { BOOL intreq = FALSE; if (item->flag & NEVENT_SETEVENT) { intreq = pcm86gen_intrq(); if (fmtimer.reg & 0x08) { fmtimer.status |= 0x02; intreq = TRUE; } #if 0 if (pcm86.fifo & 0x20) { sound_sync(); if (pcm86.virbuf <= pcm86.fifosize) { intreq = TRUE; } } #endif if (intreq) { // pcm86.write = 1; pic_setirq(fmtimer.irq); // TRACEOUT(("fm int-B")); } // TRACE_("B: fifo = ", pcm86.fifo); // TRACE_("B: virbuf = ", pcm86.virbuf); // TRACE_("B: fifosize = ", pcm86.fifosize); } }
static void midisetparam(CMMIDI midi) { MIDICH mch; UINT i, j; mch = midi->mch; sound_sync(); for (i = 0; i < 16; i++, mch++) { if (mch->press != 0xff) { (*midi->outfn)(midi, MIDIOUTS(0xa0+i, mch->press, 0),3); } if (mch->bend != 0xffff) { (*midi->outfn)(midi, (mch->bend << 8) + 0xe0+i, 3); } for (j = 0; j < sizeof(midictrltbl) / sizeof(UINT8); j++) { if (mch->ctrl[j+1] != 0xff) { (*midi->outfn)(midi, MIDIOUTS(0xb0+i, midictrltbl[j], mch->ctrl[j+1]), 3); } } if (mch->prog != 0xff) { (*midi->outfn)(midi, MIDIOUTS(0xc0+i, mch->prog, 0), 3); } } }
static void midiout_vermouth(CMMIDI midi, UINT32 msg, UINT cnt) { sound_sync(); midiout_shortmsg(midi->vermouth, msg); }
static void midireset(CMMIDI midi) { UINT8 work[4]; midiout_longmsg(midi->midihdl, EXCV_GMRESET, sizeof(EXCV_GMRESET)); work[1] = 0x7b; work[2] = 0x00; for (work[0]=0xb0; work[0]<0xc0; work[0]++) { keydisp_midi(work); sound_sync(); midiout_shortmsg(midi->midihdl, MIDIOUTS3(work)); } }
void pcm86_cb(NEVENTITEM item) { (void)item;//UNUSED #if 0 if (pcm86.reqirq) { sound_sync(); // RECALC_NOWCLKP; if (pcm86.virbuf <= pcm86.fifosize) { pcm86.reqirq = 0; pcm86.irqflag = 1; pic_setirq(fmtimer.irq); } else { pcm86_setnextintr(); } } (void)item; #endif }
static void fddmtrsnd_play(UINT num, BOOL play) { PMIXTRK *trk; if ((mtrsnd.enable) && (num < 2)) { sound_sync(); trk = mtrsnd.snd.trk + num; if (play) { if (trk->data.sample) { trk->pcm = trk->data.sample; trk->remain = trk->data.samples; mtrsnd.snd.hdr.playing |= (1 << num); } } else { mtrsnd.snd.hdr.playing &= ~(1 << num); } } }
static UINT midiwrite(COMMNG self, UINT8 data) { CMMIDI midi; MIDICH mch; midi = (CMMIDI)(self + 1); switch(data) { case MIDI_TIMING: case MIDI_START: case MIDI_CONTINUE: case MIDI_STOP: case MIDI_ACTIVESENSE: case MIDI_SYSTEMRESET: return(1); } if (midi->midictrl == MIDICTRL_READY) { if (data & 0x80) { midi->mpos = 0; switch(data & 0xf0) { case 0xc0: case 0xd0: midi->midictrl = MIDICTRL_2BYTES; break; case 0x80: case 0x90: case 0xa0: case 0xb0: case 0xe0: midi->midictrl = MIDICTRL_3BYTES; midi->midilast = data; break; default: switch(data) { case MIDI_EXCLUSIVE: midi->midictrl = MIDICTRL_EXCLUSIVE; break; case MIDI_TIMECODE: midi->midictrl = MIDICTRL_TIMECODE; break; case MIDI_SONGPOS: midi->midictrl = MIDICTRL_SYSTEM; midi->midisyscnt = 3; break; case MIDI_SONGSELECT: midi->midictrl = MIDICTRL_SYSTEM; midi->midisyscnt = 2; break; case MIDI_TUNEREQUEST: midi->midictrl = MIDICTRL_SYSTEM; midi->midisyscnt = 1; break; // case MIDI_EOX: default: return(1); } break; } } else { // Key-onのみな気がしたんだけど忘れた… // running status midi->buffer[0] = midi->midilast; midi->mpos = 1; midi->midictrl = MIDICTRL_3BYTES; } } midi->buffer[midi->mpos] = data; midi->mpos++; switch(midi->midictrl) { case MIDICTRL_2BYTES: if (midi->mpos >= 2) { midi->buffer[1] &= 0x7f; mch = midi->mch + (midi->buffer[0] & 0xf); switch(midi->buffer[0] & 0xf0) { case 0xa0: mch->press = midi->buffer[1]; break; case 0xc0: mch->prog = midi->buffer[1]; break; } keydisp_midi(midi->buffer); sound_sync(); midiout_shortmsg(midi->midihdl, MIDIOUTS2(midi->buffer)); midi->midictrl = MIDICTRL_READY; return(2); } break; case MIDICTRL_3BYTES: if (midi->mpos >= 3) { midi->buffer[1] &= 0x7f; midi->buffer[2] &= 0x7f; mch = midi->mch + (midi->buffer[0] & 0xf); switch(midi->buffer[0] & 0xf0) { case 0xb0: if (midi->buffer[1] == 123) { mch->press = 0; mch->bend = 0x4000; mch->ctrl[1+1] = 0; // Modulation mch->ctrl[5+1] = 127; // Explession mch->ctrl[6+1] = 0; // Hold mch->ctrl[7+1] = 0; // Portament mch->ctrl[8+1] = 0; // Sostenute mch->ctrl[9+1] = 0; // Soft } else { mch->ctrl[midictrlindex[midi->buffer[1]]] = midi->buffer[2]; } break; case 0xe0: mch->bend = LOADINTELWORD(midi->buffer + 1); break; } keydisp_midi(midi->buffer); sound_sync(); midiout_shortmsg(midi->midihdl, MIDIOUTS3(midi->buffer)); midi->midictrl = MIDICTRL_READY; return(3); } break; case MIDICTRL_EXCLUSIVE: if (data == MIDI_EOX) { midiout_longmsg(midi->midihdl, midi->buffer, midi->mpos); midi->midictrl = MIDICTRL_READY; return(midi->mpos); } else if (midi->mpos >= MIDI_BUFFER) { // おーばーふろー midi->midictrl = MIDICTRL_READY; } break; case MIDICTRL_TIMECODE: if (midi->mpos >= 2) { if ((data == 0x7e) || (data == 0x7f)) { // exclusiveと同じでいい筈… midi->midictrl = MIDICTRL_EXCLUSIVE; } else { midi->midictrl = MIDICTRL_READY; return(2); } } break; case MIDICTRL_SYSTEM: if (midi->mpos >= midi->midisyscnt) { midi->midictrl = MIDICTRL_READY; return(midi->midisyscnt); } break; } return(0); }
void adpcm_setreg(ADPCM ad, UINT reg, REG8 value) { UINT32 addr; sound_sync(); ((UINT8 *)(&ad->reg))[reg] = value; switch(reg) { case 0x00: // control1 if ((value & 0x80) && (!ad->play)) { ad->play = 0x20; ad->pos = ad->start; ad->samp = 0; ad->delta = 127; ad->remain = 0; } if (value & 1) { ad->play = 0; } break; case 0x01: // control2 break; case 0x02: case 0x03: // start address addr = (LOADINTELWORD(ad->reg.start)) << 5; ad->pos = addr; ad->start = addr; break; case 0x04: case 0x05: // stop address addr = (LOADINTELWORD(ad->reg.stop) + 1) << 5; ad->stop = addr; break; case 0x08: // data if ((ad->reg.ctrl1 & 0x60) == 0x60) { adpcm_datawrite(ad, value); } break; case 0x09: case 0x0a: // delta addr = LOADINTELWORD(ad->reg.delta); addr = (addr * ad->base) >> 16; if (addr < 0x80) { addr = 0x80; } ad->step = addr; ad->pertim = (1 << (ADTIMING_BIT * 2)) / addr; break; case 0x0b: // level ad->level = (value * adpcmcfg.vol) >> 4; break; case 0x0c: case 0x0d: // limit address addr = (LOADINTELWORD(ad->reg.limit) + 1) << 5; ad->limit = addr; break; case 0x10: // flag if (value & 0x80) { ad->status = 0; } else { ad->mask = ~(value & 0x1f); } break; } }
static void midi_mt32long(CMMIDI midi, const UINT8 *msg, UINT leng) { sound_sync(); mt32sound_longmsg(msg, leng); }
static void midi_mt32short(CMMIDI midi, UINT32 msg) { sound_sync(); mt32sound_shortmsg(msg); }
static void midi_vermouthlong(CMMIDI midi, const UINT8 *msg, UINT leng) { sound_sync(); midiout_longmsg(midi->out.vermouth, msg, leng); }
static void midi_vermouthshort(CMMIDI midi, UINT32 msg) { sound_sync(); midiout_shortmsg(midi->out.vermouth, msg); }
void psggen_setreg(PSGGEN psg, REG8 reg, REG8 value) { UINT freq; UINT ch; if (reg >= 14) { return; } sound_sync(); ((UINT8 *)&psg->reg)[reg] = value; switch(reg) { case 0: case 1: case 2: case 3: case 4: case 5: ch = reg >> 1; freq = LOADINTELWORD(psg->reg.tune[ch]) & 0xfff; if (freq > 9) { psg->tone[ch].freq = (psggencfg.base / freq) << PSGFREQPADBIT; } else { psg->tone[ch].freq = 0; psg->tone[ch].count = 0; // としておかないとノイズ出ない } break; case 6: freq = value & 0x1f; if (freq == 0) { freq = 1; } psg->noise.freq = psggencfg.base / freq; psg->noise.freq <<= PSGFREQPADBIT; break; case 7: // keydisp_psgmix(psg); psg->mixer = ~value; psg->puchicount = psggencfg.puchidec; break; case 8: case 9: case 10: ch = reg - 8; // keydisp_psgvol(psg, (UINT8)ch); if (value & 0x10) { psg->tone[ch].pvol = &psg->evol; } else { psg->tone[ch].pvol = psggencfg.volume + (value & 15); } psg->tone[ch].puchi = psggencfg.puchidec; psg->puchicount = psggencfg.puchidec; break; case 11: case 12: freq = LOADINTELWORD(psg->reg.envtime); freq = psggencfg.rate * freq / 125000; if (freq == 0) { freq = 1; } psg->envmax = freq; break; case 13: psg->envmode = psgenv_pat[value & 0x0f]; psg->envvolcnt = 16; psg->envcnt = 0; break; } }
void psggen_setreg(PSGGEN psg, UINT reg, REG8 value) { UINT ch; UINT freq; reg = reg & 15; if (reg < 14) { sound_sync(); } ((UINT8 *)&psg->reg)[reg] = value; switch(reg) { case 0: case 1: case 2: case 3: case 4: case 5: ch = reg >> 1; freq = LOADINTELWORD(psg->reg.tune[ch]) & 0xfff; if (freq > 9) { psg->tone[ch].freq = (psggencfg.base / freq) << PSGFREQPADBIT; } else { psg->tone[ch].freq = 0; } break; case 6: freq = value & 0x1f; if (freq == 0) { freq = 1; } psg->noise.freq = (psggencfg.base / freq) << PSGFREQPADBIT; break; case 7: psg->mixer = ~value; psg->puchicount = psggencfg.puchidec; // TRACEOUT(("psg %x 7 %d", (long)psg, value)); break; case 8: case 9: case 10: ch = reg - 8; if (value & 0x10) { psg->tone[ch].pvol = &psg->evol; } else { psg->tone[ch].pvol = psggencfg.volume + (value & 15); } psg->tone[ch].puchi = psggencfg.puchidec; psg->puchicount = psggencfg.puchidec; // TRACEOUT(("psg %x %x %d", (long)psg, reg, value)); break; case 11: case 12: freq = LOADINTELWORD(psg->reg.envtime); freq = psggencfg.rate * freq / 125000; if (freq == 0) { freq = 1; } psg->envmax = freq; break; case 13: psg->envmode = psgenv_pat[value & 0x0f]; psg->envvolcnt = 16; psg->envcnt = 1; break; } }