OSDN Git Service

jQueryのアップデートに伴う変更。
[nacltest/xmplayer.git] / _mod.h
1 #ifndef      _MOD_H__000314_1610             /* 2重インクルード防止の番兵 */
2 #define _MOD_H__000314_1610
3 #include "_allinc2.h"
4
5 #define         MAX_PATTERNS                            ( 256 )
6 #define         MAX_INSTRUMENTS                         ( 128 )
7 #define         MAX_SAMPLES_IN_INSTRUMENT       ( 16 )
8 #define         MAX_SAMPLES                                     ( MAX_INSTRUMENTS * MAX_SAMPLES_IN_INSTRUMENT )
9 #define         MAX_CHANNELS                            ( 64 )
10
11
12 /*━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
13 ▼     構造体の型
14 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━*/
15
16
17
18 /* インストゥールメントのエンベロープ制御点 */
19 struct ENVELOPE {
20         U16             x ;                                             /* エンベロープ制御点の x 座標 */
21         U16             y ;                                             /* エンベロープ制御点の y 座標 */
22 };
23
24 /* 演奏中の曲の状態を表す */
25 #pragma pack(push)
26 #pragma pack(1)
27 struct MOD {
28         S32     FormatType ;                    /* フォーマットタイプ */
29
30         S32     bLoopMode ;                             /* ループ再生モードか? TRUE / FALSE */
31         S32     bAutoGainControl ;              /* 自動ゲインコントロールするか? TRUE / FALSE */
32         S32     bDone ;                                 /* 再生終了したか? TRUE / FALSE */
33
34         S32     TickCount ;                             /* テンポ処理用 */
35         S32     nTickPerRow ;                   /* テンポ処理用(1 Row あたりの tick 数)*/
36         S32     BPM ;                                   /* BPM */
37         S32     nWavePerSec ;                   /* WAVE 出力デバイスの周波数(Hz) */
38         S32     nWavePerTick ;                  /* 最小割り込み単位期間当たりの生成波形数 */
39         S32     nRestWave ;                             /* 次の割り込みまでの残存波形データ数 */
40
41         S32     Row ;                                   /* パターンデータ内スキャン位置 */
42         S32     BreakSequence ;                 /* 分岐先(Sequence)*/
43         S32     BreakRow ;                              /* 分岐先(Row)*/
44         S32     PatternDelay ;                  /* コマンド EEx 用遅延数(Row 単位) */
45         S32     FinePatternDelay ;              /* コマンド X6x 用遅延数(Tick 単位) */
46
47         S32     idxSequenceData ;               /* シーケンスデータ読み取り位置 */
48
49         S32     GlobalVolume_ ;                 /* グローバルボリューム(0x00_ ~ 0x40_)*/
50         S32     GlobalVolumeSlide ;             /* グローバルボリューム、スライド値 */
51         S32     GlobalVolumeScale_ ;    /* 全体の音量スケーリング値(0_ ~ 1_)*/
52         S32     GainControlScale_ ;             /* ゲイン調整用 音量スケーリング値(0_ ~ 1_)*/
53
54         /* プチノイズ対策 */
55         S32     AntiNoiseVal_L ;                /* 波形の修正値、左 */
56         S32     AntiNoiseVal_R ;                /* 波形の修正値、右 */
57
58         /* XM 形式 ヘッダー情報 その1 */
59         struct XM_ID {
60                 char    aszID_Text[ 17 ];               /* XM 形式識別文字列 */
61                 char    aszModuleName[ 21 ];    /* データの名前(1文字余分に)*/
62                 S32             ID_Byte ;                               /* XM 形式識別用 */
63                 char    aszTrackerName[ 21 ];   /* 本データを作成したトラッカー名(1文字余分に)*/
64                 S32             VersionNumber ;                 /* データのバージョンナンバー */
65         } XmId ;
66
67         /* XM 形式 ヘッダー情報 その2 */
68         struct XM_HEADER {
69                 S32             HeaderSize ;                    /* ヘッダー領域のサイズ */
70                 S32             SongLength ;                    /* aPatternOrderTable の長さに換算した、曲の全長 */
71                 S32             RestartPosition ;               /* 曲のループ時、復帰位置 */
72                 S32             NumberOfChannels ;              /* 総チャンネル数 */
73                 S32             NumberOfPatterns ;              /* 総 Pattern 数 */
74                 S32             NumberOfInstruments ;   /* 総 Instrument 数 */
75                 S32             Flags ;                                 /*
76                                                                                         bit 0 : 0 なら AmigaPeriod モード
77                                                                                                         1 なら 線形周波数モード
78                                                                                 */
79                 S32             DefaultTempo ;                  /* 1 Row 当りの Tick 数、デフォルト値 */
80                 S32             DefaultBPM ;                    /* BPM デフォルト値 */
81                 U8              aPatternOrderTable[ 256 ];      /* 演奏する Pattern の順序を表したテーブル */
82         } XmHeader ;
83
84         /* パターンの情報 */
85         struct XM_PATTERN {
86                 S32             PatternHeaderLength ;   /* ヘッダー領域のサイズ */
87                 S32             PackingType ;                   /* Pattern の圧縮形式(常に 0 らしい)*/
88                 S32             NumberOfRowsInPattern ; /* Pattern 内の総 Row 数 */
89                 S32             PackedPatterndataSize ; /* 圧縮された状態での Pattern のデータサイズ */
90
91                 /* ワーク領域 */
92                 U8              *pPatternData ;                 /* パターンデータへのポインター */
93         } *(apXM_PATTERN[ MAX_PATTERNS ]);
94
95         /* サンプリングの情報 */
96         struct XM_SAMPLE {
97                 void    *pSampleData ;                  /* サンプリングデータへのポインター */
98                 S32             SampleLength ;                  /* サンプリングデータの波形要素数 */
99                 S32             SampleLoopStart ;               /* サンプリングのループ開始位置(波形要素単位)*/
100                 S32             SampleLoopLength ;              /* サンプリングのループ区間の長さ(波形要素単位)*/
101                 S32             Volume ;                                /* サンプリングのデフォルト音量 */
102                 S32             FineTune ;                              /* サンプリングのデフォルト FineTune 値 */
103                 S32             Type ;                                  /*
104                                                                                         Bit 0-1:        00      = No loop
105                                                                                                                 01      = Forward loop
106                                                                                                                 10      = Ping-pong loop
107                                                                                         Bit 4:           0      =  8-bit sampledata
108                                                                                                                  1      = 16-bit sampledata
109                                                                                 */
110                 S32             Panning ;                               /* サンプリングのデフォルトパン位置 */
111                 S32             RelativeNoteNumber ;    /* 音階の修正値 */
112                 S32             Reserved ;                              /* 予約領域 */
113                 char    aszSampleName[23];              /* サンプリングの名前(1文字余分に)*/
114
115                 /* ワーク領域 */
116                 S32             VoiceMode ;                             /* 各種フラグ */
117         } *(apXM_SAMPLE[ MAX_SAMPLES ]);
118
119         /* インストゥールメントの情報 */
120         struct XM_INSTRUMENT {
121                 S32                     InstrumentSize ;                                /* データサイズ */
122                 char            aszInstrumentName[ 23 ];                /* インストゥールメントの名前(1文字余分に)*/
123                 S32                     InstrumentType ;                                /* インストゥールメントの形式(常に 0 らしい)*/
124                 S32                     NumberOfSamplesInInstrument ;   /* このインストゥールメントに含まれるサンプリング数 */
125                 S32                     SampleHeaderSize ;                              /* サンプリングのヘッダー情報のサイズ */
126                 U8                      aSampleNumberForAllNotes[ 96 ]; /* 全音階別のサンプリング番号 */
127                 ENVELOPE        aPointsForVolumeEnvelope[ 12 ];         /* ボリュームエンベロープの制御点(最大 12)*/
128                 ENVELOPE        aPointsForPanningEnvelope[ 12 ];        /* パンエンベロープの制御点(最大 12)*/
129                 S32                     NumberOfVolumePoints ;                  /* ボリュームエンベロープの制御点の数 */
130                 S32                     NumberOfPanningPoints ;                 /* パンエンベロープの制御点の数 */
131                 S32                     VolumeSustainPoint ;                    /* ボリュームエンベロープのサステインポイント */
132                 S32                     VolumeLoopStartPoint ;                  /* ボリュームエンベロープのループ開始位置 */
133                 S32                     VolumeLoopEndPoint ;                    /* ボリュームエンベロープのループ終了位置 */
134                 S32                     PanningSustainPoint ;                   /* パンエンベロープのサステインポイント */
135                 S32                     PanningLoopStartPoint ;                 /* パンエンベロープのループ開始位置 */
136                 S32                     PanningLoopEndPoint ;                   /* パンエンベロープのループ終了位置 */
137                 S32                     VolumeType ;                                    /*
138                                                                                                                 bit 0:  0 = エンベロープ OFF
139                                                                                                                                 1 = エンベロープ ON
140                                                                                                                         1:      0 = サステイン OFF
141                                                                                                                                 1 = サステイン ON
142                                                                                                                         2:      0 = ループ OFF
143                                                                                                                                 1 = ループ ON
144                                                                                                         */
145                 S32                     PanningType ;                                   /*
146                                                                                                                 bit 0:  0 = エンベロープ OFF
147                                                                                                                                 1 = エンベロープ ON
148                                                                                                                         1:      0 = サステイン OFF
149                                                                                                                                 1 = サステイン ON
150                                                                                                                         2:      0 = ループ OFF
151                                                                                                                                 1 = ループ ON
152                                                                                                         */
153                 S32                     AutoVibratoType ;                               /* 自動ビブラート、波形種類 */
154                 S32                     AutoVibratoSweep ;                              /* 自動ビブラート、MAX 振幅に到達するまでの Tick 数 */
155                 S32                     AutoVibratoDepth ;                              /* 自動ビブラート、MAX 振幅 */
156                 S32                     AutoVibratoRate ;                               /* 自動ビブラート、振動速度 */
157                 S32                     VolumeFadeout ;                                 /* KeyOff 時のフェードアウト速度 */
158                 S32                     Reserved ;                                              /* 予約領域 */
159
160                 /* ワーク領域 */
161                 XM_SAMPLE       *apAllNoteXM_SAMPLE[ 96 ];              /* 全音階別サンプリング情報へのポインター */
162                 U8                      VolumeEnvelopeTable[ 325 ];             /* 展開済みの、ボリュームエンベロープ */
163                 U8                      PanningEnvelopeTable[ 325 ];    /* 展開済みの、パンエンベロープ */
164         } *(apXM_INSTRUMENT[ MAX_INSTRUMENTS ]);
165
166         /* 各チャンネルの状態 */
167         struct CHANSTAT {
168                 /* 現在の Row の内容(NoteDelay の遅延読み込みを考慮)*/
169                 S32     idxNowPatternNote ;
170                 S32     idxNowRealNote ;
171                 S32     NowVolumeColumn ;
172                 S32     NowCommand ;
173                 S32     NowParam ;
174                 S32     NowPeriod_ ;
175                 S32     idxNowInst ;
176
177                 /* インストゥールメント情報へのポインター */
178                 XM_INSTRUMENT   *pPendingXM_INSTRUMENT ;
179                 XM_INSTRUMENT   *pPlayingXM_INSTRUMENT ;
180
181                 /* サンプリング情報へのポインター */
182                 XM_SAMPLE               *pPlayingXM_SAMPLE ;
183
184                 /* 最後に押されたキー番号 */
185                 S32     idxLastRealNote ;
186
187                 /* period 関係 */
188                 S32     PendingPeriod_ ;
189                 S32     PlayingPeriod_ ;
190                 S32     FinalPeriod_ ;
191                 S32     PeriodLowLimit_ ;                       /* 下限 */
192                 S32     PeriodHighLimit_ ;                      /* 上限 */
193
194                 /* FineTune 関係 */
195                 S32     PlayingFineTune ;
196
197                 /* 音量関係 */
198                 S32     PlayingVolume_ ;                        /*(0x00_ ~ 0x40_)*/
199                 S32     FinalVolume_ ;                          /*(0x00_ ~ 0x40_)*/
200                 S32     FinalVolume_L_ ;                        /*(0x00_ ~ 0x40_)*/
201                 S32     FinalVolume_R_ ;                        /*(0x00_ ~ 0x40_)*/
202                 S32     VolumeSlide ;                           /* 音量スライド値 */
203                 S32     FineVolumeSlide ;                       /* 音量スライド値(FineVolumeSlide 用)*/
204                 S32     VolumeScale_ ;                          /* チャンネル単位の音量スケーリング値(0_ ~ 1_)*/
205
206                 /* パン関係 */
207                 S32     PlayingPanning_ ;                       /*(左:0x000_ ~ 0x0FF_:右)*/
208                 S32     FinalPanning_ ;                         /*(左:0x000_ ~ 0x100_:右)*/
209                 S32     PanningSlide ;                          /* パン スライド値(コマンド Pxy 用)*/
210
211                 /* エンベロープ関係 */
212                 S32     idxVolumeEnvelopeTable ;        /* ボリュームエンベロープのテーブル参照位置 */
213                 S32     idxPanningEnvelopeTable ;       /* パンエンベロープのテーブル参照位置 */
214
215                 /* Vibrato 関係 */
216                 S32     VibratoType ;                           /* タイプ */
217                 S32     VibratoPosition_ ;                      /* 波形位置 */
218                 S32     VibratoRate ;                           /* 速度 */
219                 S32     VibratoDepth ;                          /* 振幅 */
220
221                 /* Tremolo 関係 */
222                 S32     TremoloType ;                           /* タイプ */
223                 S32     TremoloPosition_ ;                      /* 波形位置 */
224                 S32     TremoloRate ;                           /* 速度 */
225                 S32     TremoloDepth ;                          /* 振幅 */
226
227                 /* Portamento 関係 */
228                 S32     PortamentoInc ;                         /* period 加算量(Portamento 用)*/
229                 S32     TonePortamentoInc ;                     /* period 加算量(Tone-Portamento 用)*/
230                 S32     TonePortamentoDst_ ;            /* period 目標値(Tone-Portamento 用)*/
231                 S32     FinePortamentoInc ;                     /* period 加算量(Fine-Portamento 用)*/
232                 S32     ExtraFinePortamentoInc ;        /* period 加算量(Extra Fine-Portamento 用)*/
233
234                 /* Arpeggio 関係 */
235                 S32     ArpeggioPeriod_[2] ;
236                 S32     idxArpeggio ;                           /* 0 -> 1 -> 2 繰り返し */
237
238                 /* Tremor(コマンド Txy)関係 */
239                 S32     TremorCount ;                           /* カウンター */
240                 S32     TremorOnTime ;                          /* KeyOn 期間(tick 数)*/
241                 S32     TremorOffTime ;                         /* KeyOff 期間(tick 数)*/
242                 S32     bTremorMute ;                           /* ミュート状態か? TRUE / FALSE */
243
244                 /* Multi retrig(コマンド Rxy)関係 */
245                 S32     MultiRetrigCount ;                      /* カウンター */
246                 S32     MultiRetrigInterval ;           /* 間隔 */
247                 S32     MultiRetrigVolumeChange ;       /* 音量の変化のさせ方 */
248
249                 /* Panbrello 関係 */
250                 S32     PanbrelloType ;                         /* タイプ */
251                 S32     PanbrelloPosition ;                     /* 波形位置 */
252                 S32     PanbrelloRate ;                         /* 速度 */
253                 S32     PanbrelloDepth ;                        /* 振幅 */
254
255                 /* Pattern loop(コマンド E6x)関係 */
256                 S32     PatternLoopCount ;                      /* ループ回数カウント用 */
257                 S32     PatternLoopRow ;                        /* ループポイント(Row)*/
258
259                 /* KEYOFF フェードアウト関係 */
260                 S32     bFadeOut ;                                      /* フェードアウト中? TRUE / FALSE */
261                 S32     FadeOutVolume_1_15_16 ;         /* フェードアウト用、音量倍率(固定少数 16 bit)*/
262
263                 /* Auto-Vibrato 関係 */
264                 S32     AutoVibratoPosition ;           /* 波形位置 */
265                 S32     AutoVibratoDepth_ ;                     /* 振幅 */
266
267                 /* Surround 関係 */
268                 S32     bSurround ;                                     /* Surround は有効か? TRUE / FALSE */
269
270                 /* その他いろいろ */
271                 U32     SamplePosition_ ;                       /* サンプリングの再生位置 */
272                 U32     SampleRate_ ;                           /* サンプリングの再生レート */
273                 U32     SampleOffset ;                          /* コマンド 9xx で指定したオフセット値(最後に指定した値)*/
274                 U32     SampleHighOffset ;                      /* コマンド XAx で指定したオフセット値(最後に指定した値)*/
275                 S32     bGrissando ;                            /* Grissando は有効か? TRUE / FALSE */
276                 S32     VolumeColumnContinueValue ;     /* VolumeColumn 専用、特殊な continue 再現用 */
277
278                 /* プチノイズ対策 */
279                 XM_SAMPLE       *pLastPlayingXM_SAMPLE ;        /* 前回のサンプリング */
280                 U32     LastSamplePosition_ ;           /* 前回のサンプリングの再生位置 */
281                 S32     LastWaveVal_L ;                         /* 波形の最終値、左 */
282                 S32     LastWaveVal_R ;                         /* 波形の最終値、右 */
283                 S32     LastSampleVolume_L_ ;           /* 音量の最終値、左 */
284                 S32     LastSampleVolume_R_ ;           /* 音量の最終値、右 */
285         } aCHANSTAT[ MAX_CHANNELS ];
286         void* Instance;// NaCl インスタンス
287 };
288 #pragma pack(pop)
289
290 /* タグ名のフック */
291
292 typedef MOD::XM_ID                      XM_ID ;
293 typedef MOD::XM_HEADER          XM_HEADER ;
294 typedef MOD::XM_PATTERN         XM_PATTERN ;
295 typedef MOD::XM_SAMPLE          XM_SAMPLE ;
296 typedef MOD::XM_INSTRUMENT      XM_INSTRUMENT ;
297 typedef MOD::CHANSTAT                   CHANSTAT ;
298
299 /*━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
300 ▼     MOD データの読み込み
301
302         戻値・TRUE  = 成功
303                 ・FALSE = 失敗
304 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━*/
305 S32 MOD__LoadSong(
306          MOD    *pMOD           /* this ポインター */
307         ,void   *pMusDat_       /* メモリ上にファイルを読み込み、そのポインターをここに指定 */
308         ,S32     lMusDat        /* データサイズ */
309 );
310
311
312 /*━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
313 ▼     MOD データの破棄
314
315         戻値・TRUE  = 成功
316                 ・FALSE = 失敗
317 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━*/
318 S32 MOD__ReleaseSong(
319          MOD    *pMOD           /* this ポインター */
320 );
321
322
323 /*━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
324 ▼     音量の設定
325
326         戻値・TRUE  = 成功
327                 ・FALSE = 失敗
328 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━*/
329 S32 MOD__Set_Volume(
330          MOD    *pMOD           /* this ポインター */
331         ,S32    Volume          /* 音量 0 ~ 256(それ以上にも設定可能)*/
332 );
333
334
335 /*━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
336 ▼     再生レートの設定
337
338         戻値・TRUE  = 成功
339                 ・FALSE = 失敗
340 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━*/
341 S32 MOD__Set_nWavePerSec(
342          MOD    *pMOD                   /* this ポインター */
343         ,S32    nWavePerSec             /* WAVE 出力デバイスの周波数(Hz) */
344 );
345
346
347 /*━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
348 ▼     ループ再生モード / 非ループ再生モード の指定
349
350         戻値・TRUE  = 成功
351                 ・FALSE = 失敗
352 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━*/
353 S32 MOD__Set_bLoopMode(
354          MOD    *pMOD                   /* this ポインター */
355         ,S32    bLoopMode               /* ループ再生モードか? TRUE / FALSE */
356 );
357
358
359 /*━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
360 ▼     自動ゲインコントロールするかどうか の指定
361
362         戻値・TRUE  = 成功
363                 ・FALSE = 失敗
364 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━*/
365 S32 MOD__Set_bAutoGainControl(
366          MOD    *pMOD                           /* this ポインター */
367         ,S32    bAutoGainControl        /* 自動ゲインコントロールするか? TRUE / FALSE */
368 );
369
370
371 /*━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
372 ▼     再生を初期化(内部パラメーターを初期化し、先頭から再生し直す)
373
374         戻値・TRUE  = 成功
375                 ・FALSE = 失敗
376 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━*/
377 S32 MOD__InitPlay(
378          MOD    *pMOD           /* this ポインター */
379 );
380
381
382 /*━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
383 ▼     MOD データの再生
384
385         戻値・TRUE  = 成功
386                 ・FALSE = 失敗
387 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━*/
388 S32 MOD__PlaySong(
389          MOD    *pMOD                   /* this ポインター */
390         ,U32    *pWaveOutPut    /* 波形出力先(L R をひとまとめにして、U32 単位で出力する)*/
391         ,S32     nWaveOutPut    /* 出力波形数 */
392 );
393
394
395 /*━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
396 ▼     MOD 構造体の破棄
397
398         戻値・TRUE  = 成功
399                 ・FALSE = 失敗
400 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━*/
401 S32 MOD__Destruct(
402         MOD     *p              /* this ポインター */
403 );
404
405
406 /*━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
407 ▼     MOD 構造体の確保と初期化
408
409         戻値:       確保した構造体へのポインター
410                         NULL なら失敗
411 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━*/
412 MOD *MOD__Create(void*  Instance /* Naclインスタンス */
413 );
414 #endif