stoneage8.5/石器时代8.5客户端最新源代码/石器源码/system/t_music.cpp
2020-06-23 15:53:23 +08:00

3671 lines
95 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "windows.h"
#include<direct.h>
#include "../systeminc/version.h"
#include "../systeminc/process.h"
#include "../systeminc/t_music.h"
#include "../systeminc/handletime.h"
#include "../systeminc/savedata.h"
#include "../systeminc/system.h"
#define ACTIVE 1
//#include "system.h"
//#include "../oft/vg410.h"
extern DWORD NowTime;
//extern double NowTime; // ???????
/*???????????*/
#define DEBUG_ON 1
#define THREAD_ON 1
#define MODE98 0
#define CLASS_UP 1
#define VOICE_KILL_ON 0
//噙秞梓祩
BOOL MuteFlag = FALSE;
typedef struct{
int name;
int tone_no;
int volume;
int note_no;
int release_cnt;
int release_spd;
int lfo_h;
int lfo_m;
int lfo_s;
int lfo_s_cnt;
int lfo_s_ang;
int pan;
int loop_flg;
int delay_cnt;
long freq;
} VOICE_EQU;
#define MAX_ENV 20
typedef struct{
int voice_address; //???????????????
int tone;
int count;
int distance;
int volume;
int volume_old;
int side;
int panpot;
int panpot_old;
} ENVIRONMENT_EQU;
ENVIRONMENT_EQU env_tbl[MAX_ENV];
#define DEBUG 0
#define MY_TIMER 1
#define VOICE_MAX 64
#define TRACK_MAX 32
//#define STRICT
#include <windows.h>
#include <dsound.h>
#include <stdio.h>
#include <winuser.h>
#include <winbase.h>
#include "../systeminc/math2.h"
#include <math.h>
#include "../systeminc/main.h"
#include <tchar.h>
#include <crtdbg.h>
#include <mmsystem.h>
extern int MessageBoxNew(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType);
#define RELEASE(x) if(x){x->Release();x=NULL;}
#define LOG(a,b) (log((float)b)/log((float)a))
static int mes_flg=0;
#if THREAD_ON
int thread_flg=0;
#endif
int dsound_flg=0;
/*-------------------------------------------
??阪?
--------------------------------------------*/
LPDIRECTSOUND pDSound = NULL;
LPDIRECTSOUNDBUFFER pDSPrimary = NULL;
LONG primaryVolume;
LONG primaryPan;
LONG primaryFrequency;
LPDIRECTSOUNDBUFFER pDSData_tone[TONE_MAX + 1];
LPDIRECTSOUNDBUFFER pDSData_stream;
LPDIRECTSOUNDBUFFER pDSData[VOICE_MAX];
BOOL dataPlay[VOICE_MAX];
int dataVolume[TRACK_MAX];
int dataPan[TRACK_MAX];
LONG dataFrequency[TRACK_MAX];
VOICE_EQU voice[VOICE_MAX];
TONE_EQU tone_tbl[TONE_MAX];
int tone_max_buf;
#if VOICE_KILL_ON
int voice_kill_buf[VOICE_MAX];
int voice_kill_point;
#endif
int t_music_playing_flg = 0;
int t_music_fade_flg = 0;
int t_music_fade_vol;
int draw_map_bgm_flg = 0;
static int map_bgm_vct_no = 0;
int map_bgm_no = 0;
/*-------------------------------------------
Wave?????????
--------------------------------------------*/
BOOL LoadWave(
LPCTSTR lpName, // Wave????
WAVEFORMATEX* (&pWaveHeader), // WAVEFORMATEX?﹨▍??????
BYTE* (&pbWaveData), // ??????????????
DWORD &cbWaveSize) // ????????????
{
pWaveHeader = NULL; // WAVEFORMATEX?﹨▍??????
pbWaveData = NULL; // ??????????????
cbWaveSize = 0; // ????????????
const char c_szWAV[] = "WAVE"; // ???????Wave????????"WAVE"???
// ???????????????????
HRSRC hResInfo = FindResource(NULL, lpName, c_szWAV);
if(hResInfo == NULL)
return FALSE;
HGLOBAL hResData = LoadResource(NULL, hResInfo);
if(hResData == NULL)
return FALSE;
void *pvRes = LockResource(hResData);
if(pvRes == NULL)
return FALSE;
// ???????????????????????????????????台??
DWORD *pdw = (DWORD *)pvRes;
DWORD *pdwEnd;
DWORD dwRiff = *pdw++;
DWORD dwLength = *pdw++;
DWORD dwType = *pdw++;
if (dwRiff != mmioFOURCC('R', 'I', 'F', 'F'))
return FALSE; // ???????RIFF?????????
if (dwType != mmioFOURCC('W', 'A', 'V', 'E'))
return FALSE; // ???????Wave?????????
pdwEnd = (DWORD *)((BYTE *)pdw + dwLength-4);
while (pdw < pdwEnd)
{
dwType = *pdw++;
dwLength = *pdw++;
switch (dwType)
{
case mmioFOURCC('f', 'm', 't', ' '):
if (pWaveHeader == NULL)
{
if (dwLength < sizeof(WAVEFORMAT))
return FALSE; // ?????????Wave?????????
pWaveHeader = (WAVEFORMATEX *)pdw;
}
break;
case mmioFOURCC('d', 'a', 't', 'a'):
if ((pbWaveData == NULL) || (!cbWaveSize))
{
pbWaveData = (LPBYTE)pdw;
cbWaveSize = dwLength;
}
break;
}
if(pWaveHeader && (pbWaveData != NULL) && cbWaveSize)
break;
pdw = (DWORD *)((BYTE *)pdw + ((dwLength+1)&~1));
}
if(pdwEnd <= pdw)
return FALSE; // ?????????Wave?????????
// Wave???台?
return TRUE;
}
/*-------------------------------------------
????????????????????
--------------------------------------------*/
BOOL CreateSoundData(LPCSTR pName, LPDIRECTSOUNDBUFFER &pDSData)
{
// ??????Wave????????
WAVEFORMATEX *pWaveHeader = NULL; // WAVEFORMATEX?﹨▍??????
BYTE *pbWaveData = NULL; // ??????????????
DWORD cbWaveSize = 0; // ????????????
if(!LoadWave(pName, pWaveHeader, pbWaveData, cbWaveSize))
{
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "黍Wave腔訧蹋囮啖ㄐ", "Error", MB_OK);
#endif
return FALSE;
}
// ??????????????
DSBUFFERDESC dsbdesc;
HRESULT hr;
// DSBUFFERDESC?﹨▍? 叉
ZeroMemory(&dsbdesc, sizeof(DSBUFFERDESC));
dsbdesc.dwSize = sizeof(DSBUFFERDESC);
// ??????????????
#if ACTIVE
dsbdesc.dwFlags = DSBCAPS_STATIC | /*DSBCAPS_CTRLDEFAULT*/DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY | DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS;
#else
dsbdesc.dwFlags = DSBCAPS_STATIC | /*DSBCAPS_CTRLDEFAULT*/DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY | DSBCAPS_GETCURRENTPOSITION2;
#endif
dsbdesc.dwBufferBytes = cbWaveSize;
dsbdesc.lpwfxFormat = pWaveHeader;
// ???????
hr = pDSound->CreateSoundBuffer(&dsbdesc, &pDSData, NULL);
if(DS_OK != hr) {
// ????????
return FALSE;
}
// ???????????Wave????????
LPVOID lpvPtr1; // ????????????
DWORD dwBytes1; // ???????????
LPVOID lpvPtr2; // ?吻???????????
DWORD dwBytes2; // ?吻??????????
hr = pDSData->Lock(0, cbWaveSize, &lpvPtr1, &dwBytes1, &lpvPtr2, &dwBytes2, 0);
// DSERR_BUFFERLOST?刺?????Restore????????????????
if(DSERR_BUFFERLOST == hr) {
pDSData->Restore();
hr = pDSData->Lock(0, cbWaveSize, &lpvPtr1, &dwBytes1, &lpvPtr2, &dwBytes2, 0);
}
if(DS_OK == hr) {
// ????
// ?????????????
// ??????????????
CopyMemory(lpvPtr1, pbWaveData, dwBytes1);
if ( 0 != dwBytes2 )
CopyMemory(lpvPtr2, pbWaveData + dwBytes1, dwBytes2);
// ????????????Unlock???
hr = pDSData->Unlock(lpvPtr1, dwBytes1, lpvPtr2, dwBytes2);
}
return TRUE;
}
// ????????????
//
// ? ?ㄩ hmmio ... ????????????
// pWfmtx ... ?????宇??????
// pDataSize ... ??????
// ??πㄩ TRUE ... ?
// FALSE ... ?
static BOOL WaveFormatRead( HMMIO hmmio, WAVEFORMATEX *pWfmtx, DWORD *pDataSize )
{
MMCKINFO parent, child;
parent.ckid = (FOURCC)0;
parent.cksize = 0;
parent.fccType = (FOURCC)0;
parent.dwDataOffset = 0;
parent.dwFlags = 0;
child = parent;
//WAVE?????Π?
parent.fccType = mmioFOURCC('W','A','V','E');
if ( (int)mmioDescend(hmmio,&parent,NULL,MMIO_FINDRIFF) ){
// ERRPRINT("WAVE?????Π?");
return FALSE;
}
//fmt?????向?
child.ckid = mmioFOURCC('f', 'm', 't', ' ');
if ( mmioDescend( hmmio , &child , &parent , MMIO_FINDCHUNK ) ){
// ERRPRINT("fmt?????向?");
return FALSE;
}
//??????????台
if (mmioRead( hmmio , (char *)pWfmtx , sizeof(WAVEFORMATEX) ) != sizeof(WAVEFORMATEX) ){
// ERRPRINT("??????????台");
return FALSE;
}
//??????????????????
if (pWfmtx->wFormatTag != WAVE_FORMAT_PCM ){
// ERRPRINT("????????????????");
return FALSE;
}
//?????????兌??
if (mmioAscend( hmmio , &child , 0 )){
// ERRPRINT("?????????兌??");
return FALSE;
}
//data?????向?
child.ckid = mmioFOURCC( 'd' , 'a' , 't' , 'a' );
if ( mmioDescend( hmmio , &child , &parent , MMIO_FINDCHUNK ) ){
// ERRPRINT("data?????向?");
return FALSE;
}
*pDataSize = child.cksize;
return TRUE;
}
static BYTE *pDSbuffData;
//
// ???????????
//
// ? ?ㄩ hmmio ... ????????????
// pDataSize ... ??????????
// pData ... DirectSoundBuffer
// ??πㄩ TRUE ... ?
// FALSE ... ?
static BOOL WaveDataRead( HMMIO hmmio , DWORD *pDataSize, LPDIRECTSOUNDBUFFER pData )
{
// BYTE *pDSbuffData;
//??????????
if( pData->Lock(0 , *pDataSize , (LPVOID*)&pDSbuffData , pDataSize , NULL , 0, 0 ) != DS_OK )
return FALSE;
//???????????
*pDataSize = (DWORD)mmioRead(hmmio , (char*)pDSbuffData , *pDataSize);
//?????
if( pData->Unlock( pDSbuffData , *pDataSize , NULL , 0 ) != DS_OK )
return FALSE;
return TRUE;
}
//
// ??????????台
//
// ? ?ㄩ pWfmtx ... ???????????
// DataSize ... ????????
// ppData ... 台????????????????
// ??πㄩ TRUE ... ?
// FALSE ... ?
static BOOL dwSoundInit( WAVEFORMATEX *pWfmtx, DWORD DataSize, LPDIRECTSOUNDBUFFER *ppData )
{
DSBUFFERDESC dsbufferdesc;
//??????????????
memset( &dsbufferdesc , 0 , sizeof( DSBUFFERDESC ) );
dsbufferdesc.dwSize = sizeof( DSBUFFERDESC );
// dsbufferdesc.dwFlags = DSBCAPS_CTRLPOSITIONNOTIFY | DSBCAPS_CTRLDEFAULT | DSBCAPS_GETCURRENTPOSITION2;
#if ACTIVE
dsbufferdesc.dwFlags = DSBCAPS_STATIC | /*DSBCAPS_CTRLDEFAULT*/DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY | DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS;
#else
dsbufferdesc.dwFlags = DSBCAPS_STATIC | /*DSBCAPS_CTRLDEFAULT*/DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY | DSBCAPS_GETCURRENTPOSITION2;
#endif
dsbufferdesc.dwBufferBytes = DataSize;
dsbufferdesc.lpwfxFormat = pWfmtx;
if ( pDSound->CreateSoundBuffer( &dsbufferdesc , ppData , NULL ) != DS_OK )
return FALSE;
return TRUE;
}
int f_get(FILE *fp);
int get_num(FILE *fp);
int num_check(FILE *fp);
// ??????〈????更??
#define mxSTR 200
/*-------------------------------------------
DirectSound ???
--------------------------------------------*/
int InitDSound(void)
{
HRESULT ret;
int d7;
pDSound = NULL;
pDSPrimary = NULL;
for(d7=0;d7<VOICE_MAX;d7++)
pDSData[d7]=NULL;
for(d7=0;d7<VOICE_MAX;d7++)
dataPlay[d7]=FALSE;
ret = DirectSoundCreate(NULL, &pDSound, NULL);
if(ret != DS_OK){
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "膘蕾DirectSound賡醱囮啖ㄐ", "Error", MB_OK);
#endif
return FALSE;
}
//????????? 叉
ret = pDSound->SetCooperativeLevel(hWnd, DSSCL_PRIORITY);
if(ret != DS_OK){
// ?????? 叉??
RELEASE(pDSound);
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "扢隅衪覃脹撰囮啖ㄐ", "Error", MB_OK);
#endif
return FALSE;
}
// ????? 叉
pDSound ->SetSpeakerConfig(DSSPEAKER_COMBINED(DSSPEAKER_STEREO, DSSPEAKER_GEOMETRY_WIDE));
// ????????????
// DSBUFFERDESC?﹨▍? 叉
DSBUFFERDESC dsbdesc;
ZeroMemory(&dsbdesc, sizeof(DSBUFFERDESC));
dsbdesc.dwSize = sizeof(DSBUFFERDESC);
// ???????????叉
dsbdesc.dwFlags = DSBCAPS_PRIMARYBUFFER;
dsbdesc.dwBufferBytes = 0;
dsbdesc.lpwfxFormat = NULL;
// ???????
ret = pDSound->CreateSoundBuffer(&dsbdesc, &pDSPrimary, NULL);
if(ret != DS_OK) {
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "膘蕾翋猁buffer囮啖ㄐ", "Error", MB_OK);
#endif
return FALSE;
}
// ???????????Wave??????? 叉
// ?????????????? 叉????????????
WAVEFORMATEX pcmwf;
ZeroMemory(&pcmwf, sizeof(WAVEFORMATEX));
pcmwf.wFormatTag = WAVE_FORMAT_PCM;
pcmwf.nChannels = 2; // ????????????
pcmwf.nSamplesPerSec = 22050; // ?????????? 22.05kHz
pcmwf.nBlockAlign = 4;
pcmwf.nAvgBytesPerSec = pcmwf.nSamplesPerSec * pcmwf.nBlockAlign;
pcmwf.wBitsPerSample = 16; // 16???
ret = pDSPrimary->SetFormat(&pcmwf);
if(ret != DS_OK){
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "翋猁buffer腔跡宒趙囮啖ㄐ", "Error", MB_OK);
#endif
return FALSE;
}
/*
//cary 妏蚚resource膘蕾sound data
// ?????????????????????
for(d7=0;d7<TONE_MAX;d7++){
BOOL f;
f = CreateSoundData(MAKEINTRESOURCE(101+d7), pDSData_tone[d7]);
if(!f){
for(d7=0;d7<TONE_MAX;d7++)
RELEASE(pDSData_tone[d7]);
RELEASE(pDSPrimary);
RELEASE(pDSound);
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "膘蕾汒秞訧蹋囮啖ㄐ", "Error", MB_OK);
#endif
return FALSE;
}
}
*/
HMMIO hmmio; //????????
WAVEFORMATEX Wfmtx; //WAVE??????????????
DWORD DataSize; //?????????
DWORD WaveSize; //Wave????????
int program_no = 0;
char fname[mxSTR];
hmmio = (HMMIO)-1; //?????????
tone_max_buf = 0;
typedef struct
{
short no;
char name[mxSTR];
char vol;
char note;
char loop_flg;
} SNDCONFIG;
#include "../systeminc/sndcnf.h"
for(d7=0;d7<TONE_MAX;d7++){ //????????
tone_tbl[d7].voice_place = -1;
}
//?????????? ?叉?????? ??????????
int d1 = 0; //SNDCONFIG????????
while(1){
if(sndconfig[ d1 ].no == -1){ //???
goto InitDSound_ok;
}
program_no = sndconfig[ d1 ].no; //?吻????
if(program_no > TONE_MAX){ //???????
goto InitDSound_err2; //???
}
tone_tbl[ program_no ].voice_place = tone_max_buf; //????!卒㎏
//?〈?台
strcpy( fname, sndconfig[ d1 ].name );
if(sndconfig[ d1 ].vol < 0){ //????????????
goto InitDSound_err2;
}
tone_tbl[ program_no ].voice_volume = sndconfig[ d1 ].vol; //??????卒㎏
if(sndconfig[ d1 ].note > 60){ //???吻??????
goto InitDSound_err2;
}
if(sndconfig[ d1 ].note){ //???吻?卒㎏
tone_tbl[ program_no ].voice_note = sndconfig[ d1 ].note;
} else {
tone_tbl[ program_no ].voice_note = 0;
}
//?????????
tone_tbl[ program_no ].voice_loop = sndconfig[ d1 ].loop_flg;
//???????????
int d2;
FILE *fp;
fp = fopen( fname, "rb" );
if( fp == NULL ){
d1++; //SNDCONFIG??????
continue;
}
d2 = 8; //??????????????
d2 += 4; //??????????????
d2 += 4; //???? ?????????
d2 += 8; //????????
fseek(fp,d2,SEEK_CUR); //??????????去
d2 = fgetc(fp); //???????????
d2 |= fgetc(fp) << 8; //???????????
d2 |= fgetc(fp) << 16; //???????????
d2 |= fgetc(fp) << 24; //???????????
switch(d2){
case 11025:
tone_tbl[ program_no ].voice_rate = 25;
break;
case 22050:
tone_tbl[ program_no ].voice_rate = 37;
break;
case 44100:
tone_tbl[ program_no ].voice_rate = 49;
break;
}
fclose(fp);
//????????????
if( (hmmio = mmioOpen(fname, NULL, MMIO_READ | MMIO_ALLOCBUF )) == NULL){
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "湖羲WAV紫囮啖ㄐ", "Error", MB_OK);
#endif
goto InitDSound_err;
}
//???????????
if( WaveFormatRead( hmmio , &Wfmtx , &WaveSize ) == FALSE ){
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "黍WAV跡宒囮啖ㄐ", "Error", MB_OK);
#endif
goto InitDSound_err;
}
DataSize = WaveSize;
//??????????????
if( dwSoundInit( &Wfmtx, DataSize, &pDSData_tone[tone_max_buf] ) == FALSE ){
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "場宎趙汒秞buffer囮啖ㄐ", "Error", MB_OK);
#endif
goto InitDSound_err;
}
//???????
if( WaveDataRead( hmmio, &DataSize, pDSData_tone[tone_max_buf] ) == FALSE ){
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "黍WAV紫腔訧蹋囮啖ㄐ", "Error", MB_OK);
#endif
goto InitDSound_err;
}
mmioClose( hmmio , 0 );
hmmio = (HMMIO)-1; //?????????
d1++; //SNDCONFIG??????
tone_max_buf++; //?????
}
InitDSound_err: //?????????????
mmioClose( hmmio , 0 );
for(d7=0;d7<tone_max_buf;d7++)
RELEASE(pDSData_tone[d7]);
RELEASE(pDSPrimary);
RELEASE(pDSound);
return FALSE;
InitDSound_err2: //叉????????
if(hmmio != (HMMIO)-1){ //????????????
mmioClose( hmmio , 0 );
}
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "? 叉???????", "Error", MB_OK);
#endif
for(d7=0;d7<tone_max_buf;d7++)
RELEASE(pDSData_tone[d7]);
RELEASE(pDSPrimary);
RELEASE(pDSound);
return FALSE;
InitDSound_ok: //?
// ????希?吻???佃??
for(d7=0;d7<VOICE_MAX;d7++){
if( pDSound->DuplicateSoundBuffer(pDSData_tone[0],&pDSData[d7]) != DS_OK ){
for(d7=0;d7<tone_max_buf;d7++)
RELEASE(pDSData_tone[d7]);
for(d7=0;d7<VOICE_MAX;d7++)
RELEASE(pDSData[d7]);
RELEASE(pDSPrimary);
RELEASE(pDSound);
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "葩秶汒秞buffer囮啖ㄐ", "Error", MB_OK);
#endif
return FALSE;
}
}
// ????????π?台??
pDSPrimary->GetVolume(&primaryVolume);
// ?????
pDSPrimary->GetPan(&primaryPan);
// ??
pDSPrimary->GetFrequency((DWORD*)&primaryFrequency);
return TRUE;
}
volatile static char exit_thread_flg = 0;
static int thread_loop_start;
//static int thread_loop_end;
static int thread_stop_flg = 0;
static LPDIRECTSOUNDNOTIFY pDSNotify = NULL;
static char stream_flg = 0;
/*-------------------------------------------
????于??
--------------------------------------------*/
void stop_thread(void)
{
//????于??
if(thread_stop_flg){
//???于
pDSData_tone[ TONE_MAX ]->Stop();
// pDSData_stream->Stop();
while(1){
if(exit_thread_flg == 1)
break;
}
thread_stop_flg = 0;
exit_thread_flg = 0;
RELEASE(pDSData_stream);
}
//???????????
RELEASE(pDSData_tone[TONE_MAX]);
}
/*-------------------------------------------
???于??
--------------------------------------------*/
void stop_bgm(void)
{
if (MuteFlag) return;
//????于??
if(thread_stop_flg){
//????于?
stop_thread();
} else {
//???????????
RELEASE(pDSData_tone[TONE_MAX]);
}
//??????????
t_music_fade_flg = 0;
//????????
t_music_playing_flg = 0;
//???阪?????吻????
map_bgm_vct_no = 0;
map_bgm_no = t_music_bgm_no;
}
/*-------------------------------------------
?????????
--------------------------------------------*/
void fade_out_bgm(void)
{
//????????
t_music_fade_flg = 1;
//?????卒㎏
t_music_fade_vol = bgm_tbl[t_music_bgm_no].volume * t_music_bgm_volume / 15;
}
/*-------------------------------------------
????
--------------------------------------------*/
int EndApp(void)
{
int d7;
//????于?
stop_thread();
RELEASE(pDSData_tone[TONE_MAX]);
//??????
if(stream_flg == 1){
RELEASE(pDSNotify);
}
for(d7=0;d7<VOICE_MAX;d7++){
pDSData[d7]->Stop();
RELEASE( pDSData[d7] );
}
for(d7=0;d7<tone_max_buf;d7++){
pDSData_tone[d7]->Stop();
RELEASE( pDSData_tone[d7] );
}
RELEASE(pDSPrimary);
RELEASE(pDSound);
return TRUE;
}
#define MUSIC_END -1
#define MUSIC_R -2
#define MUSIC_LOOP -3
#define MUSIC_FREQ -4
#define MUSIC_VOL -5
#define MUSIC_PAN -6
#define MUSIC_TEMPO -7
#define MUSIC_PEDAL -8
#define MUSIC_NEIRO_NO -9
#define MUSIC_KURI_RET -10
#define MUSIC_KURI_SKIP -11
#define MUSIC_KURI_START -12
#define MUSIC_WAVE -13
#define MUSIC_WAON -14
#define MUSIC_DETUNE -15
#define MUSIC_LFO_H -16
#define MUSIC_LFO_M -17
#define MUSIC_LFO_S -18
static int cnt=0,cnt2=0;
static LARGE_INTEGER d_cnt;
static int ch;
static int step_time[TRACK_MAX];
static int gate_time[TRACK_MAX];
static int d_pedal[TRACK_MAX];
static int wave[TRACK_MAX];
static int step_point[TRACK_MAX];
static int step_def[TRACK_MAX];
static int play_flg[TRACK_MAX];
static int play_track_flg[TRACK_MAX];
static int play_kuri_num[8][TRACK_MAX];
static int play_kuri_lv[TRACK_MAX];
static int play_use_task[TRACK_MAX][8];
static int dataToneNo[TRACK_MAX];
static int tie_flg[TRACK_MAX];
static int note_old[TRACK_MAX][8];
static int play_use_task_cnt[TRACK_MAX];
static int play_detune[TRACK_MAX];
static int play_lfo_h[TRACK_MAX];
static int play_lfo_m[TRACK_MAX];
static int play_lfo_s[TRACK_MAX];
static int pause_flg;
static LARGE_INTEGER tempo;
static int step[TRACK_MAX][16384];
typedef enum {
M_OPEN_ERR = 0,
M_STEP_ERR,
M_TRACK_ERR,
M_LCOMMAND_ERR,
M_TCOMMAND_ERR,
M_VCOMMAND_ERR,
M_V2COMMAND_ERR,
M_P2COMMAND_ERR,
M_F2COMMAND_ERR,
M_2COMMAND_ERR,
M_KAKKO_ERR,
M_MML_ERR,
M_D2COMMAND_ERR,
M_NOTE_ERR,
M_PLAY_ERR,
M_KURI_ERR,
M_KURISU_ERR,
M_MUTE_ERR,
M_W2COMMAND_ERR,
M_TOCOMMAND_ERR,
M_QCOMMAND_ERR,
M_K2COMMAND_ERR,
M_WAON_ERR,
M_OCOMMAND_ERR,
M_H2COMMAND_ERR,
M_M2COMMAND_ERR,
M_S2COMMAND_ERR,
} err_number;
static char *err_msg[]={
"紫偶羲囮啖",
"????奀潔渣昫",
"秞寢硌隅渣昫",
"?硌鍔渣昫",
"?硌鍔渣昫",
"?硌鍔渣昫",
"??硌鍔渣昫",
"??硌鍔渣昫",
"??硌鍔渣昫",
"?硌鍔渣昫",
"????硌鍔渣昫",
"???渣昫",
"??硌鍔渣昫",
"笚疏杅閉徹渣昫",
"栳軠秞寢硌隅渣昫",
"毀葩畢溫硌鍔渣昫",
"毀葩畢溫杅祥磁",
"噙秞寢硌隅渣昫",
"??硌鍔渣昫",
"誹軠硌鍔渣昫",
"?硌鍔渣昫",
"??硌鍔渣昫",
"睿秞渣昫",
"?硌鍔渣昫",
"??硌鍔渣昫",
"??硌鍔渣昫",
"??硌鍔渣昫",
};
//c c+ d d+ e f f+ g g+ a a+ b
//0 1 2 3 4 5 6 7 8 9 10 11
static int note_change_tbl[]={9,11,0,2,4,5,7};
static int freq_tbl[]={
(int)(44100.0 / 261.63 * 277.18 / 32.0), //b (o-1) 0 ???
2756, //c (o0) 1
(int)(44100.0 / 261.63 * 277.18 / 16.0), //c+
(int)(44100.0 / 261.63 * 293.67 / 16.0), //d
(int)(44100.0 / 261.63 * 311.13 / 16.0), //d+
(int)(44100.0 / 261.63 * 329.63 / 16.0), //e
(int)(44100.0 / 261.63 * 349.23 / 16.0), //f
(int)(44100.0 / 261.63 * 366.99 / 16.0), //f+
(int)(44100.0 / 261.63 * 392.00 / 16.0), //g
(int)(44100.0 / 261.63 * 415.31 / 16.0), //g+
(int)(44100.0 / 261.63 * 440.00 / 16.0), //a
(int)(44100.0 / 261.63 * 466.16 / 16.0), //a+
(int)(44100.0 / 261.63 * 493.88 / 16.0), //b
5512, //c (o1) 13
(int)(44100.0 / 261.63 * 277.18 / 8.0), //c+
(int)(44100.0 / 261.63 * 293.67 / 8.0), //d
(int)(44100.0 / 261.63 * 311.13 / 8.0), //d+
(int)(44100.0 / 261.63 * 329.63 / 8.0), //e
(int)(44100.0 / 261.63 * 349.23 / 8.0), //f
(int)(44100.0 / 261.63 * 366.99 / 8.0), //f+
(int)(44100.0 / 261.63 * 392.00 / 8.0), //g
(int)(44100.0 / 261.63 * 415.31 / 8.0), //g+
(int)(44100.0 / 261.63 * 440.00 / 8.0), //a
(int)(44100.0 / 261.63 * 466.16 / 8.0), //a+
(int)(44100.0 / 261.63 * 493.88 / 8.0), //b
11025, //c (o2) 25
(int)(44100.0 / 261.63 * 277.18 / 4.0), //c+
(int)(44100.0 / 261.63 * 293.67 / 4.0), //d
(int)(44100.0 / 261.63 * 311.13 / 4.0), //d+
(int)(44100.0 / 261.63 * 329.63 / 4.0), //e
(int)(44100.0 / 261.63 * 349.23 / 4.0), //f
(int)(44100.0 / 261.63 * 366.99 / 4.0), //f+
(int)(44100.0 / 261.63 * 392.00 / 4.0), //g
(int)(44100.0 / 261.63 * 415.31 / 4.0), //g+
(int)(44100.0 / 261.63 * 440.00 / 4.0), //a
(int)(44100.0 / 261.63 * 466.16 / 4.0), //a+
(int)(44100.0 / 261.63 * 493.88 / 4.0), //b
22050, //c (o3) 37
(int)(44100.0 / 261.63 * 277.18 / 2.0), //c+
(int)(44100.0 / 261.63 * 293.67 / 2.0), //d
(int)(44100.0 / 261.63 * 311.13 / 2.0), //d+
(int)(44100.0 / 261.63 * 329.63 / 2.0), //e
(int)(44100.0 / 261.63 * 349.23 / 2.0), //f
(int)(44100.0 / 261.63 * 366.99 / 2.0), //f+
(int)(44100.0 / 261.63 * 392.00 / 2.0), //g
(int)(44100.0 / 261.63 * 415.31 / 2.0), //g+
(int)(44100.0 / 261.63 * 440.00 / 2.0), //a
(int)(44100.0 / 261.63 * 466.16 / 2.0), //a+
(int)(44100.0 / 261.63 * 493.88 / 2.0), //b
44100, //c (o4) 49
(int)(44100.0 / 261.63 * 277.18), //c+
(int)(44100.0 / 261.63 * 293.67), //d
(int)(44100.0 / 261.63 * 311.13), //d+
(int)(44100.0 / 261.63 * 329.63), //e
(int)(44100.0 / 261.63 * 349.23), //f
(int)(44100.0 / 261.63 * 366.99), //f+
(int)(44100.0 / 261.63 * 392.00), //g
(int)(44100.0 / 261.63 * 415.31), //g+
(int)(44100.0 / 261.63 * 440.00), //a
(int)(44100.0 / 261.63 * 466.16), //a+
(int)(44100.0 / 261.63 * 493.88), //b
88200, //b+ (o5) 61
(int)(44100.0 / 261.63 * 277.18 * 2.0), //c+
(int)(44100.0 / 261.63 * 293.67 * 2.0), //d ?????63
(int)(44100.0 / 261.63 * 311.13 * 2.0), //d+
(int)(44100.0 / 261.63 * 329.63 * 2.0), //e
(int)(44100.0 / 261.63 * 349.23 * 2.0), //f
(int)(44100.0 / 261.63 * 366.99 * 2.0), //f+
(int)(44100.0 / 261.63 * 392.00 * 2.0), //g
(int)(44100.0 / 261.63 * 415.31 * 2.0), //g+
(int)(44100.0 / 261.63 * 440.00 * 2.0), //a
(int)(44100.0 / 261.63 * 466.16 * 2.0), //a+
(int)(44100.0 / 261.63 * 493.88 * 2.0), //b
};
static long volume_tbl[128];
static long panpot_tbl[128];
static int detune_tbl[12*5+5];
int get_num(FILE *fp);
/*-------------------------------------------
??????????
--------------------------------------------*/
int f_get(FILE *fp)
{
int d0;
while(1){
d0 = fgetc( fp ); //????吻???
if( d0 == EOF )
return d0;
if( d0 == '\t' ) //???
continue;
if( d0 != 0x20 ) //?????
break;
}
if(d0 >= 'A' && d0 <= 'Z') //?更??更?阪?
d0+=0x20; //
return d0;
}
/*-------------------------------------------
?π??????
--------------------------------------------*/
int get_num(FILE *fp)
{
int d0,d1;
while(1){
d0 = f_get( fp ); //????吻???
if( d0 == EOF )
return d0;
if( d0 >= '0' && d0<= '9' ) //???
break; //??????
}
d1=d0-'0'; //?????
while(1){
d0 = fgetc( fp ); //????吻???
if( d0 == EOF )
break;
if( d0 < '0' || d0> '9' ) //???
break; //?????????
d1*=10; //???????
d1+=d0-'0'; //
}
fseek(fp,-1,SEEK_CUR); //??????
return d1;
}
/*-------------------------------------------
?π???????????????
--------------------------------------------*/
int get_num2(FILE *fp)
{
int d0,d1,d2=1;
d0 = f_get( fp ); //??????
if(d0=='-') //??????
d2=-1;
else
fseek(fp,-1,SEEK_CUR); //??????
while(1){
d0 = fgetc( fp ); //????吻???
if( d0 == EOF )
return d0;
if( d0 >= '0' && d0<= '9' ) //???
break; //??????
}
d1=d0-'0'; //?????
while(1){
d0 = fgetc( fp ); //????吻???
if( d0 == EOF )
break;
if( d0 < '0' || d0> '9' ) //???
break; //?????????
d1*=10; //???????
d1+=d0-'0'; //
}
fseek(fp,-1,SEEK_CUR); //??????
return d1*d2;
}
/*-------------------------------------------
?????????????????
--------------------------------------------*/
int num_check2(FILE *fp)
{
int d0;
d0 = f_get( fp ); //??????
if(d0=='-'){ //??????
d0 = fgetc( fp ); //?????????
fseek(fp,-2,SEEK_CUR); //??????
if( d0 >= '0' && d0<= '9' ) //???
return 1; //??
else
return 0; //???
} else {
fseek(fp,-1,SEEK_CUR); //??????
if( d0 >= '0' && d0<= '9' ) //???
return 1; //??
else
return 0; //???
}
}
/*-------------------------------------------
????????
--------------------------------------------*/
int num_check(FILE *fp)
{
int d0;
d0 = f_get( fp ); //??????
fseek(fp,-1,SEEK_CUR); //??????
if( d0 >= '0' && d0<= '9' ) //???
return 1; //??
else
return 0; //???
}
/*-------------------------------------------
?????????????
--------------------------------------------*/
int get_step(FILE *fp,int ch)
{
int d0,futen,total;
total = 0;
futen = 0;
while(1){
d0 = f_get( fp ); //?????
if( d0 >= '0' && d0<= '9' ){ //????
fseek(fp,-1,SEEK_CUR); //??????
d0 = get_num( fp );
if(d0 > 192)
return -1;
futen = 192 / d0;
total += futen;
} else if(d0 == '.'){ //至???
if(!total){ //???? 叉????
total = step_def[ch]; //至??????
futen = step_def[ch]; //
}
futen /= 2;
total += futen;
} else if(d0 == '^'){ //??????
d0 = f_get( fp ); //?????
fseek(fp,-1,SEEK_CUR); //??????
if(d0 == '*'){ //‧▋????
continue;
}
if(!num_check( fp )){ //???????
return -1; //???
}
d0 = get_num( fp );
if(d0 > 192)
return -1;
if(!total){ //???? 叉????
total = step_def[ch]; //至??????
}
futen = 192 / d0;
total += futen;
} else if(d0 == '*'){ //‧▋????
if(!num_check( fp )){ //???????
return -1; //???
}
futen = get_num( fp );
total += futen;
} else {
fseek(fp,-1,SEEK_CUR); //??????
if(total) //???? 叉????
break;
futen = step_def[ch];
total = futen;
}
}
return total;
}
/*-------------------------------------------
???????????
--------------------------------------------*/
int music_read( void )
{
int d0,d1,d7,ch,ch_p[TRACK_MAX],do_p[TRACK_MAX],ch_oct[TRACK_MAX],err_flg=-1,err_line=0;
int ch_ret[8][TRACK_MAX],ch_skip[8][TRACK_MAX],ch_kuri_lv[TRACK_MAX],waon_delay[TRACK_MAX];
int o_tempo,q_com[TRACK_MAX];
long d6;
char moji[256];
FILE *fp;
fp = fopen( "oft.mml", "r" );
if( fp == NULL ){
sprintf( moji ,"%s" ,err_msg[0] );
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, moji, "Error", MB_OK);
#endif
return err_flg;
}
for(d7=0;d7<TRACK_MAX;d7++){
ch_p[d7] = 0;
do_p[d7] = 0;
ch_oct[d7] = 4;
step_def[d7] = 48;
play_track_flg[ d7 ] = 0;
ch_kuri_lv[d7] = -1;
for(d6=0;d6<8;d6++)
ch_skip[d6][d7] = -1;
q_com[d7] = 8;
waon_delay[d7] = 0;
}
o_tempo=0;
//?????????? ?? ??????????
while(1){
//?????????? ????吻? 叉 ??????????
err_line++;
if((d0 = f_get( fp )) == EOF) //????吻???
break; //?????Ψ?
if( d0 == '\n' ) //???
continue; //????????
if( d0 == '/' ){ //?????
while(1){ //????????
d0 = f_get( fp );
if(d0 == '\n' || d0 == EOF )
break;
}
continue; //????????
}
if( d0 != '(' ){ //??????
err_flg=M_TRACK_ERR;
goto music_read_999;
}
if((d0 = f_get( fp )) == EOF) //????吻???
break; //?????Ψ?
if( d0 == 'p' ){ //??????叉?
if((d0 = f_get( fp )) == EOF){ //「???????
err_flg=M_PLAY_ERR;
goto music_read_999;
}
if( d0 == ')'){ //??
err_line--; //??㎝??????????
continue;
}
fseek(fp,-1,SEEK_CUR); //??????
for(d7=0;d7<TRACK_MAX;d7++) //?????????
play_track_flg[ d7 ] = 0; //
while(1){
if((d0 = fgetc( fp )) == EOF){ //??
err_flg=M_PLAY_ERR;
goto music_read_999;
}
if( d0 == ')') //??
break;
if( d0 >= '0' && d0<= '9' ){ //???
fseek(fp,-1,SEEK_CUR); //??????
d0 = get_num( fp );
if(d0 < 1 || d0 > TRACK_MAX){
err_flg=M_PLAY_ERR;
goto music_read_999;
}
play_track_flg[ d0-1 ] = 1; //?????????
}
}
err_line--; //??㎝??????????
continue;
}
if( d0 == 's' ){ //????????叉?
while(1){
if((d0 = fgetc( fp )) == EOF){ //??
err_flg=M_MUTE_ERR;
goto music_read_999;
}
if( d0 == ')') //??
break;
if( d0 >= '0' && d0<= '9' ){ //???
fseek(fp,-1,SEEK_CUR); //??????
d0 = get_num( fp );
if(d0 < 1 || d0 > TRACK_MAX){
err_flg=M_MUTE_ERR;
goto music_read_999;
}
play_track_flg[ d0-1 ] = 0; //???????????
}
}
err_line--; //??㎝??????????
continue;
}
if( d0 == 'o' ){ //???叉?
if(!num_check( fp )){ //???????
err_flg=M_TOCOMMAND_ERR;
goto music_read_999;
}
o_tempo = get_num( fp ); //?????
if((d0 = fgetc( fp )) == EOF){ //??
err_flg=M_TOCOMMAND_ERR;
goto music_read_999;
}
if(d0 != ')'){
err_flg=M_TOCOMMAND_ERR;
goto music_read_999;
}
err_line--; //??㎝??????????
continue;
}
if( d0 != 't' ){ //?????
err_flg=M_TRACK_ERR;
goto music_read_999;
}
if((d0 = f_get( fp )) == EOF) //????吻???
break; //?????Ψ?
if( d0 < '0' || d0> '9' ){ //?????
err_flg=M_TRACK_ERR;
goto music_read_999;
}
fseek(fp,-1,SEEK_CUR); //??????
ch = get_num( fp );
if((d0 = f_get( fp )) == EOF) //????吻???
break; //?????Ψ?
if( d0 != ')' ){ //?????
err_flg=M_TRACK_ERR;
goto music_read_999;
}
if(ch < 1 || ch > TRACK_MAX){
err_flg=M_TRACK_ERR;
goto music_read_999;
}
ch--; //?????叉
play_track_flg[ ch ] = 1; //
if(o_tempo!=0 && ch_p[ch]==0){ //???叉?????
step[ch][ch_p[ch]++] = MUSIC_TEMPO; //「???????????
#if MODE98
step[ch][ch_p[ch]++] = (int)((float)120 / (float)o_tempo * (float)12600)*2;
#else
step[ch][ch_p[ch]++] = (int)((float)120 / (float)o_tempo * (float)12600);
#endif
}
//?????????? ??????? 叉 ??????????
music_read_100:
if((d0 = f_get( fp )) == EOF) //??????
break; //?????Ψ?
switch(d0){
case '\n': //??
break;
case '/': //?????
while(1){ //????????
d0 = f_get( fp );
if(d0 == '\n' || d0 == EOF )
break;
}
break;
case '\'': //????
int waon_step,waon_note[8+1],waon_cnt,octave,waon_delay_point;
waon_step = waon_cnt = 0;
octave = ch_oct[ch];
while(1){
d0 = f_get( fp ); //?????
if( d0 >= '0' && d0<= '9' ){ //????????
err_flg=M_WAON_ERR; //???
goto music_read_999;
}
if(d0 =='<'){ //???????
octave++;
continue;
}
if(d0 =='>'){ //????????
octave--;
if(octave < 0){ //????????
err_flg=M_NOTE_ERR; //???
goto music_read_999; //
}
continue;
}
if(d0 =='\''){ //?????
break;
}
switch(d0){
case 'c': //??
case 'd': //??
case 'e': //??
case 'f': //??
case 'g': //??
case 'a': //??
case 'b': //??
d0-='a';
d1 = note_change_tbl[d0];
d0 = f_get( fp ); //?????
if(d0 == '+')
d1++;
else if(d0 == '-')
d1--;
else fseek(fp,-1,SEEK_CUR); //??????
d0 = octave * 12 + d1 +1; //???吻???????
if(d0 < 1 || d0 > 62){ //
err_flg=M_NOTE_ERR; //???
goto music_read_999; //
}
waon_note[ waon_cnt++ ] = d0; //???吻????
d0 = f_get( fp ); //?????
fseek(fp,-1,SEEK_CUR); //??????
if( d0 < '0' || d0> '9' ){ //???????
if( d0 != '*' ){ //???????????
break;
}
}
waon_step = get_step( fp, ch ); //?????????
if(waon_step == -1){ //?????
err_flg=M_WAON_ERR; //???
goto music_read_999;
}
break;
default:
err_flg=M_WAON_ERR; //???
goto music_read_999;
}
}
if(waon_cnt > 8 || waon_cnt == 0){ //????????
err_flg=M_WAON_ERR; //???
goto music_read_999;
}
if(num_check( fp )){ //????
waon_step = get_num( fp ); //??????????
}
step[ch][ch_p[ch]++] = MUSIC_WAON; //?????
step[ch][ch_p[ch]++] = waon_cnt; //??????
waon_delay_point = ch_p[ch]; //??????????卒㎏
ch_p[ch]++; //?? 叉??
for(d7=0;d7<waon_cnt;d7++){
step[ch][ch_p[ch]++] = waon_note[d7]; //???吻????
}
if(waon_step){ //????????叉?????
d0 = waon_step; //??????????
} else {
d0 = step_def[ch]; //??????????
}
step[ch][ch_p[ch]++] = d0; //??????????
d1 = f_get( fp ); //????
if(d1 == '&'){
step[ch][ch_p[ch]++] = -1; //?????????
} else {
fseek(fp,-1,SEEK_CUR); //??????
step[ch][ch_p[ch]++] = d0 * q_com[ch] / 8; //?????????
}
d0 = f_get( fp ); //????叉????
if(d0 == ','){
if(num_check( fp )){ //????
waon_delay[ch] = get_num( fp ); //????π???
} else { //???????
err_flg=M_WAON_ERR; //???
goto music_read_999;
}
} else { //????叉????
fseek(fp,-1,SEEK_CUR); //??????
}
step[ch][waon_delay_point] = waon_delay[ch]; //???????
goto music_read_100;
case 'l': //???
d0 = f_get( fp ); //???π?
if( d0 >= '0' && d0<= '9' ){ //???
fseek(fp,-1,SEEK_CUR); //??????
d0 = 192 / get_num( fp );
if(d0 > 192 || d0 == 0){
err_flg=M_LCOMMAND_ERR;
goto music_read_999;
}
step_def[ ch ] = d0;
goto music_read_100;
}
if( d0 != '*' ){ //‧▋???
err_flg=M_LCOMMAND_ERR;
goto music_read_999;
}
d0 = f_get( fp ); //???π?
if( d0 >= '0' && d0<= '9' ){ //???
fseek(fp,-1,SEEK_CUR); //??????
step_def[ ch ] = get_num( fp );
goto music_read_100;
}
err_flg=M_LCOMMAND_ERR;
goto music_read_999;
case 'r': //??
step[ch][ch_p[ch]++]=MUSIC_R;
d0 = get_step( fp, ch ); //?????????
if(d0 == -1){ //????
err_flg=M_STEP_ERR; //??????
goto music_read_999;
}
step[ch][ch_p[ch]++] = d0; //??????????
d1 = f_get( fp ); //????
if(d1 == '&'){
step[ch][ch_p[ch]++] = -1; //?????????
} else {
fseek(fp,-1,SEEK_CUR); //??????
step[ch][ch_p[ch]++] = d0 * q_com[ch] / 8; //?????????
}
goto music_read_100;
case 'o': //?????叉?
if(!num_check( fp )){ //???????
err_flg=M_OCOMMAND_ERR; //???
goto music_read_999;
}
ch_oct[ch] = get_num( fp );
if(ch_oct[ch]<0 || ch_oct[ch]>5){ //吳????
err_flg=M_OCOMMAND_ERR; //???
goto music_read_999;
}
goto music_read_100;
case '<': //??????
ch_oct[ch]++;
goto music_read_100;
case '>': //???????
ch_oct[ch]--;
if(ch_oct[ch] < 0){ //????????
err_flg=M_NOTE_ERR; //???
goto music_read_999; //
}
goto music_read_100;
case 'q': //???????
if(!num_check( fp )){ //???????
err_flg=M_QCOMMAND_ERR;
goto music_read_999;
}
q_com[ch] = get_num( fp ); //?????????
if(q_com[ch] > 8 || q_com[ch] == 0){ //吳????
err_flg=M_QCOMMAND_ERR;
goto music_read_999;
}
goto music_read_100;
case 'c': //??
case 'd': //??
case 'e': //??
case 'f': //??
case 'g': //??
case 'a': //??
case 'b': //??
// if(ch >= 6){
d0-='a';
d1 = note_change_tbl[d0];
d0 = f_get( fp ); //?????
if(d0 == '+')
d1++;
else if(d0 == '-')
d1--;
else fseek(fp,-1,SEEK_CUR); //??????
if(ch_oct[ch] >= 5){ //???吻??????
if(d1 >= 2){ //
err_flg=M_NOTE_ERR; //??
goto music_read_999; //
}
}
#if 0
step[ch][ch_p[ch]++] = MUSIC_FREQ;
d1 = freq_tbl[d1+1];
if(ch_oct[ch] > 0){
d0 = ch_oct[ch];
d0 = 1 << d0;
d1 *= d0;
} else if(ch_oct[ch] < 0){
d0 = -ch_oct[ch];
d0 = 1 << d0;
d1 /= d0;
}
#endif
d0 = ch_oct[ch] * 12 + d1 + 1; //???吻???????
if(d0 < 1 || d0 > 62){ //
err_flg=M_NOTE_ERR; //???
goto music_read_999; //
}
step[ch][ch_p[ch]++] = d0; //???吻????
// }
d0 = get_step( fp, ch ); //?????????
if(d0 == -1){ //????
err_flg=M_STEP_ERR; //??????
goto music_read_999;
}
step[ch][ch_p[ch]++] = d0; //??????????
d1 = f_get( fp ); //????
if(d1 == '&'){
step[ch][ch_p[ch]++] = -1; //?????????
} else {
fseek(fp,-1,SEEK_CUR); //??????
step[ch][ch_p[ch]++] = d0 * q_com[ch] / 8; //?????????
}
goto music_read_100;
case 't': //???
d0 = f_get( fp ); //?????
if( d0 < '0' || d0> '9' ){ //???
err_flg=M_TCOMMAND_ERR;
goto music_read_999;
}
fseek(fp,-1,SEEK_CUR); //??????
d0 = get_num( fp );
step[ch][ch_p[ch]++] = MUSIC_TEMPO;
#if MODE98
step[ch][ch_p[ch]++] = (int)((float)120 / (float)d0 * (float)12600)*2;
#else
step[ch][ch_p[ch]++] = (int)((float)120 / (float)d0 * (float)12600);
#endif
goto music_read_100;
case 'v': //?????
d0 = f_get( fp ); //????
if( d0 < '0' || d0> '9' ){ //???
err_flg=M_VCOMMAND_ERR;
goto music_read_999;
}
fseek(fp,-1,SEEK_CUR); //??????
d0 = get_num( fp );
if(d0>15){ //???????
err_flg=M_VCOMMAND_ERR;
goto music_read_999;
}
step[ch][ch_p[ch]++]=MUSIC_VOL;
if( d0 ){
d0 = 15 - d0;
// d0 *= d0;
// d0 = (int)((float)d0 * 39.0625);
// step[ch][ch_p[ch]++] = -d0;
d6 = d0;
d6 = d6*d6*d6;
d6 = (long)(10000.0 / ( 16.0 * 16.0 * 16.0 ) * d6 );
step[ch][ch_p[ch]++] = -d6;
} else {
step[ch][ch_p[ch]++] = -10000;
}
goto music_read_100;
case '@': //?????
d0 = f_get( fp ); //??????
if( d0 >= '0' && d0<= '9' ){ //???
fseek(fp,-1,SEEK_CUR); //??????
step[ch][ch_p[ch]++] = MUSIC_NEIRO_NO; //?吻????
step[ch][ch_p[ch]++] = get_num( fp ) - 1;
goto music_read_100;
}
switch(d0){
case 'v': //?????
d0 = f_get( fp ); //????
if( d0 < '0' || d0> '9' ){ //???
err_flg=M_V2COMMAND_ERR;
goto music_read_999;
}
fseek(fp,-1,SEEK_CUR); //??????
d0 = get_num( fp );
if(d0>127){ //???????
err_flg=M_V2COMMAND_ERR;
goto music_read_999;
}
step[ch][ch_p[ch]++]=MUSIC_VOL;
#if 0
if( d0 ){
d0 = 127 - d0;
// d0 *= d0;
// d0 = (int)((float)d0 * 0.61);
// step[ch][ch_p[ch]++] = -d0;
d6 = d0;
d6 = d6*d6*d6;
d6 = (long)(10000.0 / ( 128.0 * 128.0 * 128.0 ) * d6 );
step[ch][ch_p[ch]++] = -d6;
} else {
step[ch][ch_p[ch]++] = -10000;
}
#else
// d6=(long)(LOG(100,127)*10000) - (long)(LOG(100,(double)(d0))*10000);
// step[ch][ch_p[ch]++] = -d6;
step[ch][ch_p[ch]++] = d0;
#endif
goto music_read_100;
case 'h': //??
if(!num_check( fp )){ //???????
err_flg=M_H2COMMAND_ERR;
goto music_read_999;
}
d0 = get_num( fp );
step[ch][ch_p[ch]++] = MUSIC_LFO_H;
step[ch][ch_p[ch]++] = d0;
goto music_read_100;
case 'm': //??
if(!num_check( fp )){ //???????
err_flg=M_M2COMMAND_ERR;
goto music_read_999;
}
d0 = get_num( fp );
if(d0 > 127){ //吳????
err_flg=M_M2COMMAND_ERR;
goto music_read_999;
}
step[ch][ch_p[ch]++] = MUSIC_LFO_M;
step[ch][ch_p[ch]++] = d0;
goto music_read_100;
case 's': //??
if(!num_check2( fp )){ //???????
err_flg=M_S2COMMAND_ERR;
goto music_read_999;
}
d0 = get_num2( fp );
step[ch][ch_p[ch]++] = MUSIC_LFO_S;
step[ch][ch_p[ch]++] = d0;
goto music_read_100;
case 'p': //?????
d0 = f_get( fp ); //?去???
if( d0 < '0' || d0 > '9' ){ //???
err_flg=M_P2COMMAND_ERR;
goto music_read_999;
}
fseek(fp,-1,SEEK_CUR); //??????
d0 = get_num( fp );
if( d0 > 127 ){ //吳??????
err_flg=M_P2COMMAND_ERR;
goto music_read_999;
}
step[ch][ch_p[ch]++]=MUSIC_PAN;
step[ch][ch_p[ch]++] = d0;
goto music_read_100;
case 'f': //??
if(!num_check2( fp )){ //???????
err_flg=M_F2COMMAND_ERR;
goto music_read_999;
}
d0 = get_num2( fp );
step[ch][ch_p[ch]++] = MUSIC_FREQ;
step[ch][ch_p[ch]++] = d0;
goto music_read_100;
case 'k': //?????
if(!num_check2( fp )){ //???????
err_flg=M_K2COMMAND_ERR;
goto music_read_999;
}
d0 = get_num2( fp );
if(d0 > 64 || d0 < -64){ //吳????
err_flg=M_K2COMMAND_ERR;
goto music_read_999;
}
step[ch][ch_p[ch]++] = MUSIC_DETUNE;
step[ch][ch_p[ch]++] = d0;
goto music_read_100;
case 'd': //???????
d0 = f_get( fp ); //???????
if( d0 < '0' || d0> '9' ){ //???
err_flg=M_D2COMMAND_ERR;
goto music_read_999;
}
fseek(fp,-1,SEEK_CUR); //??????
d0 = get_num( fp );
step[ch][ch_p[ch]++] = MUSIC_PEDAL;
step[ch][ch_p[ch]++] = d0;
goto music_read_100;
case 'w': //???????
d0 = f_get( fp ); //???????
if( d0 < '0' || d0> '9' ){ //???
err_flg=M_W2COMMAND_ERR;
goto music_read_999;
}
fseek(fp,-1,SEEK_CUR); //??????
d0 = get_num( fp );
step[ch][ch_p[ch]++] = MUSIC_WAVE;
step[ch][ch_p[ch]++] = d0;
goto music_read_100;
default:
err_flg=M_2COMMAND_ERR;
goto music_read_999;
}
case '[': //???????
d0 = f_get( fp ); //??????
switch(d0){
case 'l':
d0 = f_get( fp ); //??????
if(d0 != 'o'){
err_flg=M_KAKKO_ERR;
goto music_read_999;
}
d0 = f_get( fp ); //??????
if(d0 != 'o'){
err_flg=M_KAKKO_ERR;
goto music_read_999;
}
d0 = f_get( fp ); //??????
if(d0 != 'p'){
err_flg=M_KAKKO_ERR;
goto music_read_999;
}
d0 = f_get( fp ); //??????
if(d0 != ']'){
err_flg=M_KAKKO_ERR;
goto music_read_999;
}
step[ch][ch_p[ch]++]=MUSIC_LOOP;
step[ch][ch_p[ch]++]=do_p[ch];
goto music_read_100;
case 'd': //????ㄅ
d0 = f_get( fp ); //??????
if(d0 != 'o'){
err_flg=M_KAKKO_ERR;
goto music_read_999;
}
d0 = f_get( fp ); //??????
if(d0 != ']'){
err_flg=M_KAKKO_ERR;
goto music_read_999;
}
do_p[ch]=ch_p[ch]; //?????
goto music_read_100;
default:
err_flg=M_KAKKO_ERR;
goto music_read_999;
}
case '|': //??刺?????
d0 = f_get( fp ); //??????
if(d0 == ':'){ //??刺???
ch_kuri_lv[ch]++; //????????
if(ch_kuri_lv[ch] == 8){ //??刺?????
err_flg=M_KURI_ERR;
goto music_read_999;
}
step[ch][ch_p[ch]++] = MUSIC_KURI_START;
if(num_check( fp )){ //???
step[ch][ch_p[ch]++] = get_num( fp );
} else {
step[ch][ch_p[ch]++] = 2;
}
ch_ret[ch_kuri_lv[ch]][ ch ] = ch_p[ch];
} else {
fseek(fp,-1,SEEK_CUR); //??????
step[ch][ch_p[ch]++]=MUSIC_KURI_SKIP;
ch_skip[ch_kuri_lv[ch]][ ch ] = ch_p[ch];
ch_p[ch]++;
}
goto music_read_100;
case ':': //??刺??????
d0 = f_get( fp ); //??????
if(d0 != '|'){ //??刺???
err_flg=M_KURI_ERR;
goto music_read_999;
}
step[ch][ch_p[ch]++] = MUSIC_KURI_RET;
step[ch][ch_p[ch]++] = ch_ret[ch_kuri_lv[ch]][ ch ]; //??
if(ch_skip[ch_kuri_lv[ch]][ ch ] >= 0){
step[ch][ch_skip[ch_kuri_lv[ch]][ ch ]] = ch_p[ch]; //Α?
ch_skip[ch_kuri_lv[ch]][ ch ] = -1;
}
ch_kuri_lv[ch]--; //????????
goto music_read_100;
default: //??????
err_flg=M_MML_ERR;
goto music_read_999;
}
}
for(d7=0;d7<TRACK_MAX;d7++){
step[d7][ch_p[d7]]=MUSIC_END;
}
err_flg=0;
music_read_999:
fclose( fp );
if(err_flg){
sprintf_s( moji ,"菴 %d 俴 %s" ,err_line ,err_msg[err_flg] );
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, moji, "Error", MB_OK);
#endif
} else {
for(d7=0;d7<TRACK_MAX;d7++){
if(ch_kuri_lv[d7]!=-1){
err_flg=M_KURISU_ERR;
sprintf_s( moji ,"菴 %d 秞寢 %s" ,d7+1 ,err_msg[err_flg] );
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, moji, "Error", MB_OK);
#endif
break;
}
}
}
return err_flg;
}
/*-------------------------------------------
??????????
--------------------------------------------*/
void music_init( void )
{
int d7,d5;
for(d7=0;d7<VOICE_MAX;d7++){
voice[ d7 ].name = 0;
voice[ d7 ].tone_no = -1; //???????????吻?
voice[ d7 ].loop_flg = 0;
}
for(d7=0;d7<TRACK_MAX;d7++){
step_time[ d7 ] = 0;
gate_time[ d7 ] = 0;
step_point[ d7 ] = 0;
play_flg[ d7 ] = 1;
play_kuri_lv[ d7 ] = -1;
dataToneNo[ d7 ] = 0; //????????????吻?
dataVolume[ d7 ] = 0;
dataPan[ d7 ] = 0;
dataFrequency[ d7 ] = 0;
tie_flg[ d7 ] = 0;
for(d5=0;d5<8;d5++)
play_use_task[ d7 ][ d5 ] = -1; //????吻????
play_use_task_cnt[ d7 ] = 0;
play_detune[ d7 ] = 0;
play_lfo_h[ d7 ] = 0;
play_lfo_m[ d7 ] = 0;
play_lfo_s[ d7 ] = 0;
}
//??????
for(d7=0;d7<MAX_ENV;d7++){
env_tbl[d7].voice_address = -1;
env_tbl[d7].count = 0;
}
#define PAN_POINT 5000
//???????
int y;
double d6; //?
for(d7=64,d6=127;d6>=0;d6--){
if(!((int)d6&1))
continue;
y=(int)(LOG(100,127)*PAN_POINT) - (int)(LOG(100,d6)*PAN_POINT);
if(y>PAN_POINT)
y=10000;
panpot_tbl[d7++]=y;
}
for(d7=64,d6=127;d6>=0;d6--){
if(!((int)d6&1))
continue;
y=(int)(LOG(100,127)*PAN_POINT) - (int)(LOG(100,d6)*PAN_POINT);
if(y>PAN_POINT)
y=10000;
panpot_tbl[d7--]=-y;
}
d6=panpot_tbl[0]=-10000;
d6=panpot_tbl[127]=10000;
//??????????
for(d6=127;d6>=0;d6--){
y=(int)(LOG(100,127)*10000) - (int)(LOG(100,d6)*10000);
if(y>10000)
y=10000;
volume_tbl[(int)d6]=-y;
}
//??????????
for(d7=0;d7<12*5+5;d7++)
detune_tbl[d7]=freq_tbl[d7+1]-freq_tbl[d7];
// play_bgm( 2);
}
/*-------------------------------------------
??κ??
--------------------------------------------*/
void play_stop( void )
{
int d7;
for(d7=0;d7<VOICE_MAX;d7++){
pDSData[d7]->Stop();
pDSData[d7]->SetCurrentPosition(0);
// play_flg[ d7 ] = 0;
}
pause_flg=1;
}
void stop_voice(int ch);
/*-------------------------------------------
????
--------------------------------------------*/
void play_start( void )
{
int d7;
for(d7=0;d7<VOICE_MAX;d7++){
pDSData[d7]->Stop();
pDSData[d7]->SetCurrentPosition(0);
}
music_init(); //????????
}
//?????????? ????? ??????????
void voice_lfo( int a0 )
{
long d0;
if(!voice[ a0 ].lfo_m){ //???????
return;
}
if(!voice[ a0 ].lfo_s){ //???????
return;
}
if(voice[ a0 ].lfo_h){ //?????????
voice[ a0 ].lfo_h--;
return;
}
voice[ a0 ].lfo_s_cnt += voice[ a0 ].lfo_s_ang; //???????
// if(voice[ a0 ].lfo_s_ang >= 0){ //????????
if(voice[ a0 ].lfo_s_cnt >= 0){ //????????
d0 = detune_tbl[ voice[ a0 ].note_no ] * voice[ a0 ].lfo_m / 128 * voice[ a0 ].lfo_s_cnt / abs(voice[ a0 ].lfo_s);
} else {
d0 = detune_tbl[ voice[ a0 ].note_no-1 ] * voice[ a0 ].lfo_m / 128 * voice[ a0 ].lfo_s_cnt / abs(voice[ a0 ].lfo_s);
}
pDSData[ a0 ]->SetFrequency((DWORD)(voice[ a0 ].freq + d0)); // ?????
if(abs(voice[ a0 ].lfo_s_cnt) == abs(voice[ a0 ].lfo_s)){ //?刺???
voice[ a0 ].lfo_s_ang *= -1;
}
}
//?????????? ?????? ??????????
#define VOICE_KEY_ON 1
#define VOICE_NORMAL 2
#define VOICE_TIE_SET 10
#define VOICE_KEY_OFF 100
#define VOICE_KEY_OFF_FAST 110
#define VOICE_KEY_OFF_WAIT 200
void voice_action( int a0 )
{
DWORD Status = 0;
switch(voice[ a0 ].name){
case VOICE_KEY_ON: //二????
if(voice[ a0 ].delay_cnt){ //?????????
voice[ a0 ].delay_cnt--;
return;
}
pDSData[ a0 ]->SetVolume(volume_tbl[ voice[ a0 ].volume ]); // ????????
pDSData[ a0 ]->SetFrequency((DWORD)voice[ a0 ].freq); // ?????
pDSData[ a0 ]->SetPan(panpot_tbl[ voice[ a0 ].pan ]); // ????????
pDSData[ a0 ]->Play(0, 0, voice[ a0 ].loop_flg); //????
voice[ a0 ].name = VOICE_NORMAL;
voice_lfo( a0 ); //??????
break;
case VOICE_NORMAL: //二?????
voice_lfo( a0 ); //??????
break;
case VOICE_TIE_SET: //???????
pDSData[ a0 ]->SetVolume(volume_tbl[ voice[ a0 ].volume ]); // ????????
pDSData[ a0 ]->SetFrequency((DWORD)voice[ a0 ].freq); // ?????
pDSData[ a0 ]->SetPan(panpot_tbl[ voice[ a0 ].pan ]); // ????????
voice[ a0 ].name = VOICE_NORMAL;
break;
case VOICE_KEY_OFF: //二????
// if( pDSData[ a0 ]->GetStatus( &Status ) == DS_OK ){
/// pDSData[ a0 ]->GetStatus( &Status ); //??????????
/// if( Status & DSBSTATUS_PLAYING || Status & DSBSTATUS_LOOPING ){ //????
if(voice[ a0 ].volume){ //??????????
voice[ a0 ].release_cnt++; //?????阪?????
if(voice[ a0 ].release_spd != voice[ a0 ].release_cnt){
voice_lfo( a0 ); //??????
break; //???????兌??
}
voice[ a0 ].release_cnt = 0; //?????阪??
voice[ a0 ].volume--; //????????
// if(voice[ a0 ].volume < 0){ //??????????
// voice[ a0 ].volume=0; //?????????
// }
pDSData[ a0 ]->SetVolume(volume_tbl[ voice[ a0 ].volume ]); // ?????阪?
voice_lfo( a0 ); //??????
break; //????兌??
}
/// }
pDSData[ a0 ]->Stop(); //????
pDSData[ a0 ]->SetCurrentPosition(0); //
voice[ a0 ].name = VOICE_KEY_OFF_WAIT; //?????┴?
// play_use_task[ voice[ a0 ].track_no ] = -1; //
break;
#if !VOICE_KILL_ON
case VOICE_KEY_OFF_FAST: //﹩?????
pDSData[ a0 ]->Stop(); //????
pDSData[ a0 ]->SetCurrentPosition(0); //
voice[ a0 ].name = 0; //
break;
#endif
}
}
//?????????? ??????????? ??????????
void set_voice_param( int task_no, long note, int delay, int lfo_flg)
{
voice[ task_no ].volume = dataVolume[ch]; // ????????
// voice[ task_no ].freq = freq + dataFrequency[ch]; // ?????
// ?????
if(play_detune[ch]>0){ //???????????
voice[ task_no ].freq = freq_tbl[ note ] + detune_tbl[ note ]*play_detune[ch]/64 + dataFrequency[ch];
} else if(play_detune[ch]<0){ //????????????
voice[ task_no ].freq = freq_tbl[ note ] + detune_tbl[ note-1 ]*play_detune[ch]/64 + dataFrequency[ch];
} else { //?????叉?????
voice[ task_no ].freq = freq_tbl[ note ] + dataFrequency[ch];
}
voice[ task_no ].note_no = note; // ???吻????
voice[ task_no ].pan = dataPan[ch]; // ????????
voice[ task_no ].release_spd = wave[ch]; // ?????????
voice[ task_no ].release_cnt = 0; //
if(voice[ task_no ].tone_no == 12-1){ //??????
voice[ task_no ].loop_flg = DSBPLAY_LOOPING; //
} else {
voice[ task_no ].loop_flg = 0; //
}
if(delay >= 0){ //?????????????
voice[ task_no ].delay_cnt = delay; //
}
if(lfo_flg){ //??????????
voice[ task_no ].lfo_h = play_lfo_h[ ch ]; //??????
voice[ task_no ].lfo_m = play_lfo_m[ ch ]; //
if((voice[ task_no ].lfo_s = play_lfo_s[ ch ]) >= 0){ //
voice[ task_no ].lfo_s_ang = 1; //
} else {
voice[ task_no ].lfo_s_ang = -1; //
}
voice[ task_no ].lfo_s_cnt = 0; //
}
}
//?????????? ??????? ??????????
static int voice_seek_point=0;
int set_tone( int tone, long note, int use_task_cnt, int delay)
{
int d7,d1=0;
for(d7=0;d7<VOICE_MAX;d7++){ //???????Π?
// if( voice[ d7 ].name == 0){ //???
if( voice[ voice_seek_point ].name == 0){ //???
d1=1; //??????
break;
}
voice_seek_point++;
voice_seek_point&=VOICE_MAX-1;
}
if(!d1){ //????????
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "????", "Error", MB_OK); //????兌??
#endif
play_use_task[ch][use_task_cnt]=-1; //??????
return -1;
}
d7 = voice_seek_point;
play_use_task[ch][use_task_cnt]=d7; //????吻?卒㎏
voice[ d7 ].name = VOICE_KEY_ON; //二????
if(voice[ d7 ].tone_no == tone) //可??吻??
goto set_tone_500; //??????
voice[ d7 ].tone_no = tone; //?吻?卒㎏
RELEASE(pDSData[d7]);
if( pDSound->DuplicateSoundBuffer(pDSData_tone[tone],&pDSData[d7]) != DS_OK ){ //????
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "葩秶汒秞buffer囮啖ㄐ", "Error", MB_OK);
#endif
play_use_task[ch][use_task_cnt]=-1; //??????
return -1;
}
set_tone_500:
set_voice_param( d7, note, delay, 1 ); //???????????
return 0;
}
//?????????? ﹩????? ??????????
void stop_voice(void)
{
for(int cnt=0;cnt<play_use_task_cnt[ch];cnt++){
if(play_use_task[ch][cnt]!=-1){ //??????
#if VOICE_KILL_ON
voice_kill_buf[voice_kill_point++]=play_use_task[ch][cnt];
#else
voice[ play_use_task[ch][cnt] ].name = VOICE_KEY_OFF_FAST; //????﹩?????
#endif
play_use_task[ch][cnt]=-1; //????
}
}
}
//?????????? ???????? ??????????
void gate(void)
{
int next_command;
DWORD Status = 0;
if(!play_flg[ ch ]) //于??
return; //????兌??
gate_time[ch]--; //???????
if(!gate_time[ch]){ //??????
if( !d_pedal[ch] ){ //????????
if( !wave[ch] ){ //???????
stop_voice(); //???????
} else {
for(int cnt=0;cnt<play_use_task_cnt[ch];cnt++){
if(play_use_task[ch][cnt]!=-1){ //??????
voice[ play_use_task[ch][cnt] ].name = VOICE_KEY_OFF; //????????
}
}
}
}
}
step_time[ch]--; //?????
if(step_time[ch]>0){ //
return; //???????兌??
} else {
if(!tie_flg[ch]){ //???????
if( !d_pedal[ch] ){ //????????
if( !wave[ch] ){ //???????
stop_voice(); //???????
} else {
for(int cnt=0;cnt<play_use_task_cnt[ch];cnt++){
if(play_use_task[ch][cnt]!=-1){ //??????
voice[ play_use_task[ch][cnt] ].name = VOICE_KEY_OFF; //????????
}
}
}
}
}
gate_100:
next_command = step[ch][step_point[ch]++]; //??????
if(next_command >= 0){ //???吻???
if(play_use_task_cnt[ch]!=1 && tie_flg[ch]==1){ //??????????
tie_flg[ch]=0; //???
}
if(!tie_flg[ch]){ //???????
stop_voice(); //??????于
set_tone( dataToneNo[ch], next_command, 0, 0); //Μ?????
note_old[ch][0] = next_command; //??????吻?卒㎏
} else {
for(int cnt=0;cnt<play_use_task_cnt[ch];cnt++){
//???????
voice[ play_use_task[ch][cnt] ].name = VOICE_TIE_SET;
//???????????
set_voice_param( play_use_task[ch][cnt], next_command, -1, 0 );
note_old[ch][cnt] = next_command; //??????吻?卒㎏
}
}
step_time[ch] = step[ch][step_point[ch]++]; //???????
gate_time[ch] = step[ch][step_point[ch]++]; //??????
if(gate_time[ch]==-1){ //????
tie_flg[ch]=1;
} else {
tie_flg[ch]=0;
}
play_use_task_cnt[ch] = 1; //伶?????
return;
}
if(next_command==MUSIC_WAON){ //????
int waon_cnt,waon_delay,waon_delay_total=0;
waon_cnt = step[ch][step_point[ch]++]; //?????
waon_delay = step[ch][step_point[ch]++]; //????????
if(waon_cnt != play_use_task_cnt[ch] && tie_flg[ch]==1){ //??????????
tie_flg[ch]=0; //???
}
if(!tie_flg[ch]){ //???????
stop_voice(); //??????于
for(int cnt=0;cnt<waon_cnt;cnt++){
//??????
set_tone( dataToneNo[ch], step[ch][step_point[ch]], cnt, waon_delay_total);
note_old[ch][cnt] = step[ch][step_point[ch]++]; //??????吻?卒㎏
waon_delay_total += waon_delay;
}
} else {
for(int cnt=0;cnt<play_use_task_cnt[ch];cnt++){
//???????
voice[ play_use_task[ch][cnt] ].name = VOICE_TIE_SET;
//???????????
set_voice_param( play_use_task[ch][cnt], step[ch][step_point[ch]], -1, 0 );
note_old[ch][cnt] = step[ch][step_point[ch]++]; //??????吻?卒㎏
}
}
step_time[ch] = step[ch][step_point[ch]++]; //???????
gate_time[ch] = step[ch][step_point[ch]++]; //??????
if(gate_time[ch]==-1){ //????
tie_flg[ch]=1;
} else {
tie_flg[ch]=0;
}
play_use_task_cnt[ch] = waon_cnt; //伶?????
return;
}
if(next_command==MUSIC_TEMPO){ //????
tempo.LowPart = step[ch][step_point[ch]++];
goto gate_100;
}
if(next_command==MUSIC_NEIRO_NO){ //??▔??
// change_neiro( ch, step[ch][step_point[ch]++] );
dataToneNo[ch] = step[ch][step_point[ch]++];
goto gate_100;
}
if(next_command==MUSIC_LOOP){ //????
step_point[ch] = step[ch][step_point[ch]];
goto gate_100;
}
if(next_command==MUSIC_KURI_START){ //??刺???
play_kuri_lv[ch]++; //????????
play_kuri_num[play_kuri_lv[ch]][ch] = step[ch][step_point[ch]++];
goto gate_100;
}
if(next_command==MUSIC_KURI_SKIP){ //??刺?Α?
if(play_kuri_num[play_kuri_lv[ch]][ch] == 1){
step_point[ch] = step[ch][step_point[ch]];
play_kuri_lv[ch]--; //????????
} else {
step_point[ch]++;
}
goto gate_100;
}
if(next_command==MUSIC_KURI_RET){ //??刺???
play_kuri_num[play_kuri_lv[ch]][ch]--;
if(play_kuri_num[play_kuri_lv[ch]][ch] > 0){
step_point[ch] = step[ch][step_point[ch]];
} else {
step_point[ch]++;
play_kuri_lv[ch]--; //????????
}
goto gate_100;
}
if(next_command==MUSIC_R){ //??
if(tie_flg[ch]){ //????
for(int cnt=0;cnt<play_use_task_cnt[ch];cnt++){
//???????
voice[ play_use_task[ch][cnt] ].name = VOICE_TIE_SET;
//???????????
set_voice_param( play_use_task[ch][cnt], note_old[ch][cnt], -1, 0 );
}
}
step_time[ch] = step[ch][step_point[ch]++]; //???????
gate_time[ch] = step[ch][step_point[ch]++]; //??????
if(gate_time[ch]==-1){ //????
tie_flg[ch]=1;
} else {
tie_flg[ch]=0;
}
return;
}
if(next_command==MUSIC_LFO_H){ //??????
play_lfo_h[ch]=step[ch][step_point[ch]++];
goto gate_100;
}
if(next_command==MUSIC_LFO_M){ //??????
play_lfo_m[ch]=step[ch][step_point[ch]++];
goto gate_100;
}
if(next_command==MUSIC_LFO_S){ //??????
play_lfo_s[ch]=step[ch][step_point[ch]++];
goto gate_100;
}
if(next_command==MUSIC_PEDAL){ //????????
d_pedal[ch]=step[ch][step_point[ch]++];
goto gate_100;
}
if(next_command==MUSIC_WAVE){ //???????
wave[ch]=step[ch][step_point[ch]++];
goto gate_100;
}
if(next_command==MUSIC_VOL){ //????
dataVolume[ch]=step[ch][step_point[ch]++];
// pDSData[play_use_task[ch]]->SetVolume(dataVolume[ch]);
goto gate_100;
}
if(next_command==MUSIC_DETUNE){ //??????
play_detune[ch] = step[ch][step_point[ch]++];
goto gate_100;
}
if(next_command==MUSIC_FREQ){ //???
dataFrequency[ch]=step[ch][step_point[ch]++];
// pDSData[play_use_task[ch]]->SetFrequency((DWORD)dataFrequency[ch]);
goto gate_100;
}
if(next_command==MUSIC_PAN){ //??????
dataPan[ch]=step[ch][step_point[ch]++];
// pDSData[play_use_task[ch]]->SetPan(dataPan[ch]);
goto gate_100;
}
if(next_command==MUSIC_END){ //??
play_flg[ ch ] = 0;
return;
}
}
}
//void CALLBACK music( HWND hWnd, UINT uMsg, UINT idEvent, DWORD dwTime )
void music( void )
{
int d7;
#if 1
#if THREAD_ON
while(!thread_flg){
#if CLASS_UP
//Sleep(1); //??
#endif
#endif
LARGE_INTEGER d0;
QueryPerformanceCounter( &d0 );
if((d_cnt.LowPart + tempo.LowPart) > d0.LowPart)
#if THREAD_ON
{
continue;
}
#else
return;
#endif
#if !DEBUG_ON
if(abs(d0.LowPart - d_cnt.LowPart) > 3333333)
#if THREAD_ON
continue;
#else
return;
#endif
#endif
d_cnt.LowPart += tempo.LowPart;
#endif
if(!pause_flg){
#if VOICE_KILL_ON
for( d7 = 0 ; d7 < voice_kill_point ; d7++ ){
voice[ voice_kill_buf[ d7 ] ].name = 0; //??????
pDSData[ voice_kill_buf[ d7 ] ]->Stop(); //????
pDSData[ voice_kill_buf[ d7 ] ]->SetCurrentPosition(0); //
}
voice_kill_point=0;
#endif
for( d7 = 0 ; d7 < VOICE_MAX ; d7++ ){
if(voice[ d7 ].name){
voice_action( d7 );
}
}
for( ch = 0 ; ch < TRACK_MAX ; ch++ ){
if(play_track_flg[ ch ])
gate();
}
} else {
#if CLASS_UP
//Sleep(8); //????
#endif
QueryPerformanceCounter( &d_cnt );
}
#if 0 //--------------
#if CLASS_UP
#if MODE98
if( tempo.LowPart > 10080*2 ) //?????????
#else
if( tempo.LowPart > 10080 ) //?????????
#endif
Sleep(2); //??
else
Sleep(1); //??
#endif
#endif //--------------
#if THREAD_ON
}
thread_flg=2;
ExitThread( TRUE );
#endif
d7=0;
return;
}
/*--------------------------------------------
??????????
---------------------------------------------*/
int t_music_init()
{
if( GetAsyncKeyState( 0x10 ) & 0x8000 ){ //?????????????
dsound_flg = -1;
return FALSE;
}
if(!InitDSound()){
dsound_flg = -1;
return FALSE;
}
music_init(); //????????
/*
//cary 黍秞氈
if(!music_read()){
play_start();
} else {
play_stop();
dsound_flg = -1;
return FALSE;
}
QueryPerformanceCounter(&d_cnt);
#if THREAD_ON
static DWORD dwChildThreadId = 0;
HANDLE hChildThred = CreateThread( NULL,
16384,
(LPTHREAD_START_ROUTINE)music,
// (LPVOID)hWnd,
NULL,
NULL,
&dwChildThreadId );
#if CLASS_UP
SetThreadPriority(hChildThred,THREAD_PRIORITY_HIGHEST);
#endif
#endif
*/
return TRUE;
}
/*--------------------------------------------
????????
---------------------------------------------*/
void t_music_end()
{
//?????????
if(dsound_flg == -1)
return;
#if THREAD_ON
// thread_flg=1;
// while(thread_flg!=2);
#endif
EndApp();
}
#if 0
//?????????? ???? ??????????
//static voice_seek_point=0;
int play_se(int tone, int x, int y)
{
int distance;
//?????????
if(dsound_flg == -1){
return -1;
}
if(tone > TONE_MAX){ //???????
return -1;
}
if(tone_tbl[ tone ].voice_place == -1){ //叉????
return -1;
}
if(tone_tbl[ tone ].play_time){ //??????
return 0;
}
if(voice[ voice_seek_point ].tone_no != tone){ //可??吻??????
voice[ voice_seek_point ].tone_no = tone; //?吻?卒㎏
RELEASE(pDSData[voice_seek_point]); //??
//????
if( pDSound->DuplicateSoundBuffer(pDSData_tone[tone_tbl[ tone ].voice_place],&pDSData[voice_seek_point]) != DS_OK ){
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "葩秶汒秞buffer囮啖ㄐ", "Error", MB_OK);
#endif
return -1;
}
}
if(stereo_flg == T_MUSIC_MONO){ //??????
distance = 127 * tone_tbl[ tone ].voice_volume / 10;
x = 64;
} else { //??????
distance = abs(y - 240); //??????火???
y = abs(x - 320); //??????火???
if(distance < y) //?????
distance = y; //
distance = distance << 4; //?????π?阪?
distance /= 0x5a; //
if(distance >= 127) //吳????
return 0; //?????
x /= 5; //?????π?阪?
if(x < 0) //
x = 0; //
if(x > 127) //
x = 127; //
distance = (127 - distance) * tone_tbl[ tone ].voice_volume / 10; //???????
}
pDSData[ voice_seek_point ]->SetVolume(volume_tbl[ distance ]); // ????????
pDSData[ voice_seek_point ]->SetPan(panpot_tbl[ x ]); // ????????
pDSData[ voice_seek_point ]->Play(0, 0, 0); //????
voice_seek_point = voice_seek_point++; //??????
voice_seek_point&=VOICE_MAX-1; //
tone_tbl[ tone ].play_time = 8; //???????
return 0;
}
#else
//??????????????? ?? ???????????????
HANDLE hEvent[3]; // ?????????
HANDLE hThreadHandle; // ?????????????
DWORD dwThreadID; // ???????????
/*-------------------------------------------
????????????????????
--------------------------------------------*/
// ???????????仔??﹨▍??
struct SoundData {
LPDIRECTSOUNDBUFFER pDSBuffer; // ????????????????
HANDLE *phEvent; // ??????二ρ?ㄅ????????????????????????
DWORD dwEventNum; // ??????
DWORD dwStopEventNum; // ?于??????????????????
LPBYTE lpWaveData; // ???????????
DWORD dwWaveSize; // ???????????????
DWORD dwBlock_size; // ??????????????????
} sd;
// ?????????
void Block_Copy(LPDIRECTSOUNDBUFFER lpBuffer,
DWORD blockadd, DWORD blocksize,
LPBYTE lpWave, LONG &waveAdd, LONG waveSize)
{
LPBYTE lpBlockAdd1, lpBlockAdd2;
DWORD blockSize1, blockSize2;
LONG ws = waveSize - waveAdd;
// ????????
HRESULT hr = lpBuffer->Lock(blockadd, blocksize, (LPVOID*)&lpBlockAdd1, &blockSize1, (LPVOID*)&lpBlockAdd2, &blockSize2, 0);
if(hr == DS_OK)
{
if(ws < (long)blockSize1)
{
CopyMemory(lpBlockAdd1, lpWave + waveAdd, ws);
waveAdd = blockSize1 - ws;
CopyMemory(lpBlockAdd1 + ws, lpWave + thread_loop_start, waveAdd);
waveAdd += thread_loop_start;
}
else
{
CopyMemory(lpBlockAdd1, lpWave + waveAdd, blockSize1);
waveAdd += blockSize1;
}
if(lpBlockAdd2)
{
ws = waveSize - waveAdd;
if(ws < (long)blockSize2)
{
CopyMemory(lpBlockAdd1, lpWave + waveAdd, ws);
waveAdd = blockSize2 - ws;
CopyMemory(lpBlockAdd1 + ws, lpWave + thread_loop_start, waveAdd);
waveAdd += thread_loop_start;
}
else
{
CopyMemory(lpBlockAdd2, lpWave + waveAdd, blockSize2);
waveAdd += blockSize2;
}
}
lpBuffer->Unlock(lpBlockAdd1, blockSize1, lpBlockAdd2, blockSize2);
}
}
static LONG wave_count = 0;
static LONG wave_address = 0;
static LONG buffer_address = 0;
volatile static int thread_start_flg = 0;
// ??????????
DWORD WINAPI MyThreadFunc(LPVOID param)
{
LONG waveAdd = 0;
// ??????????????????????
Block_Copy(sd.pDSBuffer, 0, sd.dwBlock_size, sd.lpWaveData, waveAdd, sd.dwWaveSize);
thread_start_flg = 1;
while(TRUE)
{
DWORD i = WaitForMultipleObjects(sd.dwEventNum, sd.phEvent, FALSE, INFINITE);
wave_count++;
switch(i)
{
case WAIT_OBJECT_0 + 1:
// ?吻???????????
buffer_address = 0; wave_address = waveAdd;
Block_Copy(sd.pDSBuffer, 0, sd.dwBlock_size, sd.lpWaveData, waveAdd, sd.dwWaveSize);
break;
case WAIT_OBJECT_0:
// ?吻???????????
buffer_address = sd.dwBlock_size; wave_address = waveAdd;
Block_Copy(sd.pDSBuffer, sd.dwBlock_size, sd.dwBlock_size, sd.lpWaveData, waveAdd, sd.dwWaveSize);
break;
case WAIT_OBJECT_0 + 2:
// ?????????????
exit_thread_flg = 1;
ExitThread(TRUE);
default:
// ?????????????
exit_thread_flg = 1;
ExitThread(TRUE);
}
// InvalidateRect(hwndApp, NULL, TRUE);
}
return 0L;
}
//
// ??????????台
//
// ? ?ㄩ pWfmtx ... ???????????
// DataSize ... ????????
// ppData ... 台????????????????
// ??πㄩ TRUE ... ?
// FALSE ... ?
static BOOL dwSoundInit2( WAVEFORMATEX *pWfmtx, DWORD DataSize, LPDIRECTSOUNDBUFFER *ppData, HMMIO hmmio )
{
// ?????????????????????
WAVEFORMATEX pcmwf = *pWfmtx;
DSBUFFERDESC dsbufferdesc;
HRESULT ret;
//??????
if(stream_flg == 1){
RELEASE(pDSNotify);
stream_flg = 0;
}
//??????????????
memset( &dsbufferdesc , 0 , sizeof( DSBUFFERDESC ) );
dsbufferdesc.dwSize = sizeof( DSBUFFERDESC );
dsbufferdesc.dwFlags = DSBCAPS_CTRLPOSITIONNOTIFY | /*DSBCAPS_CTRLDEFAULT*/DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY | DSBCAPS_GETCURRENTPOSITION2;
// dsbufferdesc.dwFlags = DSBCAPS_CTRLPOSITIONNOTIFY | DSBCAPS_STATIC | DSBCAPS_CTRLDEFAULT | DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS;
dsbufferdesc.dwBufferBytes = DataSize;
dsbufferdesc.lpwfxFormat = pWfmtx;
if ( pDSound->CreateSoundBuffer( &dsbufferdesc , ppData , NULL ) != DS_OK ){
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "膘蕾汒秞腔buffer囮啖ㄐ", "Error", MB_OK);
#endif
return FALSE;
}
//??????????
if( WaveDataRead( hmmio, &DataSize, pDSData_stream ) == FALSE ){
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "黍WAV紫囮啖ㄐ", "Error", MB_OK);
#endif
return FALSE;
}
// ?????????????????????
// WAVEFORMATEX pcmwf = *pWaveHeader;
DSBUFFERDESC dsbdesc;
// DSBUFFERDESC?﹨▍? 叉
ZeroMemory(&dsbdesc, sizeof(DSBUFFERDESC));
dsbdesc.dwSize = sizeof(DSBUFFERDESC);
#if ACTIVE
dsbdesc.dwFlags = DSBCAPS_CTRLPOSITIONNOTIFY | /*DSBCAPS_CTRLDEFAULT*/DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY | DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS;
#else
dsbdesc.dwFlags = DSBCAPS_CTRLPOSITIONNOTIFY | /*DSBCAPS_CTRLDEFAULT*/DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY | DSBCAPS_GETCURRENTPOSITION2;
#endif
// ? 叉??Wave??????????企????????
dsbdesc.dwBufferBytes = 2 * pcmwf.nAvgBytesPerSec;
dsbdesc.lpwfxFormat = &pcmwf;
ret = pDSound->CreateSoundBuffer(&dsbdesc, &pDSData_tone[ TONE_MAX ], NULL);
if(ret != DS_OK) {
// ????????
// RELEASE(pDSound);
RELEASE(pDSData_stream);
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "膘蕾汒秞腔buffer囮啖ㄐ", "Error", MB_OK);
#endif
return FALSE;
}
// DirectSoundNotify??????????
ret = pDSData_tone[ TONE_MAX ]->QueryInterface(IID_IDirectSoundNotify, (LPVOID*)&pDSNotify);
if(ret != DS_OK)
{
// RELEASE(pDSound);
RELEASE(pDSData_stream);
RELEASE(pDSData_tone[ TONE_MAX ]);
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "膘蕾DirectSoundNotify囮啖ㄐ", "Error", MB_OK);
#endif
return FALSE;
// ???
}
// ?????????????
hEvent[0] = CreateEvent(NULL, FALSE, FALSE, NULL);
hEvent[1] = CreateEvent(NULL, FALSE, FALSE, NULL);
hEvent[2] = CreateEvent(NULL, FALSE, FALSE, NULL);
// DirectSoundNotify??????? 叉??
// ?﹨▍????
DSBPOSITIONNOTIFY pn[3];
pn[0].dwOffset = 0; // ?企?
pn[0].hEventNotify = hEvent[0];
pn[1].dwOffset = 1 * pcmwf.nAvgBytesPerSec; // ?企?
pn[1].hEventNotify = hEvent[1];
pn[2].dwOffset = DSBPN_OFFSETSTOP; // ?于
pn[2].hEventNotify = hEvent[2]; // ??????????????于??????????
// 于?ㄅ 叉
HRESULT hr;
hr = pDSNotify->SetNotificationPositions(3, pn);
if(hr != DS_OK)
{
//  叉?
RELEASE(pDSNotify);
// RELEASE(pDSound);
RELEASE(pDSData_stream);
RELEASE(pDSData_tone[ TONE_MAX ]);
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "扢隅DirectSoundNotify囮啖ㄐ", "Error", MB_OK);
#endif
return FALSE;
}
stream_flg = 1; //???????
// ??????????????
thread_start_flg = 0;
// ?????????
sd.pDSBuffer = pDSData_tone[ TONE_MAX ]; // ??????????DirectSoundBuffer??????
sd.phEvent = hEvent; // 4.4.????????????????
sd.dwEventNum = 3; // ????????????
sd.dwStopEventNum = 2; // ??????????????于?????
sd.lpWaveData = pDSbuffData; // ???Wave????????? 叉?
sd.dwWaveSize = DataSize; // ???Wave???????? 叉?
sd.dwBlock_size = pcmwf.nAvgBytesPerSec; // 44.1kHz???????????
// ??????????
hThreadHandle = CreateThread(NULL, 0, MyThreadFunc, &sd, 0, &dwThreadID);
if(hThreadHandle == NULL)
{
#ifdef _STONDEBUG_
// ???????
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "膘蕾Thread囮啖ㄐ", "Error", MB_OK);
#endif
#endif
return FALSE;
}
// ??????????┴?
while(1){
if(thread_start_flg)
break;
}
// SetThreadPriority(hThreadHandle,THREAD_PRIORITY_HIGHEST);
// SetThreadPriority(hThreadHandle,THREAD_PRIORITY_ABOVE_NORMAL);
// pDSData_tone[ TONE_MAX ]->Play(0, 0, DSBPLAY_LOOPING);
return TRUE;
}
//??????????????? ?? ???????????????
int t_music_bgm_no = -1;
char t_music_bgm_pitch[16]={
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
};
//aaa
//?????????? ???? ??????????
#define BGM_AUTO_LOOP 1
T_MUSIC_BGM bgm_tbl[] = {
{"data\\bgm\\sabgm_s0.wav", 110,0,0}, //00 ????
{"data\\bgm\\sabgm_s1.wav", 120,0,0}, //01 ????
{"data\\bgm\\sabgm_s1.wav", 105,2,0}, //02 ???︻??代??
{"data\\bgm\\sabgm_t1.wav", 127,2,0}, //03 ?????代??
{"data\\bgm\\sabgm_t0.wav", 95,2,0}, //04 ??代??
{"data\\bgm\\sabgm_b0.wav", 122,1,0}, //05 ???·卯??!卡?
{"data\\bgm\\sabgm_b1.wav", 122,2,0}, //06 ???·卯??代??
{"data\\bgm\\sabgm_d0.wav", 120,1,0}, //07 ???叩??!卡?
{"data\\bgm\\sabgm_d1.wav", 105,1,0}, //08 吝?叩???!卡?
{"data\\bgm\\sabgm_d2.wav", 100,2,0}, //09 吝?叩???代??
{"data\\bgm\\sabgm_f0.wav", 127,2,0}, //10 ?????代??
{"data\\bgm\\sabgm_f1.wav", 100,2,0}, //11 ?????代??
{"data\\bgm\\sabgm_b3.wav", 110,2,0}, //12 陔腔珨啜桵須
{"data\\bgm\\sabgm_b2.wav", 110,2,0}, //13 陔腔boss桵須
{"data\\bgm\\sabgm_b4.wav", 110,2,0}, //14 陔腔郔綴boss桵須
{"data\\bgm\\sabgm_f2.wav", 110,2,0}, //15 畛菟湮翻
{"data\\bgm\\sabgm_t2.wav", 110,2,0}, //16 畛菟埶
{"data\\bgm\\sabgm_t3.wav", 110,2,0}, //17 華傑
{"data\\bgm\\sabgm_t4.wav", 110,2,0}, //18 阨傑
{"data\\bgm\\sabgm_t5.wav", 110,2,0}, //19 鳶傑
{"data\\bgm\\sabgm_t6.wav", 110,2,0}, //20 瑞傑
{"data\\bgm\\sabgm_t7.wav", 110,2,0}, //21 傭軯
#ifdef _NEWMUSICFILE6_0 // Syu ADD 6.0 陔華芞秞氈
{"data\\bgm\\sabgm_t8.wav", 110,2,0}, //22 漆菁韌貓
{"data\\bgm\\sabgm_t9.wav", 110,2,0}, //23 漆菁埻
{"data\\bgm\\sabgm_t10.wav", 110,2,0}, //24 漆菁桵須
#endif
{"data\\bgm\\sabgm_t11.wav", 110,2,0}, //25
{"data\\bgm\\sabgm_t12.wav", 110,2,0}, //26
#ifdef _NEW_MUISC_
{"data\\bgm\\sabgm_s2.wav", 110,2,0}, //26
#endif
};
int play_bgm(int bgm_no)
{
if (MuteFlag) return -1;
HMMIO hmmio; //????????
WAVEFORMATEX Wfmtx; //WAVE??????????????
DWORD DataSize; //?????????
DWORD WaveSize; //Wave????????
// bgm_no = 0;
//cary 2001 7 17
if( bgm_no < 0)
bgm_no = 0;
//??????????
t_music_fade_flg = 0;
if(dsound_flg == -1)
return -1;
//???????????
if(t_music_bgm_no != -1){
//????于?
stop_thread();
}
//????????????
// if( (hmmio = mmioOpen(fname[bgm_no], NULL, MMIO_READ | MMIO_ALLOCBUF )) == NULL){
if( (hmmio = mmioOpen(bgm_tbl[bgm_no].fname, NULL, MMIO_READ | MMIO_ALLOCBUF )) == NULL){
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "湖羲WAV紫囮啖ㄐ", "Error", MB_OK);
#endif
return FALSE;
}
//???????????
if( WaveFormatRead( hmmio , &Wfmtx , &WaveSize ) == FALSE ){
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "黍汒秞跡宒囮啖ㄐ", "Error", MB_OK);
#endif
return FALSE;
}
DataSize = WaveSize;
//??????????????
if(bgm_tbl[bgm_no].loop_flg == 2){ //代??????
thread_stop_flg = 1; //?????
//???????
#if BGM_AUTO_LOOP
FILE *fp;
int d0,d1,d2;
fp = fopen( bgm_tbl[bgm_no].fname, "rb" );
if( fp == NULL ){
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "湖羲汒秞紫囮啖ㄐ", "Error", MB_OK);
#endif
return FALSE;
}
d2 = 8; //??????????????
d2 += 4; //??????????????
d2 += 4; //???? ?????????
d2 += 16; //?????????
fseek(fp,d2,SEEK_CUR); //??????????去
d0 = fgetc(fp); //?????????????
d0 |= fgetc(fp) << 8; //
d2 = 2; //????????
d2 += 12+DataSize; //?????????? ? ??????????
if(DataSize&1){ //????????
d2++; //?????
}
d2 += 12*4; //??????????
fseek(fp,d2,SEEK_CUR); //??????????去
//?????ㄅ
d1 = fgetc(fp); //??????????
d1 |= fgetc(fp) << 8; //
d1 |= fgetc(fp) << 16; //
d1 |= fgetc(fp) << 24; //
if( d1 < 0)
thread_loop_start = 0;
else
thread_loop_start = d1 * d0; //????ㄅ???
//?????ㄅ
d1 = fgetc(fp);
d1 |= fgetc(fp) << 8;
d1 |= fgetc(fp) << 16;
d1 |= fgetc(fp) << 24;
// thread_loop_end = d1 * d0;
fclose(fp);
#else
thread_loop_start = bgm_tbl[bgm_no].loop_point << 1;
#endif
// thread_loop_start = bgm_tbl[bgm_no].loop_start;
// thread_loop_end = bgm_tbl[bgm_no].loop_end;
// if( dwSoundInit2( &Wfmtx, DataSize, &pDSData_tone[TONE_MAX], hmmio ) == FALSE ){
if( dwSoundInit2( &Wfmtx, DataSize, &pDSData_stream, hmmio ) == FALSE ){
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "膘蕾汒秞腔buffer囮啖ㄐ", "Error", MB_OK);
#endif
return FALSE;
}
#if BGM_AUTO_LOOP
if( d1 > 0)
sd.dwWaveSize = d1 * d0; //?????ㄅ????????????????
#endif
} else {
thread_stop_flg = 0; //?????
if( dwSoundInit( &Wfmtx, DataSize, &pDSData_tone[TONE_MAX] ) == FALSE ){
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "膘蕾汒秞腔buffer囮啖ㄐ", "Error", MB_OK);
#endif
return FALSE;
}
//???????
if( WaveDataRead( hmmio, &DataSize, pDSData_tone[TONE_MAX] ) == FALSE ){
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "黍WAV紫腔訧蹋囮啖ㄐ", "Error", MB_OK);
#endif
return FALSE;
}
}
mmioClose( hmmio , 0 );
//??????
pDSData_tone[ TONE_MAX ]->SetFrequency((DWORD)freq_tbl[36+1+t_music_bgm_pitch[bgm_no]]);
//?????
pDSData_tone[ TONE_MAX ]->SetVolume(volume_tbl[ bgm_tbl[bgm_no].volume * t_music_bgm_volume / 15 ]); // ????????
//?????
if(bgm_tbl[bgm_no].loop_flg){ //?????
pDSData_tone[ TONE_MAX ]->Play(0, 0, DSBPLAY_LOOPING);
} else {
pDSData_tone[ TONE_MAX ]->Play(0, 0, 0);
}
//?????吻?卒㎏
t_music_bgm_no = bgm_no;
if(t_music_bgm_no < 0) t_music_bgm_no=0;
// ????????
NowTime = TimeGetTime();
//????????
t_music_playing_flg = 1;
//?????吻?卒㎏
// map_bgm_no = t_music_bgm_no;
return TRUE;
}
//?????????? ???????? ??????????
void bgm_volume_change(void)
{
if (MuteFlag) return;
if(dsound_flg == -1)
return;
if(t_music_bgm_volume > 15){ //吳????
t_music_bgm_volume = 15;
}
if(t_music_bgm_volume < 0){ //吳????
t_music_bgm_volume = 0;
}
//?????
if (pDSData_tone[TONE_MAX])
{
pDSData_tone[TONE_MAX]->SetVolume(volume_tbl[bgm_tbl[t_music_bgm_no].volume * t_music_bgm_volume / 15]); // ????????
}
}
//?????????? ????????? ??????????
void set_gbm_pitch(void)
{
if(dsound_flg == -1)
return;
//??????
pDSData_tone[ TONE_MAX ]->SetFrequency((DWORD)freq_tbl[36+1+t_music_bgm_pitch[t_music_bgm_no]]);
}
int t_music_se_no = -1;
//?????????? ???? ??????????
//static voice_seek_point=0;
int play_se(int tone, int x, int y)
{
if (MuteFlag) return -1;
int d0;
int total_level = 127;
t_music_se_no = tone;
if(dsound_flg == -1)
return -1;
if(tone > TONE_MAX){ //???????
return -1;
}
if(tone_tbl[ tone ].voice_place == -1){ //叉????
return -1;
}
if(tone_tbl[ tone ].play_time){ //??????
return 0;
}
//〈???吻????
d0 = voice[ voice_seek_point ].tone_no;
if(voice[ voice_seek_point ].tone_no != tone){ //可??吻??????
voice[ voice_seek_point ].tone_no = tone; //?吻?卒㎏
//???????????佃??????
if(d0 != -2){
RELEASE(pDSData[voice_seek_point]); //??
}
//????
if( pDSound->DuplicateSoundBuffer(pDSData_tone[tone_tbl[ tone ].voice_place],&pDSData[voice_seek_point]) != DS_OK ){
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "葩秶汒秞buffer囮啖ㄐ", "Error", MB_OK);
#endif
//???????????佃???????
voice[ voice_seek_point ].tone_no = -2;
return -1;
}
} else {
pDSData[voice_seek_point]->SetCurrentPosition(0); //?????????
}
#if 0
total_level = abs(y - 240); //??????火???
y = abs(x - 320) >> 1; //??????火???
if(total_level < y) //?????
total_level = y; //
total_level = total_level << 4; //?????π?阪?
total_level /= 0x5a; //
if(total_level >= 127) //吳????
return 0; //?????
total_level = 127 - total_level; //
#endif
if(stereo_flg == T_MUSIC_MONO){ //??????
x = 64;
} else {
x /= 5; //?????π?阪?
if(x < 0) //
x = 0; //
if(x > 127) //
x = 127; //
}
//??????
total_level = 127 * tone_tbl[ tone ].voice_volume / 127;
// total_level = total_level * tone_tbl[ tone ].voice_volume / 127;
//?????????
total_level = total_level * t_music_se_volume / 15;
pDSData[ voice_seek_point ]->SetVolume(volume_tbl[ total_level ]); // ????????
pDSData[ voice_seek_point ]->SetPan(panpot_tbl[ x ]); // ????????
if(tone_tbl[ tone ].voice_note){ //???吻?叉??
pDSData[ voice_seek_point ]->SetFrequency(
(DWORD)freq_tbl[tone_tbl[ tone ].voice_note + tone_tbl[ tone ].voice_rate]);
}
#if 0
if(tone_tbl[ tone ].voice_loop == 0 ){ //???????
pDSData[ voice_seek_point ]->Play(0, 0, 0); //????
} else {
voice[ voice_seek_point ].loop_flg = 1; //????
pDSData[ voice_seek_point ]->Play(0, 0, DSBPLAY_LOOPING); //????
}
#else
pDSData[ voice_seek_point ]->Play(0, 0, 0); //????
#endif
while(1){
voice_seek_point++; //??????
voice_seek_point&=VOICE_MAX-1; //
if(voice[ voice_seek_point ].loop_flg == 0){ //??????????
break;
}
}
tone_tbl[ tone ].play_time = 5; //???????
return 0;
}
#endif
//?????????? ???? ??????????
//int play_environment_tone(int tone, int distance, int voice_address, int panpot, int new_flg)
int play_environment_tone(int tbl_no, int new_flg)
{
int d0;
// int total_level;
// t_music_se_no = tone;
if (MuteFlag) return -1;
if(dsound_flg == -1)
return -1;
if(env_tbl[tbl_no].tone > TONE_MAX){ //???????
return -1;
}
if(tone_tbl[ env_tbl[tbl_no].tone ].voice_place == -1){ //叉????
return -1;
}
// if(tone_tbl[ env_tbl[tbl_no].tone ].play_time){ //??????
// return 0;
// }
env_tbl[tbl_no].distance = env_tbl[tbl_no].distance << 4; //?????π?阪?
env_tbl[tbl_no].distance /= 0x6a; //
// if(env_tbl[tbl_no].distance >= 127) //吳????
// return 0; //?????
if(env_tbl[tbl_no].distance >= 127) //吳????
env_tbl[tbl_no].distance = 127; //?????
if(new_flg){ //???
//〈???吻????
d0 = voice[ env_tbl[tbl_no].voice_address ].tone_no;
if(voice[ env_tbl[tbl_no].voice_address ].tone_no != env_tbl[tbl_no].tone){ //可??吻??????
voice[ env_tbl[tbl_no].voice_address ].tone_no = env_tbl[tbl_no].tone; //?吻?卒㎏
//???????????佃??????
if(d0 != -2){
RELEASE(pDSData[env_tbl[tbl_no].voice_address]); //??
}
//????
if( pDSound->DuplicateSoundBuffer(pDSData_tone[tone_tbl[ env_tbl[tbl_no].tone ].voice_place],&pDSData[env_tbl[tbl_no].voice_address]) != DS_OK ){
#ifdef _STONDEBUG_
MessageBoxNew(hWnd, "葩秶汒秞buffer囮啖ㄐ", "Error", MB_OK);
#endif
//???????????佃???????
voice[ env_tbl[tbl_no].voice_address ].tone_no = -2;
return -1;
}
}
}
//??????
// total_level = (127 - env_tbl[tbl_no].volume) * tone_tbl[ env_tbl[tbl_no].tone ].voice_volume / 127;
//?????????
// total_level = total_level * t_music_se_volume / 15;
//??????阪?????
if(env_tbl[tbl_no].volume != env_tbl[tbl_no].volume_old){
// ????????
pDSData[ env_tbl[tbl_no].voice_address ]->SetVolume(volume_tbl[ env_tbl[tbl_no].volume ]);
env_tbl[tbl_no].volume_old = env_tbl[tbl_no].volume;
}
//??????阪?????
if(env_tbl[tbl_no].panpot != env_tbl[tbl_no].panpot_old){
// ????????
pDSData[ env_tbl[tbl_no].voice_address ]->SetPan(panpot_tbl[ env_tbl[tbl_no].panpot ]);
env_tbl[tbl_no].panpot_old = env_tbl[tbl_no].panpot;
}
//???吻?叉??
if(tone_tbl[ env_tbl[tbl_no].tone ].voice_note){
pDSData[ env_tbl[tbl_no].voice_address ]->SetFrequency(
(DWORD)freq_tbl[tone_tbl[ env_tbl[tbl_no].tone ].voice_note + tone_tbl[ env_tbl[tbl_no].tone ].voice_rate]);
}
if(new_flg){ //???
pDSData[ env_tbl[tbl_no].voice_address ]->SetCurrentPosition(0); //
if(tone_tbl[ env_tbl[tbl_no].tone ].voice_loop == 0 ){ //???????
pDSData[ env_tbl[tbl_no].voice_address ]->Play(0, 0, 0); //????
} else {
voice[ env_tbl[tbl_no].voice_address ].loop_flg = 1; //????
pDSData[ env_tbl[tbl_no].voice_address ]->Play(0, 0, DSBPLAY_LOOPING); //????
}
while(1){
voice_seek_point++; //??????
voice_seek_point&=VOICE_MAX-1; //
if(voice[ voice_seek_point ].loop_flg == 0){ //??????????
break;
}
}
}
// tone_tbl[ env_tbl[tbl_no].tone ].play_time = 8; //???????
return 0;
}
//?????????? ?????????? ??????????
void play_map_bgm_check(void)
{
switch(map_bgm_vct_no){
case 0: //???阪?????
if(draw_map_bgm_flg){
if(t_music_bgm_no != map_bgm_no){ //???阪???
map_bgm_vct_no++; //?????????
}
}
draw_map_bgm_flg = 0;
break;
case 1: //???????????
fade_out_bgm();
map_bgm_vct_no++; //????????┴??
break;
case 2: //???????????┴?
if(t_music_fade_flg == 0){ //??????????
map_bgm_vct_no++; //?????
}
break;
case 3: //????
play_bgm(map_bgm_no); //????
map_bgm_vct_no = 0; //???阪??????
break;
}
}
//?????????? ??????? ??????????
int BakBgm = 0;
int play_map_bgm(int tone)
{
// shan 2002/01/18
#ifdef _NEWMUSICFILE6_0 // Syu ADD 6.0 陔華芞秞氈
if( BakBgm != tone && tone >= 40 && tone <= 55 )
#else
if( BakBgm != tone && tone >= 40 && tone <= 53 )
#endif
{
FILE *fp;
char filename[255];
char vTemp[32];
BakBgm = tone;
sprintf_s( filename, "map\\bgm%d.dat", sCharSide);
sprintf_s( vTemp, "%d", tone);
if( (fp = fopen( filename, "rb+" ))==NULL )
{
_mkdir( "map" );
fp = fopen( filename, "wb" );
fclose( fp );
if( (fp = fopen( filename, "rb+" ))==NULL )
return FALSE;
}
fwrite( vTemp, sizeof(char), 2, fp );
fclose (fp);
}
switch(tone){
//?????
case 40: //???
map_bgm_no = 4;
break;
case 41: //??
map_bgm_no = 3;
break;
case 42: //叩??
map_bgm_no = 7;
break;
case 43: //叩??
map_bgm_no = 8;
break;
case 44: //叩??
map_bgm_no = 9;
break;
case 45: //?????
map_bgm_no = 10;
break;
case 46: //????????????
map_bgm_no = 11;
break;
case 47: //畛菟湮翻
map_bgm_no = 15;
break;
case 48: //畛菟埶
map_bgm_no = 16;
break;
case 49: //傭部
map_bgm_no = 21;
break;
case 50: //華傑
map_bgm_no = 17;
break;
case 51: //阨傑
map_bgm_no = 18;
break;
case 52: //鳶傑
map_bgm_no = 19;
break;
case 53: //瑞傑
map_bgm_no = 20;
break;
#ifdef _NEWMUSICFILE6_0 // Syu ADD 6.0 陔華芞秞氈
case 54:
map_bgm_no = 22; // 漆菁韌貓
break;
case 55:
map_bgm_no = 23; // 漆菁埻
break;
#endif
}
return 0;
}
//?????????? ???? ??????????
int play_environment(int tone, int x, int y)
{
int d0,d1,distance,volume;
d0 = d1 = 0;
float dx, dy;
if (MuteFlag) return 0;
// tone = 157;
if(tone < 20 || tone > 37){ //阪??π??
return 0; //?????
}
switch(tone){
case 28: //???
if(SaTimeZoneNo != LS_MORNING){ //??????
return 0; //?????
}
break;
case 29: //?
if(SaTimeZoneNo != LS_NIGHT){ //??????
return 0; //?????
}
break;
case 37: //??
if(SaTimeZoneNo == LS_MORNING){ //???
return 0; //?????
}
if(SaTimeZoneNo == LS_NIGHT){ //???
tone = 29; //??阪?
break;
}
break;
}
dx = (float)(x - 320);
dy = (float)(y - 240);
distance = (int)sqrt( (double)(dx*dx+dy*dy) );
volume = distance << 4; //?????π?阪?
volume /= 0x6a; //
if(volume >= 127) //吳????
return 0; //?????
d0 = tone - 20;
tone = 151 + d0;
if(env_tbl[d0].count == 0){ //???
//???向
env_tbl[d0].distance = distance;
volume = (127 - volume) * tone_tbl[ tone ].voice_volume / 127;
env_tbl[d0].volume = volume * t_music_se_volume / 15;
d1 = 1; //????????
if(env_tbl[d0].voice_address == -1){ //???
env_tbl[d0].tone = tone;
}
} else {
//???????向
if(env_tbl[d0].distance > distance){
env_tbl[d0].distance = distance;
volume = (127 - volume) * tone_tbl[ tone ].voice_volume / 127;
env_tbl[d0].volume = volume * t_music_se_volume / 15;
d1 = 1; //????????
}
}
//????
if(d1){
env_tbl[d0].side = x;
}
env_tbl[d0].count++;
return 0;
}
//?????????? ??????? ??????????
void play_environment_check(void)
{
if(t_music_bgm_volume==1) return;
int d0,d1,d3,d7;
for(d7=0; d7<MAX_ENV; d7++){
if(env_tbl[d7].count == 0){ //?????
if(env_tbl[d7].voice_address != -1){ //???
pDSData[ env_tbl[d7].voice_address ]->Stop(); //????
voice[ env_tbl[d7].voice_address ].loop_flg = 0; //?????
env_tbl[d7].voice_address = -1;
}
continue;
}
if(env_tbl[d7].voice_address == -1){ //???
env_tbl[d7].voice_address = voice_seek_point;
env_tbl[d7].volume_old = -1;
env_tbl[d7].panpot_old = -1;
d0 = 1;
} else {
d0 = 0;
}
if(stereo_flg == T_MUSIC_MONO){ //??????
env_tbl[d7].panpot = d1 = 64;
} else {
d1 = env_tbl[d7].side / 5; //?????π?阪?
if(d1 < 0) //
d1 = 0; //
if(d1 > 127) //
d1 = 127; //
}
if(d0){ //???
env_tbl[d7].panpot = d1;
} else {
d3 = d1 - env_tbl[d7].panpot;
if(d3 > 2)
d3 = 2;
if(d3 < -2)
d3 = -2;
//????? 叉
env_tbl[d7].panpot += d3;
}
// play_environment_tone(env_tbl[d7].tone, env_tbl[d7].distance, env_tbl[d7].voice_address, env_tbl[d7].panpot, d0);
play_environment_tone(d7, d0);
env_tbl[d7].count = 0; //????????
}
}
//?????????? ??????????? ??????????
void bgm_fade_check(void)
{
//???????
if(t_music_playing_flg == 0){
t_music_fade_flg = 0;
return;
}
//????????????
if(!t_music_fade_flg){
return;
}
if(!t_music_fade_vol || (t_music_bgm_volume==1 && t_music_se_volume == 1)){
stop_bgm();
t_music_bgm_no = -1;
} else {
// ????????
pDSData_tone[ TONE_MAX ]->SetVolume(volume_tbl[ --t_music_fade_vol ]);
}
}
//?????????? ??????? ??????????
void check_se_loop(void){
int d7;
if(dsound_flg == -1)
return;
for(d7=0; d7<TONE_MAX ;d7++){
if(tone_tbl[ d7 ].play_time){ //????
tone_tbl[ d7 ].play_time--;
}
}
//???????
play_environment_check();
//??????????
play_map_bgm_check();
//???????????????
bgm_fade_check();
}
int cdda_no = -1;
int stereo_flg = T_MUSIC_STEREO;
int t_music_se_volume = 15;
int t_music_bgm_volume = 15;
static MCI_OPEN_PARMS open = {0};
static MCIERROR dwRes = {0};
static int cdda_flg;
static int cdda_check_cnt = -1;
/////////////////////////////////////////////////////////////////////
// CD-DA???? n?????
// ???? true?刺??
// ???? ???????????? false?刺??
bool cdda_open(int n)
{
cdda_flg = 0;
// ?????? 2???????
_ASSERT( n > 1);
// MCI_OPEN_PARMS open = {0};
// MCIERROR dwRes = {0};
// ???????
open.lpstrDeviceType = "cdaudio";
dwRes = mciSendCommand( 0, MCI_OPEN, MCI_OPEN_TYPE, (DWORD)&open);
if ( dwRes)
{
#ifdef _STONDEBUG_
// MessageBoxNew(hWnd, "湖羲CD秞寢囮啖ㄐ", "隅", MB_OK);
#endif
cdda_flg = 1;
return FALSE;
}
// ?????????????叉???
MCI_SET_PARMS set;
set.dwTimeFormat = MCI_FORMAT_TMSF;
dwRes = mciSendCommand( open.wDeviceID, MCI_SET,
MCI_SET_TIME_FORMAT, (DWORD)&set);
if ( dwRes)
{
#ifdef _STONDEBUG_
// MessageBoxNew(hWnd, "湖羲CD秞寢囮啖ㄐ", "隅", MB_OK);
#endif
cdda_flg = 1;
return FALSE;
}
return TRUE;
}
/*--------------------------------------------
?????????
---------------------------------------------*/
bool cdda_start(int n)
{
// ???
// ???? n???
MCI_PLAY_PARMS play;
play.dwFrom = MCI_MAKE_TMSF( n,0,0,0);
play.dwTo = MCI_MAKE_TMSF( n+1,0,0,0);
dwRes = mciSendCommand( open.wDeviceID,
MCI_PLAY, MCI_FROM | MCI_TO,
(DWORD)&play);
if ( dwRes)
{
#ifdef _STONDEBUG_
// MessageBoxNew(hWnd, "??????????????", "隅", MB_OK);
#endif
cdda_flg = 2; //?????????
return FALSE;
}
return TRUE;
}
/*--------------------------------------------
?????于
---------------------------------------------*/
bool cdda_stop(void)
{
if(cdda_flg == 1) //??????????
return TRUE;
mciSendCommand(open.wDeviceID, MCI_STOP, 0, NULL);
// ????????
dwRes = mciSendCommand( open.wDeviceID, MCI_CLOSE, 0, (DWORD)NULL);
if ( dwRes)
{
#ifdef _STONDEBUG_
// MessageBoxNew(hWnd, "??????????????", "隅", MB_OK);
#endif
return FALSE;
}
return TRUE;
}
/*--------------------------------------------
??????
---------------------------------------------*/
extern DWORD NowTime;
//extern double NowTime;
bool cdda_play(int n)
{
check_se_loop(); //????????
cdda_flg = 1; //??????????
return TRUE;
if(cdda_flg == 1) //??????????
return TRUE;
if(cdda_no != n ){ //??阪????
cdda_flg = 0; //??????
cdda_check_cnt = -1;
}
if(cdda_flg) //??????
return TRUE;
cdda_check_cnt++;
cdda_check_cnt&=63;
if(cdda_check_cnt)
return TRUE;
if(cdda_no == n ){ //????
MCI_STATUS_PARMS mcisp; mcisp.dwItem = MCI_STATUS_MODE;
if(mciSendCommand(open.wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD)&mcisp)){ //???
cdda_flg = 3; //??????????
return FALSE;
}
if(mcisp.dwReturn == MCI_MODE_PLAY){ //????
return TRUE;
} else { //?????
cdda_no = Rnd( 11, 34 );
cdda_start( cdda_no );
// ???ㄈ?釤????
NowTime = TimeGetTime();
return TRUE;
}
} else {
cdda_no = n; //???
cdda_stop();
cdda_open( n );
cdda_start( n );
// ???ㄈ?釤????
NowTime = TimeGetTime();
}
return TRUE;
}