00001 /*! \file 00002 * X-Forge Util <br> 00003 * Copyright 2000-2003 Fathammer Ltd 00004 * 00005 * \brief XM player internal structures header file 00006 * 00007 * $Id: XFuXMPlayer_internal.h,v 1.16 2003/10/10 11:34:51 toni Exp $ 00008 * $Date: 2003/10/10 11:34:51 $ 00009 * $Revision: 1.16 $ 00010 */ 00011 00012 #ifndef XFUXMPLAYER_INTERNAL_H_INCLUDED 00013 #define XFUXMPLAYER_INTERNAL_H_INCLUDED 00014 00015 00016 const UINT16 XMFORMAT_SIZEOF_ENVELOPE = 325; 00017 const UINT16 XMFORMAT_SIZEOF_WAVEFORM = 64; 00018 const UINT16 XMFORMAT_SIZEOF_KEYBOARD = 96; 00019 00020 const UINT16 XMFORMAT_SAMPLE_16BIT = 16; 00021 00022 //! Fixed point accuracy. 00023 const INT32 FP_BITS = 12; 00024 const INT32 FP_VALUE = (1 << FP_BITS); 00025 00026 const INT32 VOLUME_FP_BITS = 16; 00027 00028 const INT32 VOLUME_RAMP_WIDTH = 32; 00029 00030 enum XMPLAYER_LOOP_TYPE 00031 { 00032 LOOP_FORWARD = 1, 00033 LOOP_PINGPONG = 2 00034 }; 00035 00036 enum XMPLAYER_ENVELOPE_TYPE 00037 { 00038 ENVELOPE_ON = 1, 00039 ENVELOPE_SUSTAIN = 2, 00040 ENVELOPE_LOOP = 4 00041 }; 00042 00043 enum XMPLAYER_WAVEFORM 00044 { 00045 WAVEFORM_SINEWAVE = 0, 00046 WAVEFORM_RAMPDOWN = 1, 00047 WAVEFORM_SQUAREWAVE = 2, 00048 WAVEFORM_NO_RETRIG = 4 00049 }; 00050 00051 enum XMPLAYER_XM_VIBRATO_WAVEFORM 00052 { 00053 XM_VIBRATO_WAVEFORM_SINEWAVE = 0, 00054 XM_VIBRATO_WAVEFORM_SQUAREWAVE = 1, 00055 XM_VIBRATO_WAVEFORM_RAMPDOWN = 2, 00056 XM_VIBRATO_WAVEFORM_RAMPUP = 3 00057 }; 00058 00059 00060 class XFuXMFormatAtom 00061 { 00062 public: 00063 UINT8 mNote; 00064 UINT8 mInstrumentNb; 00065 UINT8 mVolume; 00066 UINT8 mEffectType; 00067 UINT8 mEffectValue; 00068 }; 00069 00070 00071 class XFuXMFormatHeader 00072 { 00073 public: 00074 UINT8 mIdString[17 + 1]; //!< ID text: 'Extended module: ' (+ extra byte for \0). 00075 UINT8 mModuleName[20 + 1]; //!< Module name (+ extra byte for \0). 00076 UINT8 mH1A; //!< $1A. 00077 UINT8 mTrackerName[20 + 1]; //!< Tracker name (+ extra byte for \0). 00078 UINT16 mVersion; //!< Version number, hi-UINT8 major, lo-UINT8 minor. 00079 00080 UINT32 mHeaderSize; //!< Header size. 00081 00082 UINT16 mSongLength; //!< Song length in pattern order table. 00083 UINT16 mRestartPosition; //!< Song restart position. 00084 UINT16 mNbChannels; //!< Number of channels. 00085 UINT16 mNbPatterns; //!< Number of patterns. 00086 UINT16 mNbInstruments; //!< Number of instruments. 00087 00088 /*! Bit 0: 00089 * \li 0 = Amiga frequency table 00090 * \li 1 = Linear frequency table 00091 */ 00092 UINT16 mFlags; 00093 00094 UINT16 mTempo; //!< Default tempo (0..31). 00095 UINT16 mBpm; //!< Default bpm (0..255). 00096 00097 UINT8 mOrderTable[256]; //!< Pattern order table. 00098 }; 00099 00100 00101 class XFuXMFormatPatternHeader 00102 { 00103 public: 00104 UINT32 mHeaderLength; //!< Pattern header length. 00105 UINT8 mPackingType; //!< Packing type, always 0. 00106 UINT16 mNbRows; //!< Number of rows in pattern (0..256). 00107 UINT16 mSize; //!< Packed patterndata size. 00108 }; 00109 00110 00111 class XFuXMFormatInstrumentHeader 00112 { 00113 public: 00114 UINT32 mSize; //!< Instrument size. 00115 UINT8 mInstrumentName[22 + 1]; //!< Instrument name (+ extra byte for \0). 00116 UINT8 mType; //!< Instrument type, always 0. 00117 UINT16 mNbSamples; //!< Number of samples in instrument. 00118 }; 00119 00120 00121 class XFuXMFormatInstrument 00122 { 00123 public: 00124 UINT32 mSampleHeaderSize; //!< Sample header size. 00125 00126 UINT8 mKeyboard[96]; //!< Sample number for all notes. 00127 00128 UINT16 mVolumeEnvelope[24]; //!< Points for volume envelope. 00129 UINT16 mPanningEnvelope[24]; //!< Points for panning envelope. 00130 UINT8 mNbVolEnvPoints; //!< Number of volume envelope points. 00131 UINT8 mNbPanEnvPoints; //!< Number of panning envelope points. 00132 UINT8 mVolEnvSustain; //!< Volume envelope sustain point. 00133 UINT8 mVolEnvLoopStart; //!< Volume envelope loop start point. 00134 UINT8 mVolEnvLoopEnd; //!< Volume envelope loop end point. 00135 UINT8 mPanEnvSustain; //!< Panning envelope sustain point. 00136 UINT8 mPanEnvLoopStart; //!< Panning envelope loop start point. 00137 UINT8 mPanEnvLoopEnd; //!< Panning envelope loop end point. 00138 //! Volume envelope type. 00139 /*! \li Bit 0: On 00140 * \li Bit 1: Sustain 00141 * \li Bit 2: Loop 00142 */ 00143 UINT8 mVolEnvType; 00144 //! Panning envelope type. 00145 /*! \li Bit 0: On 00146 * \li Bit 1: Sustain 00147 * \li Bit 2: Loop 00148 */ 00149 UINT8 mPanEnvType; 00150 00151 UINT8 mVibratoType; //!< Vibrato type. 00152 UINT8 mVibratoSweep; //!< Vibrato sweep. 00153 UINT8 mVibratoDepth; //!< Vibrato depth. 00154 UINT8 mVibratoRate; //!< Vibrato rate. 00155 00156 UINT16 mVolumeFadeout; //!< Volume fadeout speed. 00157 00158 UINT16 mReserved; //!< Reserved. 00159 }; 00160 00161 00162 class XFuXMFormatSample 00163 { 00164 public: 00165 UINT32 mSampleLength; //!< Sample length. 00166 UINT32 mLoopStart; //!< Sample loop start. 00167 UINT32 mLoopLength; //!< Sample loop length. 00168 UINT8 mVolume; //!< Volume. 00169 INT8 mFinetune; //!< Finetune (signed byte -128..+127). 00170 //! Sample type. 00171 /*! Bit 0-1: 00172 * \li 0 = No loop 00173 * \li 1 = Forward loop 00174 * \li 2 = Ping-pong loop 00175 * \par Bit 4: 16-bit sample data 00176 */ 00177 UINT8 mType; 00178 00179 UINT8 mPan; //!< Panning (0..255). 00180 INT8 mRelativeNote; //!< Relative note number (signed byte). 00181 00182 UINT8 mReserved; //!< Reserved. 00183 00184 UINT8 mSampleName[22 + 1]; //!< Sample name (+ extra byte for \0). 00185 }; 00186 00187 00188 class XFuXMSong 00189 { 00190 public: 00191 UINT8 *mOrderTable; //!< Pattern order table, MAX_ORDERS. 00192 UINT16 mSongLength; //!< Song length in pattern order table. 00193 UINT16 mRestartPosition; //!< Song restart position. 00194 00195 UINT16 mNbPatterns; //!< Number of patterns. 00196 UINT16 mNbChannels; //!< Number of channels. 00197 UINT16 mNbInstruments; //!< Number of instruments. 00198 00199 UINT16 mTempo; //!< Tempo (0..31), tick count. 00200 UINT16 mBpm; //!< Bpm (0..255), tick speed. 00201 00202 INT8 mGlobalVolume; //!< Global volume. 00203 }; 00204 00205 00206 class XFuXMSample 00207 { 00208 public: 00209 UINT8 mVolume; //!< Volume (0..63). 00210 UINT8 mPan; //!< Panning (-128..+127). 00211 INT8 mFinetune; //!< Finetune (signed byte -128..+127). 00212 INT8 mRelativeNote; //!< Relative note number (signed byte). 00213 00214 void *mOffset; //!< Sample address in memory. 00215 UINT32 mSize; //!< Sample size. 00216 00217 UINT8 mLoopForward; //!< Forward loop. 00218 UINT8 mLoopPingpong; //!< Pingpong loop. 00219 UINT32 mLoopStart; //!< Sample loop start. 00220 UINT32 mLoopEnd; //!< Sample loop end. 00221 00222 UINT8 m16Bit; //!< 16-bit sample flag. 00223 }; 00224 00225 00226 class XFuXMInstrument 00227 { 00228 public: 00229 UINT16 mNbSamples; //!< Number of samples in instrument. 00230 XFuXMSample *mSamples; //!< MAX_SAMPLES. 00231 00232 UINT8 mKeyboard[XMFORMAT_SIZEOF_KEYBOARD]; //!< Sample number for all notes. 00233 00234 REAL mVolumeEnvelope[XMFORMAT_SIZEOF_ENVELOPE]; 00235 UINT16 mVolEnvEnd; //!< Volume envelope end point. 00236 UINT8 mVolEnvType; //!< Volume envelope flag. 00237 UINT16 mVolEnvLoopStart; //!< Volume envelope loop start. 00238 UINT16 mVolEnvLoopEnd; //!< Volume envelope loop end. 00239 UINT16 mVolEnvSustain; //!< Volume envelope sustain point. 00240 00241 REAL mVolumeFadeout; //!< Volume fadeout speed. 00242 00243 UINT8 mPanningEnvelope[XMFORMAT_SIZEOF_ENVELOPE]; 00244 UINT16 mPanEnvEnd; //!< Panning envelope end point. 00245 UINT8 mPanEnvType; //!< Panning envelope flag. 00246 UINT16 mPanEnvLoopStart; //!< Panning envelope loop start. 00247 UINT16 mPanEnvLoopEnd; //!< Panning envelope loop end. 00248 UINT16 mPanEnvSustain; //!< Panning envelope sustain point. 00249 00250 UINT8 mIsVibrato; //!< Vibrato flag. 00251 UINT8 mVibratoType; //!< Vibrato type. 00252 UINT8 mVibratoSweep; //!< Vibrato sweep. 00253 UINT8 mVibratoDepth; //!< Vibrato depth. 00254 UINT8 mVibratoRate; //!< Vibrate rate. 00255 }; 00256 00257 00258 class XFuXMPattern 00259 { 00260 public: 00261 UINT8 *mData; //!< Pattern data. 00262 UINT32 *mRows; //!< Pointer to row in pattern, MAX_PATTERN_ROWS. 00263 }; 00264 00265 00266 class XFuXMChannel 00267 { 00268 public: 00269 XFuXMFormatAtom mTa; 00270 00271 INT mIsValid; //! Data validity flag. 00272 INT mInitSample; //! Sample initialization flag. 00273 00274 INT32 mPointer; //! Pointer to current position in sample data. 00275 00276 XFuXMInstrument mCurrentInstrument; //!< Current instrument. 00277 XFuXMSample mCurrentSample; //!< Current sample. 00278 00279 void * mOffset; //!< Sample address in memory. 00280 INT32 mLength; //!< Sample size. 00281 INT16 mInstrumentNb; //!< Instrument number. 00282 UINT32 mSpeed; //!< Speed. 00283 //! Sample loop type. 00284 /*! \li 0 = Off 00285 * \li 1 = Forward 00286 * \li 2 = Pingpong 00287 */ 00288 UINT8 mLoop; 00289 INT32 mLoopStart; //!< Sample loop start. 00290 INT32 mLoopEnd; //!< Sample loop end. 00291 00292 UINT8 mIsSample; //!< Sample availability flag. 00293 00294 INT8 mNote; //!< Current note. 00295 INT8 mFinetune; //!< Current finetune. 00296 00297 INT8 mDirection; //!< Sample direction: +1 = Forwards, -1 = Backwards. 00298 00299 UINT8 mVolEnvType; //!< Volume envelope type. 00300 UINT16 mVolEnvPointer; //!< Volume envelope pointer. 00301 UINT8 mVolEnvSpeed; //!< Volume envelope speed. 00302 UINT16 mVolEnvLoopStart; //!< Volume envelope loop start. 00303 UINT16 mVolEnvLoopEnd; //!< Volume envelope loop end. 00304 UINT16 mVolEnvSustain; //!< Volume envelope sustain point. 00305 REAL mVolEnvValue; //!< Volume envelope value. 00306 REAL mVolumeFadeout; //!< Volume envelope fadeout. 00307 REAL mVolumeFadeoutValue; //!< Volume envelope fadeout value. 00308 00309 INT8 mVolume; //!< Volume. 00310 INT8 mBaseVolume; //!< Base volume. 00311 REAL mFinalVolume; //!< Final volume, used for ramping. 00312 REAL mFinalOldVolume; //!< Final old volume, used for ramping. 00313 REAL mFinalVolumeSpeed; //!< Final volume ramp speed. 00314 00315 UINT8 mPanEnvType; //!< Panning envelope type. 00316 UINT16 mPanEnvPointer; //!< Panning envelope pointer. 00317 UINT8 mPanEnvSpeed; //!< Panning envelope speed. 00318 UINT16 mPanEnvLoopStart; //!< Panning envelope loop start. 00319 UINT16 mPanEnvLoopEnd; //!< Panning envelope loop end. 00320 UINT16 mPanEnvSustain; //!< Panning envelope sustain point. 00321 UINT8 mPanEnvValue; //!< Panning envelope value. 00322 UINT8 mPan; //!< Pan. 00323 INT16 mFinalPan; //!< Final pan. 00324 00325 UINT8 mSustainReleased; //!< Sustain release flag. 00326 00327 UINT8 mVolumeColumn; //!< Volume column effect. 00328 00329 UINT8 mEffectType; //!< Effect type. 00330 UINT8 mEffectValue; //!< Effect value. 00331 00332 UINT8 mPortamentoUpV; //!< Portamento up value. 00333 UINT8 mPortamentoDownV; //!< Portamento down value. 00334 UINT8 mTonePortamentoV; //!< Tone portamento value. 00335 UINT8 mVolumeSlideV; //!< Volume slide value. 00336 UINT8 mFinePortamentoUpV; //!< Fine portamento up value. 00337 UINT8 mFinePortamentoDownV; //!< Fine portamento down value. 00338 UINT8 mFineVolumeSlideUpV; //!< Fine volume slide up value. 00339 UINT8 mFineVolumeSlideDownV; //!< Fine volume slide down value. 00340 UINT8 mGlobalVolumeSlideV; //!< Global volume slide value. 00341 UINT8 mMultiRetrigVolumeV; //!< Multi retrig note volume change. 00342 UINT8 mMultiRetrigRateV; //!< Multi retríg note rate. 00343 UINT8 mTremorV; //!< Tremor value. 00344 UINT8 mExtraFinePortamentoUpV; //!< Extra fine portamento up value. 00345 UINT8 mExtraFinePortamentoDownV; //!< Extra fine portamento down value. 00346 UINT8 mPanningSlideV; //!< Panning slide value. 00347 00348 UINT32 mMultiRetrigTicker; //!< Multi retrig ticker. 00349 UINT32 mTremorTicker; //!< Tremor ticker. 00350 00351 UINT32 mPeriod; //!< Period. 00352 UINT32 mOldPeriod; //!< Old line period. 00353 UINT32 mDestPeriod; //!< Current line period. 00354 UINT32 mBasePeriod; //!< Base period. 00355 00356 UINT8 mIsVibrato; //!< Vibrato flag. 00357 UINT8 mVibratoRate; //!< Vibrato rate. 00358 UINT8 mVibratoDepth; //!< Vibrato depth. 00359 UINT8 mVibratoPointer; //!< Vibrato pointer. 00360 UINT8 mVibratoWaveform; //!< Vibrato waveform. 00361 00362 UINT8 mTremoloRate; //!< Tremolo rate. 00363 UINT8 mTremoloDepth; //!< Tremolo depth. 00364 UINT8 mTremoloPointer; //!< Tremolo pointer. 00365 UINT8 mTremoloWaveform; //!< Tremolo waveform. 00366 }; 00367 00368 00369 #endif // !XFUXMPLAYER_INTERNAL_H_INCLUDED 00370
![]() | ||||
![]() |
Confidential Copyright © 2002-2003 Fathammer | with doxygen by Dimitri van Heesch |