95%, core1/audio/n_csplayer.c done
This commit is contained in:
parent
1074cefa5f
commit
68d2037a85
|
@ -1,4 +1,4 @@
|
||||||
# banjo (94.9890%)
|
# banjo (95.3216%)
|
||||||
|
|
||||||
<img src="./progress/progress_total.svg">
|
<img src="./progress/progress_total.svg">
|
||||||
|
|
||||||
|
|
|
@ -197,7 +197,7 @@ segments:
|
||||||
- [0xF38E50, c, done/audio/n_synsetfxmix] #DONE
|
- [0xF38E50, c, done/audio/n_synsetfxmix] #DONE
|
||||||
- [0xF38EE0, c, done/audio/n_synstopvoice] #DONE
|
- [0xF38EE0, c, done/audio/n_synstopvoice] #DONE
|
||||||
- [0xF38F50, c, done/audio/n_synfreevoice] #DONE
|
- [0xF38F50, c, done/audio/n_synfreevoice] #DONE
|
||||||
- [0xF38FF0, c, audio/n_csplayer]
|
- [0xF38FF0, c, done/audio/n_csplayer] #DONE
|
||||||
- [0xF3A460, c, done/audio/cspsetbank] #DONE
|
- [0xF3A460, c, done/audio/cspsetbank] #DONE
|
||||||
- [0xF3A4A0, c, done/audio/cspstop] #DONE
|
- [0xF3A4A0, c, done/audio/cspstop] #DONE
|
||||||
- [0xF3A4D0, c, done/audio/n_csq] #DONE
|
- [0xF3A4D0, c, done/audio/n_csq] #DONE
|
||||||
|
@ -424,7 +424,7 @@ segments:
|
||||||
- [0xF53B70, .rodata, code_1BE90]
|
- [0xF53B70, .rodata, code_1BE90]
|
||||||
- [0xF53BA0, .rodata, code_1D5D0]
|
- [0xF53BA0, .rodata, code_1D5D0]
|
||||||
- [0xF53C00, .rodata, done/audio/n_synthesizer]
|
- [0xF53C00, .rodata, done/audio/n_synthesizer]
|
||||||
- [0xF53C10, bin, data_3A9C0] # .rodata, audio/n_csplayer]
|
- [0xF53C10, .rodata, done/audio/n_csplayer]
|
||||||
- [0xF53F80, .rodata, done/audio/n_reverb]
|
- [0xF53F80, .rodata, done/audio/n_reverb]
|
||||||
- [0xF53FB0, .rodata, done/audio/n_drvrNew]
|
- [0xF53FB0, .rodata, done/audio/n_drvrNew]
|
||||||
- [0xF53FD0, .rodata, done/audio/n_env]
|
- [0xF53FD0, .rodata, done/audio/n_env]
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
</mask>
|
</mask>
|
||||||
<g mask="url(#anybadge_1)">
|
<g mask="url(#anybadge_1)">
|
||||||
<path fill="#555" d="M0 0h44v20H0z"/>
|
<path fill="#555" d="M0 0h44v20H0z"/>
|
||||||
<path fill="#2be000" d="M44 0h67v20H44z"/>
|
<path fill="#20e000" d="M44 0h67v20H44z"/>
|
||||||
<path fill="url(#b)" d="M0 0h111v20H0z"/>
|
<path fill="url(#b)" d="M0 0h111v20H0z"/>
|
||||||
</g>
|
</g>
|
||||||
<g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
|
<g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
|
||||||
|
@ -17,7 +17,7 @@
|
||||||
<text x="22.0" y="14">core1</text>
|
<text x="22.0" y="14">core1</text>
|
||||||
</g>
|
</g>
|
||||||
<g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
|
<g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
|
||||||
<text x="78.5" y="15" fill="#010101" fill-opacity=".3">90.4597%</text>
|
<text x="78.5" y="15" fill="#010101" fill-opacity=".3">92.7510%</text>
|
||||||
<text x="77.5" y="14">90.4597%</text>
|
<text x="77.5" y="14">92.7510%</text>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
|
@ -9,7 +9,7 @@
|
||||||
</mask>
|
</mask>
|
||||||
<g mask="url(#anybadge_1)">
|
<g mask="url(#anybadge_1)">
|
||||||
<path fill="#555" d="M0 0h150v20H0z"/>
|
<path fill="#555" d="M0 0h150v20H0z"/>
|
||||||
<path fill="#16e000" d="M150 0h67v20H150z"/>
|
<path fill="#15e000" d="M150 0h67v20H150z"/>
|
||||||
<path fill="url(#b)" d="M0 0h217v20H0z"/>
|
<path fill="url(#b)" d="M0 0h217v20H0z"/>
|
||||||
</g>
|
</g>
|
||||||
<g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
|
<g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
|
||||||
|
@ -17,7 +17,7 @@
|
||||||
<text x="75.0" y="14">Banjo-Kazooie (us.v10)</text>
|
<text x="75.0" y="14">Banjo-Kazooie (us.v10)</text>
|
||||||
</g>
|
</g>
|
||||||
<g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
|
<g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
|
||||||
<text x="184.5" y="15" fill="#010101" fill-opacity=".3">94.9890%</text>
|
<text x="184.5" y="15" fill="#010101" fill-opacity=".3">95.3216%</text>
|
||||||
<text x="183.5" y="14">94.9890%</text>
|
<text x="183.5" y="14">95.3216%</text>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
@ -1,20 +0,0 @@
|
||||||
#include <ultra64.h>
|
|
||||||
#include "functions.h"
|
|
||||||
#include "variables.h"
|
|
||||||
|
|
||||||
|
|
||||||
#pragma GLOBAL_ASM("asm/nonmatchings/core1/audio/n_csplayer/func_8025D7C0.s")
|
|
||||||
|
|
||||||
#pragma GLOBAL_ASM("asm/nonmatchings/core1/audio/n_csplayer/func_8025D830.s")
|
|
||||||
|
|
||||||
#pragma GLOBAL_ASM("asm/nonmatchings/core1/audio/n_csplayer/func_8025D838.s")
|
|
||||||
|
|
||||||
#pragma GLOBAL_ASM("asm/nonmatchings/core1/audio/n_csplayer/func_8025D840.s")
|
|
||||||
|
|
||||||
#pragma GLOBAL_ASM("asm/nonmatchings/core1/audio/n_csplayer/func_8025DA30.s")
|
|
||||||
|
|
||||||
#pragma GLOBAL_ASM("asm/nonmatchings/core1/audio/n_csplayer/func_8025E430.s")
|
|
||||||
|
|
||||||
#pragma GLOBAL_ASM("asm/nonmatchings/core1/audio/n_csplayer/__n_CSPVoiceHandler.s")
|
|
||||||
|
|
||||||
#pragma GLOBAL_ASM("asm/nonmatchings/core1/audio/n_csplayer/n_alCSPNew.s")
|
|
|
@ -1,33 +1,75 @@
|
||||||
#include <ultra64.h>
|
#include <ultra64.h>
|
||||||
|
#include "functions.h"
|
||||||
|
#include "variables.h"
|
||||||
|
|
||||||
#include "n_synth.h"
|
#include "n_synth.h"
|
||||||
#include <assert.h>
|
|
||||||
|
|
||||||
#include "seqp.h"
|
#include "seqp.h"
|
||||||
#include "n_cseqp.h"
|
#include "file_and_line.h"
|
||||||
#include "cseq.h"
|
|
||||||
|
|
||||||
#ifndef assert
|
extern void func_8033F000(const char *, const char *, int);
|
||||||
#define assert(s)
|
void n_alSynSetVol( N_ALVoice *v, s16 volume, ALMicroTime t);
|
||||||
#endif
|
s16 __n_vsVol(ALVoiceState *voice, ALSeqPlayer *seqp);
|
||||||
|
ALVoiceState *__n_lookupVoice(ALSeqPlayer *, u8, u8);
|
||||||
|
ALVoiceState *__n_mapVoice(ALSeqPlayer *, u8, u8, u8);
|
||||||
|
ALSound *__n_lookupSoundQuick(ALSeqPlayer *, u8, u8, u8);
|
||||||
|
void __n_seqpReleaseVoice(ALSeqPlayer *seqp, ALVoice *voice, ALMicroTime deltaTime);
|
||||||
|
|
||||||
|
/*====================================================================
|
||||||
|
* csplayer.c
|
||||||
|
*
|
||||||
|
* Copyright 1995, Silicon Graphics, Inc.
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics,
|
||||||
|
* Inc.; the contents of this file may not be disclosed to third
|
||||||
|
* parties, copied or duplicated in any form, in whole or in part,
|
||||||
|
* without the prior written permission of Silicon Graphics, Inc.
|
||||||
|
*
|
||||||
|
* RESTRICTED RIGHTS LEGEND:
|
||||||
|
* Use, duplication or disclosure by the Government is subject to
|
||||||
|
* restrictions as set forth in subdivision (c)(1)(ii) of the Rights
|
||||||
|
* in Technical Data and Computer Software clause at DFARS
|
||||||
|
* 252.227-7013, and/or in similar or successor clauses in the FAR,
|
||||||
|
* DOD or NASA FAR Supplement. Unpublished - rights reserved under the
|
||||||
|
* Copyright Laws of the United States.
|
||||||
|
*====================================================================*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Notes:
|
||||||
|
*
|
||||||
|
* Controller Numbers:
|
||||||
|
* 1 Modulation
|
||||||
|
* 7 Volume
|
||||||
|
* 10 Pan
|
||||||
|
* 11 Expression
|
||||||
|
* 64 Sustain
|
||||||
|
* 121 Reset All Controllers
|
||||||
|
* 123 All Notes Off
|
||||||
|
*
|
||||||
|
* Registered Parameters
|
||||||
|
* 0 Pitch Bend Sensitivity
|
||||||
|
* 1 Fine Tuning
|
||||||
|
* 2 Coarse Tuning
|
||||||
|
*/
|
||||||
|
void func_8025D7C0(ALCSPlayer *seqp);
|
||||||
|
|
||||||
static ALMicroTime __n_CSPVoiceHandler(void *node);
|
static ALMicroTime __n_CSPVoiceHandler(void *node);
|
||||||
static void __n_CSPHandleNextSeqEvent(N_ALCSPlayer *seqp);
|
static void __CSPHandleNextSeqEvent(ALCSPlayer *seqp);
|
||||||
static void __n_CSPHandleMIDIMsg(N_ALCSPlayer *seqp, N_ALEvent *event);
|
static void __n_CSPHandleMIDIMsg(N_ALCSPlayer *seqp, ALEvent *event);
|
||||||
static void __n_CSPHandleMetaMsg(N_ALCSPlayer *seqp, N_ALEvent *event);
|
static void __CSPHandleMetaMsg(ALCSPlayer *seqp, ALEvent *event);
|
||||||
static void __n_CSPRepostEvent(ALEventQueue *evtq, N_ALEventListItem *item);
|
static void __CSPRepostEvent(ALEventQueue *evtq, ALEventListItem *item);
|
||||||
static void __n_setUsptFromTempo(N_ALCSPlayer *seqp, ALCSeq *target, f32 tempo); /* sct 1/8/96 */
|
static void __setUsptFromTempo(ALCSPlayer *seqp, f32 tempo); /* sct 1/8/96 */
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sequence Player public functions
|
* Sequence Player public functions
|
||||||
*/
|
*/
|
||||||
/*done*/
|
|
||||||
void n_alCSPNew(N_ALCSPlayer *seqp, ALSeqpConfig *c)
|
void n_alCSPNew(N_ALCSPlayer *seqp, ALSeqpConfig *c)
|
||||||
{
|
{
|
||||||
s32 i;
|
s32 i;
|
||||||
N_ALEventListItem *items;
|
ALEventListItem *items;
|
||||||
N_ALVoiceState *vs;
|
ALVoiceState *vs;
|
||||||
N_ALVoiceState *voices;
|
ALVoiceState *voices;
|
||||||
|
|
||||||
ALHeap *hp = c->heap;
|
ALHeap *hp = c->heap;
|
||||||
|
|
||||||
|
@ -37,7 +79,7 @@ void n_alCSPNew(N_ALCSPlayer *seqp, ALSeqpConfig *c)
|
||||||
seqp->bank = 0;
|
seqp->bank = 0;
|
||||||
seqp->target = NULL;
|
seqp->target = NULL;
|
||||||
seqp->drvr = n_syn;
|
seqp->drvr = n_syn;
|
||||||
seqp->chanMask = 0xffff;
|
seqp->chanMask = -1;
|
||||||
seqp->uspt = 488;
|
seqp->uspt = 488;
|
||||||
seqp->nextDelta = 0;
|
seqp->nextDelta = 0;
|
||||||
seqp->state = AL_STOPPED;
|
seqp->state = AL_STOPPED;
|
||||||
|
@ -93,114 +135,115 @@ void n_alCSPNew(N_ALCSPlayer *seqp, ALSeqpConfig *c)
|
||||||
*************************************************************/
|
*************************************************************/
|
||||||
static ALMicroTime __n_CSPVoiceHandler(void *node)
|
static ALMicroTime __n_CSPVoiceHandler(void *node)
|
||||||
{
|
{
|
||||||
N_ALCSPlayer *seqp = (N_ALCSPlayer *) node;
|
ALCSPlayer *seqp = (ALCSPlayer *) node;
|
||||||
N_ALEvent evt;
|
ALEvent evt;
|
||||||
ALVoice *voice;
|
ALVoice *voice;
|
||||||
ALMicroTime delta;
|
ALMicroTime delta;
|
||||||
ALVoiceState *vs;
|
ALVoiceState *vs;
|
||||||
void *oscState;
|
void *oscState;
|
||||||
f32 oscValue;
|
f32 oscValue;
|
||||||
u8 chan;
|
u8 chan;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
switch (seqp->nextEvent.type)
|
switch (seqp->nextEvent.type)
|
||||||
{
|
{
|
||||||
case (AL_SEQ_REF_EVT):
|
case (AL_SEQ_REF_EVT):
|
||||||
__n_CSPHandleNextSeqEvent(seqp);
|
__CSPHandleNextSeqEvent(seqp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (AL_SEQP_API_EVT):
|
case (AL_SEQP_API_EVT):
|
||||||
evt.type = AL_SEQP_API_EVT;
|
evt.type = AL_SEQP_API_EVT;
|
||||||
alEvtqPostEvent(&seqp->evtq, (ALEvent *)&evt, seqp->frameTime);
|
alEvtqPostEvent(&seqp->evtq, (ALEvent *)&evt, seqp->frameTime);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (AL_NOTE_END_EVT):
|
case (AL_NOTE_END_EVT):
|
||||||
voice = seqp->nextEvent.msg.note.voice;
|
voice = seqp->nextEvent.msg.note.voice;
|
||||||
|
|
||||||
n_alSynStopVoice(voice);
|
n_alSynStopVoice(voice);
|
||||||
n_alSynFreeVoice(voice);
|
n_alSynFreeVoice(voice);
|
||||||
vs = (ALVoiceState *)voice->clientPrivate;
|
vs = (ALVoiceState *)voice->clientPrivate;
|
||||||
if(vs->flags)
|
if(vs->flags)
|
||||||
__n_seqpStopOsc((ALSeqPlayer*)seqp,vs);
|
__n_seqpStopOsc((ALSeqPlayer*)seqp,vs);
|
||||||
__n_unmapVoice((ALSeqPlayer*)seqp, voice);
|
__n_unmapVoice((ALSeqPlayer*)seqp, voice);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (AL_SEQP_ENV_EVT):
|
case (AL_SEQP_ENV_EVT):
|
||||||
voice = seqp->nextEvent.msg.vol.voice;
|
voice = seqp->nextEvent.msg.vol.voice;
|
||||||
vs = (ALVoiceState *)voice->clientPrivate;
|
vs = (ALVoiceState *)voice->clientPrivate;
|
||||||
|
|
||||||
if(vs->envPhase == AL_PHASE_ATTACK)
|
if(vs->envPhase == AL_PHASE_ATTACK)
|
||||||
vs->envPhase = AL_PHASE_DECAY;
|
vs->envPhase = AL_PHASE_DECAY;
|
||||||
|
|
||||||
delta = seqp->nextEvent.msg.vol.delta;
|
delta = seqp->nextEvent.msg.vol.delta;
|
||||||
vs->envEndTime = seqp->curTime + delta;
|
vs->envEndTime = seqp->curTime + delta;
|
||||||
vs->envGain = seqp->nextEvent.msg.vol.vol;
|
vs->envGain = seqp->nextEvent.msg.vol.vol;
|
||||||
n_alSynSetVol(voice, __n_vsVol(vs, (ALSeqPlayer*)seqp), delta);
|
n_alSynSetVol(voice, __n_vsVol(vs, (ALSeqPlayer*)seqp), delta);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (AL_TREM_OSC_EVT):
|
case (AL_TREM_OSC_EVT):
|
||||||
vs = seqp->nextEvent.msg.osc.vs;
|
vs = seqp->nextEvent.msg.osc.vs;
|
||||||
oscState = seqp->nextEvent.msg.osc.oscState;
|
oscState = seqp->nextEvent.msg.osc.oscState;
|
||||||
delta = (*seqp->updateOsc)(oscState,&oscValue);
|
delta = (*seqp->updateOsc)(oscState,&oscValue);
|
||||||
vs->tremelo = (u8)oscValue;
|
vs->tremelo = (u8)oscValue;
|
||||||
n_alSynSetVol(&vs->voice, __n_vsVol(vs,(ALSeqPlayer*)seqp),
|
n_alSynSetVol(&vs->voice, __n_vsVol(vs,(ALSeqPlayer*)seqp),
|
||||||
__n_vsDelta(vs,seqp->curTime));
|
__n_vsDelta(vs,seqp->curTime));
|
||||||
evt.type = AL_TREM_OSC_EVT;
|
evt.type = AL_TREM_OSC_EVT;
|
||||||
evt.msg.osc.vs = vs;
|
evt.msg.osc.vs = vs;
|
||||||
evt.msg.osc.oscState = oscState;
|
evt.msg.osc.oscState = oscState;
|
||||||
alEvtqPostEvent(&seqp->evtq, &evt, delta);
|
alEvtqPostEvent(&seqp->evtq, &evt, delta);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (AL_VIB_OSC_EVT):
|
case (AL_VIB_OSC_EVT):
|
||||||
vs = seqp->nextEvent.msg.osc.vs;
|
vs = seqp->nextEvent.msg.osc.vs;
|
||||||
oscState = seqp->nextEvent.msg.osc.oscState;
|
oscState = seqp->nextEvent.msg.osc.oscState;
|
||||||
chan = seqp->nextEvent.msg.osc.chan;
|
chan = seqp->nextEvent.msg.osc.chan;
|
||||||
delta = (*seqp->updateOsc)(oscState,&oscValue);
|
delta = (*seqp->updateOsc)(oscState,&oscValue);
|
||||||
vs->vibrato = oscValue;
|
vs->vibrato = oscValue;
|
||||||
n_alSynSetPitch(&vs->voice, vs->pitch * vs->vibrato
|
n_alSynSetPitch(&vs->voice, vs->pitch * vs->vibrato
|
||||||
* seqp->chanState[chan].pitchBend);
|
* seqp->chanState[chan].pitchBend);
|
||||||
evt.type = AL_VIB_OSC_EVT;
|
evt.type = AL_VIB_OSC_EVT;
|
||||||
evt.msg.osc.vs = vs;
|
evt.msg.osc.vs = vs;
|
||||||
evt.msg.osc.oscState = oscState;
|
evt.msg.osc.oscState = oscState;
|
||||||
evt.msg.osc.chan = chan;
|
evt.msg.osc.chan = chan;
|
||||||
alEvtqPostEvent(&seqp->evtq, &evt, delta);
|
alEvtqPostEvent(&seqp->evtq, &evt, delta);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (AL_SEQP_MIDI_EVT):
|
case (AL_SEQP_MIDI_EVT):
|
||||||
case (AL_CSP_NOTEOFF_EVT): /* nextEvent is a note off midi message */
|
case (AL_CSP_NOTEOFF_EVT): /* nextEvent is a note off midi message */
|
||||||
__n_CSPHandleMIDIMsg(seqp, &seqp->nextEvent);
|
__n_CSPHandleMIDIMsg(seqp, &seqp->nextEvent);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (AL_SEQP_META_EVT):
|
case (AL_SEQP_META_EVT):
|
||||||
__n_CSPHandleMetaMsg(seqp, &seqp->nextEvent);
|
__CSPHandleMetaMsg(seqp, &seqp->nextEvent);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (AL_SEQP_VOL_EVT):
|
case (AL_SEQP_VOL_EVT):
|
||||||
seqp->vol = seqp->nextEvent.msg.spvol.vol;
|
seqp->vol = seqp->nextEvent.msg.spvol.vol;
|
||||||
for (vs = seqp->vAllocHead; vs != 0; vs = vs->next)
|
for (vs = seqp->vAllocHead; vs != 0; vs = vs->next)
|
||||||
{
|
{
|
||||||
n_alSynSetVol(&vs->voice,
|
n_alSynSetVol(&vs->voice,
|
||||||
__n_vsVol(vs, (ALSeqPlayer*)seqp),
|
__n_vsVol(vs, (ALSeqPlayer*)seqp),
|
||||||
__n_vsDelta(vs, seqp->curTime));
|
__n_vsDelta(vs, seqp->curTime));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (AL_SEQP_PLAY_EVT):
|
case (AL_SEQP_PLAY_EVT):
|
||||||
if (seqp->state != AL_PLAYING)
|
if (seqp->state != AL_PLAYING)
|
||||||
{
|
{
|
||||||
seqp->state = AL_PLAYING;
|
seqp->state = AL_PLAYING;
|
||||||
func_80250650();
|
func_80250650();
|
||||||
__n_CSPPostNextSeqEvent(seqp); /* seqp must be AL_PLAYING before we call this routine. */
|
func_8025D7C0(seqp); /* seqp must be AL_PLAYING before we call this routine. */
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (AL_SEQP_STOP_EVT):
|
case (AL_SEQP_STOP_EVT):
|
||||||
if ( seqp->state == AL_STOPPING )
|
if ( seqp->state == AL_STOPPING )
|
||||||
{
|
{
|
||||||
for (vs = seqp->vAllocHead; vs != 0; vs = seqp->vAllocHead)
|
for (vs = seqp->vAllocHead; vs != 0; vs = seqp->vAllocHead)
|
||||||
{
|
{
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
__osError(ERR_ALCSPVNOTFREE, 2, vs->channel, vs->key);
|
__osError(ERR_ALCSPVNOTFREE, 2, vs->channel, vs->key);
|
||||||
#endif
|
#endif
|
||||||
n_alSynStopVoice(&vs->voice);
|
n_alSynStopVoice(&vs->voice);
|
||||||
n_alSynFreeVoice(&vs->voice);
|
n_alSynFreeVoice(&vs->voice);
|
||||||
if(vs->flags)
|
if(vs->flags)
|
||||||
|
@ -220,71 +263,68 @@ static ALMicroTime __n_CSPVoiceHandler(void *node)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (AL_SEQP_STOPPING_EVT):
|
case (AL_SEQP_STOPPING_EVT):
|
||||||
if (seqp->state == AL_PLAYING)
|
if (seqp->state == AL_PLAYING)
|
||||||
{
|
{
|
||||||
/* sct 12/29/95 - Remove events associated with the
|
/* sct 12/29/95 - Remove events associated with the
|
||||||
* stopping sequence. For compact sequence player,
|
* stopping sequence. For compact sequence player,
|
||||||
* also remove all queued note off events since they
|
* also remove all queued note off events since they
|
||||||
* are not contained in a compact sequence but are
|
* are not contained in a compact sequence but are
|
||||||
* generated in response to note ons. Note that
|
* generated in response to note ons. Note that
|
||||||
* flushing AL_SEQP_MIDI_EVTs may flush events that
|
* flushing AL_SEQP_MIDI_EVTs may flush events that
|
||||||
* were posted after the call to alSeqpStop, so the
|
* were posted after the call to alSeqpStop, so the
|
||||||
* application must queue these events either when
|
* application must queue these events either when
|
||||||
* the player is fully stopped, or when it is
|
* the player is fully stopped, or when it is
|
||||||
* playing. */
|
* playing. */
|
||||||
alEvtqFlushType(&seqp->evtq, AL_SEQ_REF_EVT);
|
alEvtqFlushType(&seqp->evtq, AL_SEQ_REF_EVT);
|
||||||
alEvtqFlushType(&seqp->evtq, AL_CSP_NOTEOFF_EVT);
|
alEvtqFlushType(&seqp->evtq, AL_CSP_NOTEOFF_EVT);
|
||||||
alEvtqFlushType(&seqp->evtq, AL_SEQP_MIDI_EVT);
|
alEvtqFlushType(&seqp->evtq, AL_SEQP_MIDI_EVT);
|
||||||
|
|
||||||
/* sct 1/3/96 - Check to see which voices need to be
|
/* sct 1/3/96 - Check to see which voices need to be
|
||||||
killed and release them. */
|
killed and release them. */
|
||||||
/* Unkilled voices should have note end events
|
/* Unkilled voices should have note end events
|
||||||
occurring prior to KILL_TIME. */
|
occurring prior to KILL_TIME. */
|
||||||
for (vs = seqp->vAllocHead; vs != 0; vs = vs->next)
|
for (vs = seqp->vAllocHead; vs != 0; vs = vs->next)
|
||||||
{
|
{
|
||||||
if (__n_voiceNeedsNoteKill ((ALSeqPlayer*)seqp, &vs->voice, KILL_TIME))
|
if (__n_voiceNeedsNoteKill ((ALSeqPlayer*)seqp, &vs->voice, KILL_TIME))
|
||||||
__n_seqpReleaseVoice((ALSeqPlayer*)seqp, &vs->voice, KILL_TIME);
|
__n_seqpReleaseVoice((ALSeqPlayer*)seqp, &vs->voice, KILL_TIME);
|
||||||
}
|
}
|
||||||
|
|
||||||
seqp->state = AL_STOPPING;
|
seqp->state = AL_STOPPING;
|
||||||
evt.type = AL_SEQP_STOP_EVT;
|
evt.type = AL_SEQP_STOP_EVT;
|
||||||
alEvtqPostEvent(&seqp->evtq, &evt, AL_EVTQ_END);
|
alEvtqPostEvent(&seqp->evtq, &evt, AL_EVTQ_END);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (AL_SEQP_PRIORITY_EVT):
|
case (AL_SEQP_PRIORITY_EVT):
|
||||||
chan = seqp->nextEvent.msg.sppriority.chan;
|
chan = seqp->nextEvent.msg.sppriority.chan;
|
||||||
seqp->chanState[chan].priority = seqp->nextEvent.msg.sppriority.priority;
|
seqp->chanState[chan].priority = seqp->nextEvent.msg.sppriority.priority;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (AL_SEQP_SEQ_EVT):
|
case (AL_SEQP_SEQ_EVT):
|
||||||
//assert(seqp->state != AL_PLAYING); /* Must be done playing to change sequences. */
|
matching_assert(seqp->state != AL_PLAYING, n_csplayer.c, 0x110);/* Must be done playing to change sequences. */
|
||||||
((seqp->state != AL_PLAYING)?((void)0):func_8033F000("seqp->state != AL_PLAYING","n_csplayer.c", 272));
|
|
||||||
|
seqp->target = seqp->nextEvent.msg.spseq.seq;
|
||||||
|
seqp->chanMask = 0xffff;
|
||||||
|
// __setUsptFromTempo (seqp, 500000.0);
|
||||||
|
if (seqp->bank)
|
||||||
|
__n_initFromBank((ALSeqPlayer *)seqp, seqp->bank);
|
||||||
|
break;
|
||||||
|
|
||||||
seqp->target = seqp->nextEvent.msg.spseq.seq;
|
case (AL_SEQP_BANK_EVT):
|
||||||
seqp->chanMask = 0xFFFF;
|
matching_assert(seqp->state == AL_STOPPED, n_csplayer.c, 0x11b);
|
||||||
if (seqp->bank)
|
seqp->bank = seqp->nextEvent.msg.spbank.bank;
|
||||||
__n_initFromBank((ALSeqPlayer *)seqp, seqp->bank);
|
__n_initFromBank((ALSeqPlayer *)seqp, seqp->bank);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (AL_SEQP_BANK_EVT):
|
/* sct 11/6/95 - these events should now be handled by __CSPHandleNextSeqEvent */
|
||||||
//assert(seqp->state == AL_STOPPED); /* Must be fully stopped to change banks. */
|
case (AL_SEQ_END_EVT):
|
||||||
((seqp->state == AL_STOPPED)?((void)0):func_8033F000("seqp->state == AL_STOPPED","n_csplayer.c", 283));
|
case (AL_TEMPO_EVT):
|
||||||
|
case (AL_SEQ_MIDI_EVT):
|
||||||
seqp->bank = seqp->nextEvent.msg.spbank.bank;
|
matching_assert(FALSE, n_csplayer.c, 0x128);
|
||||||
__n_initFromBank((ALSeqPlayer *)seqp, seqp->bank);
|
break;
|
||||||
break;
|
}
|
||||||
|
seqp->nextDelta = alEvtqNextEvent(&seqp->evtq, &seqp->nextEvent);
|
||||||
/* sct 11/6/95 - these events should now be handled by __n_CSPHandleNextSeqEvent */
|
|
||||||
case (AL_SEQ_END_EVT):
|
|
||||||
case (AL_TEMPO_EVT):
|
|
||||||
case (AL_SEQ_MIDI_EVT):
|
|
||||||
//assert(FALSE);
|
|
||||||
((FALSE)?((void)0):func_8033F000("FALSE","n_csplayer.c", 296));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
seqp->nextDelta = alEvtqNextEvent(&seqp->evtq, &seqp->nextEvent);
|
|
||||||
|
|
||||||
} while (seqp->nextDelta == 0);
|
} while (seqp->nextDelta == 0);
|
||||||
|
|
||||||
|
@ -304,8 +344,7 @@ static ALMicroTime __n_CSPVoiceHandler(void *node)
|
||||||
is no target sequence.
|
is no target sequence.
|
||||||
sct 11/7/95
|
sct 11/7/95
|
||||||
*/
|
*/
|
||||||
/*DONE*/
|
void func_8025D7C0(ALCSPlayer *seqp)
|
||||||
void __n_CSPPostNextSeqEvent(N_ALCSPlayer *seqp)
|
|
||||||
{
|
{
|
||||||
ALEvent evt;
|
ALEvent evt;
|
||||||
s32 deltaTicks;
|
s32 deltaTicks;
|
||||||
|
@ -330,7 +369,7 @@ void __n_CSPPostNextSeqEvent(N_ALCSPlayer *seqp)
|
||||||
sct 11/7/95
|
sct 11/7/95
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
__n_CSPHandleNextSeqEvent(N_ALCSPlayer *seqp)
|
__CSPHandleNextSeqEvent(ALCSPlayer *seqp)
|
||||||
{
|
{
|
||||||
ALEvent evt;
|
ALEvent evt;
|
||||||
|
|
||||||
|
@ -338,19 +377,19 @@ __n_CSPHandleNextSeqEvent(N_ALCSPlayer *seqp)
|
||||||
if (seqp->target == NULL)
|
if (seqp->target == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
alCSeqNextEvent(seqp->target, &evt);
|
n_alCSeqNextEvent(seqp->target, &evt);
|
||||||
|
|
||||||
switch (evt.type)
|
switch (evt.type)
|
||||||
{
|
{
|
||||||
case AL_SEQ_MIDI_EVT:
|
case AL_SEQ_MIDI_EVT:
|
||||||
__n_CSPHandleMIDIMsg(seqp, &evt);
|
__n_CSPHandleMIDIMsg(seqp, &evt);
|
||||||
__n_CSPPostNextSeqEvent(seqp);
|
func_8025D7C0(seqp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AL_TEMPO_EVT:
|
case AL_TEMPO_EVT:
|
||||||
__n_CSPHandleMetaMsg(seqp, &evt);
|
__CSPHandleMetaMsg(seqp, &evt);
|
||||||
__n_CSPPostNextSeqEvent(seqp);
|
func_8025D7C0(seqp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AL_SEQ_END_EVT:
|
case AL_SEQ_END_EVT:
|
||||||
seqp->state = AL_STOPPING;
|
seqp->state = AL_STOPPING;
|
||||||
|
@ -361,67 +400,60 @@ __n_CSPHandleNextSeqEvent(N_ALCSPlayer *seqp)
|
||||||
case AL_TRACK_END:
|
case AL_TRACK_END:
|
||||||
case AL_CSP_LOOPSTART:
|
case AL_CSP_LOOPSTART:
|
||||||
case AL_CSP_LOOPEND:
|
case AL_CSP_LOOPEND:
|
||||||
__n_CSPPostNextSeqEvent(seqp);
|
func_8025D7C0(seqp);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
//assert(FALSE); /* Sequence event type not supported. */
|
matching_assert(FALSE, n_csplayer.c, 0x161); /* Sequence event type not supported. */
|
||||||
((FALSE)?((void)0):func_8033F000("FALSE","n_csplayer.c", 353));
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void __n_CSPHandleMIDIMsg(N_ALCSPlayer *seqp, ALEvent *event)
|
||||||
static void __n_CSPHandleMIDIMsg(N_ALCSPlayer *seqp, N_ALEvent *event)
|
|
||||||
{
|
{
|
||||||
N_ALVoice *voice;
|
N_ALVoice *voice;
|
||||||
N_ALVoiceState *vs;
|
N_ALVoiceState *vs;
|
||||||
s32 status;
|
s32 status;
|
||||||
u8 chan;
|
u8 chan;
|
||||||
u8 key;
|
|
||||||
u8 vel;
|
|
||||||
u8 byte1;
|
u8 byte1;
|
||||||
u8 byte2;
|
u8 new_var;
|
||||||
|
u8 byte2;
|
||||||
ALMIDIEvent *midi = &event->msg.midi;
|
ALMIDIEvent *midi = &event->msg.midi;
|
||||||
s16 vol;
|
s16 vol;
|
||||||
N_ALEvent evt;
|
|
||||||
ALMicroTime deltaTime;
|
|
||||||
N_ALVoiceState *vstate;
|
N_ALVoiceState *vstate;
|
||||||
|
ALEvent evt;
|
||||||
|
ALMicroTime deltaTime;
|
||||||
ALPan pan;
|
ALPan pan;
|
||||||
ALFxRef fxref;
|
ALFxRef fxref;
|
||||||
|
|
||||||
|
|
||||||
status = midi->status & AL_MIDI_StatusMask;
|
status = midi->status & AL_MIDI_StatusMask;
|
||||||
|
new_var = midi->byte1;
|
||||||
chan = midi->status & AL_MIDI_ChannelMask;
|
chan = midi->status & AL_MIDI_ChannelMask;
|
||||||
byte1 = key = midi->byte1;
|
byte1 = new_var;
|
||||||
byte2 = vel = midi->byte2;
|
byte2 = midi->byte2;
|
||||||
|
if(status == AL_MIDI_ControlChange){
|
||||||
if(status == AL_MIDI_ChannelModeSelect){
|
if(byte1 == 0x7E) {
|
||||||
if(byte1 == 0x7E){
|
N_ALVoiceState *vstate2;
|
||||||
seqp->chanMask &= ~(1 << byte2);
|
// vs = seqp->vAllocHead;
|
||||||
vstate = seqp->vAllocHead;
|
seqp->chanMask &= ~(1 << byte2);
|
||||||
while(vs){
|
|
||||||
if(vstate->channel == byte2){
|
//vs NOT being initialied seems weird
|
||||||
__n_seqpReleaseVoice(seqp, &vstate->voice.node.next, vstate->sound->envelope->releaseTime);
|
for (vstate2 = seqp->vAllocHead; vs != 0; vs = vs->next)
|
||||||
}
|
{
|
||||||
vs = vs->next;
|
if (vstate2->channel == byte2)
|
||||||
}
|
__n_seqpReleaseVoice((ALSeqPlayer*)seqp, &vstate2->voice, vstate2->sound->envelope->releaseTime);
|
||||||
return;
|
}
|
||||||
}else if(byte1 == 0x7F){
|
return;
|
||||||
seqp->chanMask |= (1 << byte2);
|
} else if(byte1 == 0x7F){
|
||||||
return;
|
seqp->chanMask |= 1 << byte2;
|
||||||
}
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if ((!((1 << chan) & seqp->chanMask) && (status == 0x90))) return;
|
||||||
if(!((seqp->chanMask & (1 << chan)) || status != AL_MIDI_NoteOn))
|
|
||||||
return;
|
|
||||||
|
|
||||||
//L8025DB08
|
|
||||||
switch (status)
|
switch (status)
|
||||||
{
|
{
|
||||||
case (AL_MIDI_NoteOn):
|
case (AL_MIDI_NoteOn):
|
||||||
|
if (byte2 != 0) /* a real note on */
|
||||||
if (vel != 0) /* a real note on */
|
|
||||||
{
|
{
|
||||||
ALVoiceConfig config;
|
ALVoiceConfig config;
|
||||||
ALSound *sound;
|
ALSound *sound;
|
||||||
|
@ -431,28 +463,29 @@ static void __n_CSPHandleMIDIMsg(N_ALCSPlayer *seqp, N_ALEvent *event)
|
||||||
void *oscState;
|
void *oscState;
|
||||||
ALInstrument *inst;
|
ALInstrument *inst;
|
||||||
|
|
||||||
/* If we're not playing, don't process note ons. */
|
/* If we're not playing, don't process note ons. */
|
||||||
if (seqp->state != AL_PLAYING)
|
if (seqp->state != AL_PLAYING)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
sound = __n_lookupSoundQuick((ALSeqPlayer*)seqp, key, vel, chan);
|
sound = __n_lookupSoundQuick((ALSeqPlayer*)seqp, byte1, byte2, chan);
|
||||||
ALFlagFailIf(!sound, seqp->debugFlags & NO_SOUND_ERR_MASK,
|
ALFlagFailIf(!sound, seqp->debugFlags & NO_SOUND_ERR_MASK,
|
||||||
ERR_ALSEQP_NO_SOUND);
|
ERR_ALSEQP_NO_SOUND);
|
||||||
|
|
||||||
config.priority = seqp->chanState[chan].priority;
|
config.priority = seqp->chanState[chan].priority;
|
||||||
config.fxBus = 0;
|
config.fxBus = 0;
|
||||||
config.unityPitch = 0;
|
config.unityPitch = 0;
|
||||||
|
|
||||||
vstate = __n_mapVoice((ALSeqPlayer*)seqp, key, vel, chan);
|
vstate = __n_mapVoice((ALSeqPlayer*)seqp, byte1, byte2, chan);
|
||||||
ALFlagFailIf(!vstate, seqp->debugFlags & NO_VOICE_ERR_MASK,
|
ALFlagFailIf(!vstate, seqp->debugFlags & NO_VOICE_ERR_MASK,
|
||||||
ERR_ALSEQP_NO_VOICE );
|
ERR_ALSEQP_NO_VOICE );
|
||||||
|
|
||||||
voice = &vstate->voice;
|
voice = &vstate->voice;
|
||||||
|
|
||||||
n_alSynAllocVoice(voice, &config);
|
n_alSynAllocVoice(voice, &config);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* set up the voice state structure
|
* set up the voice state structure
|
||||||
*/
|
*/
|
||||||
vstate->sound = sound;
|
vstate->sound = sound;
|
||||||
vstate->envPhase = AL_PHASE_ATTACK;
|
vstate->envPhase = AL_PHASE_ATTACK;
|
||||||
if (seqp->chanState[chan].sustain > AL_SUSTAIN)
|
if (seqp->chanState[chan].sustain > AL_SUSTAIN)
|
||||||
|
@ -460,7 +493,7 @@ static void __n_CSPHandleMIDIMsg(N_ALCSPlayer *seqp, N_ALEvent *event)
|
||||||
else
|
else
|
||||||
vstate->phase = AL_PHASE_NOTEON;
|
vstate->phase = AL_PHASE_NOTEON;
|
||||||
|
|
||||||
cents = (key - sound->keyMap->keyBase) * 100
|
cents = (byte1 - sound->keyMap->keyBase) * 100
|
||||||
+ sound->keyMap->detune;
|
+ sound->keyMap->detune;
|
||||||
|
|
||||||
vstate->pitch = alCents2Ratio(cents);
|
vstate->pitch = alCents2Ratio(cents);
|
||||||
|
@ -469,8 +502,8 @@ static void __n_CSPHandleMIDIMsg(N_ALCSPlayer *seqp, N_ALEvent *event)
|
||||||
sound->envelope->attackTime;
|
sound->envelope->attackTime;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* setup tremelo and vibrato if active
|
* setup tremelo and vibrato if active
|
||||||
*/
|
*/
|
||||||
vstate->flags = 0;
|
vstate->flags = 0;
|
||||||
inst = seqp->chanState[chan].instrument;
|
inst = seqp->chanState[chan].instrument;
|
||||||
|
|
||||||
|
@ -480,7 +513,7 @@ static void __n_CSPHandleMIDIMsg(N_ALCSPlayer *seqp, N_ALEvent *event)
|
||||||
if(seqp->initOsc)
|
if(seqp->initOsc)
|
||||||
{
|
{
|
||||||
deltaTime = (*seqp->initOsc)(&oscState,&oscValue,inst->tremType,
|
deltaTime = (*seqp->initOsc)(&oscState,&oscValue,inst->tremType,
|
||||||
inst->tremRate,inst->tremDepth,inst->tremDelay);
|
inst->tremRate,inst->tremDepth,inst->tremDelay);
|
||||||
|
|
||||||
if(deltaTime) /* a deltaTime of zero means don't run osc */
|
if(deltaTime) /* a deltaTime of zero means don't run osc */
|
||||||
{
|
{
|
||||||
|
@ -500,7 +533,7 @@ static void __n_CSPHandleMIDIMsg(N_ALCSPlayer *seqp, N_ALEvent *event)
|
||||||
if(seqp->initOsc)
|
if(seqp->initOsc)
|
||||||
{
|
{
|
||||||
deltaTime = (*seqp->initOsc)(&oscState,&oscValue,inst->vibType,
|
deltaTime = (*seqp->initOsc)(&oscState,&oscValue,inst->vibType,
|
||||||
inst->vibRate,inst->vibDepth,inst->vibDelay);
|
inst->vibRate,inst->vibDepth,inst->vibDelay);
|
||||||
|
|
||||||
if(deltaTime) /* a deltaTime of zero means don't run osc. */
|
if(deltaTime) /* a deltaTime of zero means don't run osc. */
|
||||||
{
|
{
|
||||||
|
@ -516,8 +549,8 @@ static void __n_CSPHandleMIDIMsg(N_ALCSPlayer *seqp, N_ALEvent *event)
|
||||||
vstate->vibrato = oscValue; /* will default if not changed by initOsc */
|
vstate->vibrato = oscValue; /* will default if not changed by initOsc */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* calculate the note on parameters
|
* calculate the note on parameters
|
||||||
*/
|
*/
|
||||||
pitch = vstate->pitch * seqp->chanState[chan].pitchBend *
|
pitch = vstate->pitch * seqp->chanState[chan].pitchBend *
|
||||||
vstate->vibrato;
|
vstate->vibrato;
|
||||||
fxmix = seqp->chanState[chan].fxmix;
|
fxmix = seqp->chanState[chan].fxmix;
|
||||||
|
@ -526,10 +559,10 @@ static void __n_CSPHandleMIDIMsg(N_ALCSPlayer *seqp, N_ALEvent *event)
|
||||||
deltaTime = sound->envelope->attackTime;
|
deltaTime = sound->envelope->attackTime;
|
||||||
|
|
||||||
n_alSynStartVoiceParams(voice, sound->wavetable,
|
n_alSynStartVoiceParams(voice, sound->wavetable,
|
||||||
pitch, vol, pan, fxmix, deltaTime);
|
pitch, vol, pan, fxmix, deltaTime);
|
||||||
/*
|
/*
|
||||||
* set up callbacks for envelope
|
* set up callbacks for envelope
|
||||||
*/
|
*/
|
||||||
evt.type = AL_SEQP_ENV_EVT;
|
evt.type = AL_SEQP_ENV_EVT;
|
||||||
evt.msg.vol.voice = voice;
|
evt.msg.vol.voice = voice;
|
||||||
evt.msg.vol.vol = sound->envelope->decayVolume;
|
evt.msg.vol.vol = sound->envelope->decayVolume;
|
||||||
|
@ -540,11 +573,11 @@ static void __n_CSPHandleMIDIMsg(N_ALCSPlayer *seqp, N_ALEvent *event)
|
||||||
if(midi->duration)
|
if(midi->duration)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* set up note off evt. if no duration don't do this
|
* set up note off evt. if no duration don't do this
|
||||||
*/
|
*/
|
||||||
evt.type = AL_CSP_NOTEOFF_EVT;
|
evt.type = AL_CSP_NOTEOFF_EVT;
|
||||||
evt.msg.midi.status = chan | AL_MIDI_NoteOff;
|
evt.msg.midi.status = chan | AL_MIDI_NoteOff;
|
||||||
evt.msg.midi.byte1 = key;
|
evt.msg.midi.byte1 = byte1;
|
||||||
evt.msg.midi.byte2 = 0; /* not needed ? */
|
evt.msg.midi.byte2 = 0; /* not needed ? */
|
||||||
deltaTime = seqp->uspt * midi->duration;
|
deltaTime = seqp->uspt * midi->duration;
|
||||||
|
|
||||||
|
@ -556,15 +589,15 @@ static void __n_CSPHandleMIDIMsg(N_ALCSPlayer *seqp, N_ALEvent *event)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NOTE: intentional fall-through for note on with zero
|
* NOTE: intentional fall-through for note on with zero
|
||||||
* velocity (Should never happen with compact midi sequence,
|
* velocity (Should never happen with compact midi sequence,
|
||||||
* but could happen with real time midi.)
|
* but could happen with real time midi.)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
case (AL_MIDI_NoteOff):
|
case (AL_MIDI_NoteOff):
|
||||||
vstate = __n_lookupVoice((ALSeqPlayer*)seqp, key, chan);
|
vstate = __n_lookupVoice((ALSeqPlayer*)seqp, byte1, chan);
|
||||||
ALFlagFailIf(!vstate, seqp->debugFlags & NOTE_OFF_ERR_MASK,
|
ALFlagFailIf(!vstate, seqp->debugFlags & NOTE_OFF_ERR_MASK,
|
||||||
ERR_ALSEQP_OFF_VOICE );
|
ERR_ALSEQP_OFF_VOICE );
|
||||||
|
|
||||||
if (vstate->phase == AL_PHASE_SUSTAIN)
|
if (vstate->phase == AL_PHASE_SUSTAIN)
|
||||||
vstate->phase = AL_PHASE_SUSTREL;
|
vstate->phase = AL_PHASE_SUSTREL;
|
||||||
|
@ -572,18 +605,18 @@ static void __n_CSPHandleMIDIMsg(N_ALCSPlayer *seqp, N_ALEvent *event)
|
||||||
{
|
{
|
||||||
vstate->phase = AL_PHASE_RELEASE;
|
vstate->phase = AL_PHASE_RELEASE;
|
||||||
__n_seqpReleaseVoice((ALSeqPlayer*)seqp, &vstate->voice,
|
__n_seqpReleaseVoice((ALSeqPlayer*)seqp, &vstate->voice,
|
||||||
vstate->sound->envelope->releaseTime);
|
vstate->sound->envelope->releaseTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (AL_MIDI_PolyKeyPressure):
|
case (AL_MIDI_PolyKeyPressure):
|
||||||
/*
|
/*
|
||||||
* Aftertouch per key (hardwired to volume). Note that
|
* Aftertouch per key (hardwired to volume). Note that
|
||||||
* aftertouch affects only notes that are already
|
* aftertouch affects only notes that are already
|
||||||
* sounding.
|
* sounding.
|
||||||
*/
|
*/
|
||||||
vstate = __n_lookupVoice((ALSeqPlayer*)seqp, key, chan);
|
vstate = __n_lookupVoice((ALSeqPlayer*)seqp, byte1, chan);
|
||||||
ALFailIf(!vstate, ERR_ALSEQP_POLY_VOICE );
|
ALFailIf(!vstate, ERR_ALSEQP_POLY_VOICE );
|
||||||
|
|
||||||
vstate->velocity = byte2;
|
vstate->velocity = byte2;
|
||||||
|
@ -594,10 +627,10 @@ static void __n_CSPHandleMIDIMsg(N_ALCSPlayer *seqp, N_ALEvent *event)
|
||||||
|
|
||||||
case (AL_MIDI_ChannelPressure):
|
case (AL_MIDI_ChannelPressure):
|
||||||
/*
|
/*
|
||||||
* Aftertouch per channel (hardwired to volume). Note that
|
* Aftertouch per channel (hardwired to volume). Note that
|
||||||
* aftertouch affects only notes that are already
|
* aftertouch affects only notes that are already
|
||||||
* sounding.
|
* sounding.
|
||||||
*/
|
*/
|
||||||
for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) {
|
for (vs = seqp->vAllocHead; vs != 0; vs = vs->next) {
|
||||||
if (vs->channel == chan) {
|
if (vs->channel == chan) {
|
||||||
vs->velocity = byte1;
|
vs->velocity = byte1;
|
||||||
|
@ -635,6 +668,7 @@ static void __n_CSPHandleMIDIMsg(N_ALCSPlayer *seqp, N_ALEvent *event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case (0x7D):
|
case (0x7D):
|
||||||
seqp->chanState[chan].unkA = byte2;
|
seqp->chanState[chan].unkA = byte2;
|
||||||
for (vs = seqp->vAllocHead; vs != 0; vs = vs->next)
|
for (vs = seqp->vAllocHead; vs != 0; vs = vs->next)
|
||||||
|
@ -648,7 +682,7 @@ static void __n_CSPHandleMIDIMsg(N_ALCSPlayer *seqp, N_ALEvent *event)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case (AL_MIDI_PRIORITY_CTRL):
|
case (AL_MIDI_PRIORITY_CTRL):
|
||||||
/* leave current voices where they are */
|
/* leave current voices where they are */
|
||||||
seqp->chanState[chan].priority = byte2;
|
seqp->chanState[chan].priority = byte2;
|
||||||
break;
|
break;
|
||||||
case (AL_MIDI_SUSTAIN_CTRL):
|
case (AL_MIDI_SUSTAIN_CTRL):
|
||||||
|
@ -660,16 +694,16 @@ static void __n_CSPHandleMIDIMsg(N_ALCSPlayer *seqp, N_ALEvent *event)
|
||||||
if ( byte2 > AL_SUSTAIN )
|
if ( byte2 > AL_SUSTAIN )
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* sustain pedal down
|
* sustain pedal down
|
||||||
*/
|
*/
|
||||||
if (vs->phase == AL_PHASE_NOTEON)
|
if (vs->phase == AL_PHASE_NOTEON)
|
||||||
vs->phase = AL_PHASE_SUSTAIN;
|
vs->phase = AL_PHASE_SUSTAIN;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* sustain pedal up
|
* sustain pedal up
|
||||||
*/
|
*/
|
||||||
if (vs->phase == AL_PHASE_SUSTAIN)
|
if (vs->phase == AL_PHASE_SUSTAIN)
|
||||||
vs->phase = AL_PHASE_NOTEON;
|
vs->phase = AL_PHASE_NOTEON;
|
||||||
|
|
||||||
|
@ -677,8 +711,8 @@ static void __n_CSPHandleMIDIMsg(N_ALCSPlayer *seqp, N_ALEvent *event)
|
||||||
{
|
{
|
||||||
vs->phase = AL_PHASE_RELEASE;
|
vs->phase = AL_PHASE_RELEASE;
|
||||||
__n_seqpReleaseVoice((ALSeqPlayer*)seqp,
|
__n_seqpReleaseVoice((ALSeqPlayer*)seqp,
|
||||||
&vs->voice,
|
&vs->voice,
|
||||||
vs->sound->envelope->releaseTime);
|
vs->sound->envelope->releaseTime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -692,39 +726,52 @@ static void __n_CSPHandleMIDIMsg(N_ALCSPlayer *seqp, N_ALEvent *event)
|
||||||
n_alSynSetFXMix(&vs->voice, byte2);
|
n_alSynSetFXMix(&vs->voice, byte2);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case (0x6A):
|
case 0x6A: /* switch 2 */
|
||||||
case (0x6B):
|
case 0x6B: /* switch 2 */
|
||||||
case (0x6C):
|
case 0x6C: /* switch 2 */
|
||||||
case (0x6D):
|
case 0x6D: /* switch 2 */
|
||||||
case (0x6E):
|
case 0x6E: /* switch 2 */
|
||||||
case (0x6F):
|
case 0x6F: /* switch 2 */
|
||||||
case (0x70):
|
case 0x70: /* switch 2 */
|
||||||
case (0x71):
|
case 0x71: /* switch 2 */
|
||||||
case (0x72):
|
case 0x72: /* switch 2 */
|
||||||
case (0x73):
|
case 0x73: /* switch 2 */
|
||||||
case (0x74):
|
case 0x74: /* switch 2 */
|
||||||
case (0x75):
|
case 0x75: /* switch 2 */
|
||||||
case (0x76):
|
case 0x76: /* switch 2 */
|
||||||
case (0x77):
|
case 0x77: /* switch 2 */
|
||||||
func_80250104(seqp->target,key, chan);
|
func_80250104(seqp->target, byte1, chan);
|
||||||
break;
|
break;
|
||||||
|
/* case (AL_MIDI_FX_CTRL_0):
|
||||||
|
case (AL_MIDI_FX_CTRL_1):
|
||||||
|
case (AL_MIDI_FX_CTRL_2):
|
||||||
|
case (AL_MIDI_FX_CTRL_3):
|
||||||
|
case (AL_MIDI_FX_CTRL_4):
|
||||||
|
case (AL_MIDI_FX_CTRL_5):
|
||||||
|
case (AL_MIDI_FX_CTRL_6):
|
||||||
|
case (AL_MIDI_FX_CTRL_7):
|
||||||
|
fxref = alSynGetFXRef(seqp->drvr, 0, 0);
|
||||||
|
if (fxref)
|
||||||
|
alSynSetFXParam(seqp->drvr, fxref, (s16)byte1, (void *)byte2);
|
||||||
|
break;
|
||||||
|
case (AL_MIDI_FX3_CTRL): */
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case (AL_MIDI_ProgramChange):
|
case (AL_MIDI_ProgramChange):
|
||||||
/* sct 1/16/96 - We must have a valid bank in order to process the program change. */
|
/* sct 1/16/96 - We must have a valid bank in order to process the program change. */
|
||||||
//assert(seqp->bank != NULL);
|
matching_assert(seqp->bank != NULL, n_csplayer.c, 0x2cb);
|
||||||
((seqp->bank != NULL)?((void)0):func_8033F000("seqp->bank != NULL", "n_csplayer.c", 715));
|
|
||||||
if (key < seqp->bank->instCount)
|
if (byte1 < seqp->bank->instCount)
|
||||||
{
|
{
|
||||||
ALInstrument *inst = seqp->bank->instArray[key];
|
ALInstrument *inst = seqp->bank->instArray[byte1];
|
||||||
__n_setInstChanState((ALSeqPlayer*)seqp, inst, chan); /* sct 11/6/95 */
|
__n_setInstChanState((ALSeqPlayer*)seqp, inst, chan); /* sct 11/6/95 */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
__osError(ERR_ALSEQPINVALIDPROG, 2, key, seqp->bank->instCount);
|
__osError(ERR_ALSEQPINVALIDPROG, 2, byte1, seqp->bank->instCount);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -747,7 +794,7 @@ static void __n_CSPHandleMIDIMsg(N_ALCSPlayer *seqp, N_ALEvent *event)
|
||||||
for (vs = seqp->vAllocHead; vs != 0; vs = vs->next)
|
for (vs = seqp->vAllocHead; vs != 0; vs = vs->next)
|
||||||
if (vs->channel == chan)
|
if (vs->channel == chan)
|
||||||
n_alSynSetPitch(&vs->voice,
|
n_alSynSetPitch(&vs->voice,
|
||||||
vs->pitch * bendRatio * vs->vibrato);
|
vs->pitch * bendRatio * vs->vibrato);
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -760,8 +807,7 @@ static void __n_CSPHandleMIDIMsg(N_ALCSPlayer *seqp, N_ALEvent *event)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*Done*/
|
static void __CSPHandleMetaMsg(ALCSPlayer *seqp, ALEvent *event)
|
||||||
static void __n_CSPHandleMetaMsg(N_ALCSPlayer *seqp, N_ALEvent *event)
|
|
||||||
{
|
{
|
||||||
ALTempoEvent *tevt = &event->msg.tempo;
|
ALTempoEvent *tevt = &event->msg.tempo;
|
||||||
ALEvent evt;
|
ALEvent evt;
|
||||||
|
@ -778,7 +824,7 @@ static void __n_CSPHandleMetaMsg(N_ALCSPlayer *seqp, N_ALEvent *event)
|
||||||
{
|
{
|
||||||
oldUspt = seqp->uspt;
|
oldUspt = seqp->uspt;
|
||||||
tempo = (tevt->byte1 << 16) | (tevt->byte2 << 8) | (tevt->byte3 << 0);
|
tempo = (tevt->byte1 << 16) | (tevt->byte2 << 8) | (tevt->byte3 << 0);
|
||||||
__n_setUsptFromTempo (seqp, seqp->target, (f32)tempo); /* sct 1/8/96 */
|
__setUsptFromTempo (seqp, (f32)tempo); /* sct 1/8/96 */
|
||||||
|
|
||||||
thisNode = (ALEventListItem*)seqp->evtq.allocList.next;
|
thisNode = (ALEventListItem*)seqp->evtq.allocList.next;
|
||||||
while(thisNode)
|
while(thisNode)
|
||||||
|
@ -814,18 +860,18 @@ static void __n_CSPHandleMetaMsg(N_ALCSPlayer *seqp, N_ALEvent *event)
|
||||||
nextNode = (ALEventListItem*)thisNode->node.next;
|
nextNode = (ALEventListItem*)thisNode->node.next;
|
||||||
ticks = thisNode->delta/oldUspt;
|
ticks = thisNode->delta/oldUspt;
|
||||||
thisNode->delta = ticks * seqp->uspt;
|
thisNode->delta = ticks * seqp->uspt;
|
||||||
__n_CSPRepostEvent(&seqp->evtq,thisNode);
|
__CSPRepostEvent(&seqp->evtq,thisNode);
|
||||||
thisNode = nextNode;
|
thisNode = nextNode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*Done*/
|
|
||||||
static void __n_CSPRepostEvent(ALEventQueue *evtq, N_ALEventListItem *item)
|
static void __CSPRepostEvent(ALEventQueue *evtq, ALEventListItem *item)
|
||||||
{
|
{
|
||||||
OSIntMask mask;
|
OSIntMask mask;
|
||||||
ALLink *node;
|
ALLink *node;
|
||||||
N_ALEventListItem *nextItem;
|
ALEventListItem *nextItem;
|
||||||
|
|
||||||
mask = osSetIntMask(OS_IM_NONE);
|
mask = osSetIntMask(OS_IM_NONE);
|
||||||
|
|
||||||
|
@ -838,7 +884,7 @@ static void __n_CSPRepostEvent(ALEventQueue *evtq, N_ALEventListItem *item)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
nextItem = (N_ALEventListItem *)node->next;
|
nextItem = (ALEventListItem *)node->next;
|
||||||
if (item->delta < nextItem->delta)
|
if (item->delta < nextItem->delta)
|
||||||
{
|
{
|
||||||
nextItem->delta -= item->delta;
|
nextItem->delta -= item->delta;
|
||||||
|
@ -860,11 +906,10 @@ static void __n_CSPRepostEvent(ALEventQueue *evtq, N_ALEventListItem *item)
|
||||||
Compact sequence player needs its own version of this routine
|
Compact sequence player needs its own version of this routine
|
||||||
since the ALCSeq's qnpt field is at a different offset.
|
since the ALCSeq's qnpt field is at a different offset.
|
||||||
*/
|
*/
|
||||||
/* DONE */
|
static void __setUsptFromTempo (ALCSPlayer *seqp, f32 tempo)
|
||||||
static void __n_setUsptFromTempo(N_ALCSPlayer *seqp, ALCSeq *target, f32 tempo)
|
|
||||||
{
|
{
|
||||||
if (target)
|
if (seqp->target)
|
||||||
seqp->uspt = (s32)((f32)tempo * target->qnpt);
|
seqp->uspt = (s32)((f32)tempo * seqp->target->qnpt);
|
||||||
else
|
else
|
||||||
seqp->uspt = 488; /* This is the initial value set by alSeqpNew. */
|
seqp->uspt = 488; /* This is the initial value set by alSeqpNew. */
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue