diff src/Input/adplug/core/rol.h @ 0:13389e613d67 trunk

[svn] - initial import of audacious-plugins tree (lots to do)
author nenolod
date Mon, 18 Sep 2006 01:11:49 -0700
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/Input/adplug/core/rol.h	Mon Sep 18 01:11:49 2006 -0700
@@ -0,0 +1,308 @@
+/*
+ * Adplug - Replayer for many OPL2/OPL3 audio file formats.
+ * Copyright (C) 1999 - 2004 Simon Peter, <dn.tlp@gmx.net>, et al.
+ * 
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * rol.h - ROL Player by OPLx <oplx@yahoo.com>
+ *
+ * Visit:  http://tenacity.hispeed.com/aomit/oplx/
+ */
+#ifndef H_ROLPLAYER
+#define H_ROLPLAYER
+
+#include <vector>
+#include <string>
+
+#include "player.h"
+
+class CrolPlayer: public CPlayer
+{
+public:
+  static CPlayer *factory(Copl *newopl);
+
+    CrolPlayer(Copl *newopl);
+
+    ~CrolPlayer();
+
+    bool  load      (const std::string &filename, const CFileProvider &fp);
+    bool  update    ();
+    void  rewind    (int subsong);	// rewinds to specified subsong
+    float getrefresh();			// returns needed timer refresh rate
+
+    std::string gettype() { return std::string("Adlib Visual Composer"); }
+
+private:
+    typedef unsigned short    uint16;
+    typedef signed   short    int16;
+#ifdef __x86_64__
+    typedef signed   int      int32;
+#else
+    typedef signed long int   int32;
+#endif
+    typedef float             real32;
+
+    typedef struct
+    {
+        uint16 version_major;
+        uint16 version_minor;
+        char   unused0[40];
+        uint16 ticks_per_beat;
+        uint16 beats_per_measure;
+        uint16 edit_scale_y;
+        uint16 edit_scale_x;
+        char   unused1;
+        char   mode;
+        char   unused2[90];
+        char   filler0[38];
+        char   filler1[15];
+        real32 basic_tempo;
+    } SRolHeader;
+
+    typedef struct
+    {
+        int16  time;
+        real32 multiplier;
+    } STempoEvent;
+
+    typedef struct
+    {
+        int16 number;
+        int16 duration;
+    } SNoteEvent;
+
+    typedef struct
+    {
+        int16 time;
+        char  name[9];
+        int16 ins_index;
+    } SInstrumentEvent;
+
+    typedef struct
+    {
+        int16  time;
+        real32 multiplier;
+    } SVolumeEvent;
+
+    typedef struct
+    {
+        int16  time;
+        real32 variation;
+    } SPitchEvent;
+
+    typedef std::vector<SNoteEvent>       TNoteEvents;
+    typedef std::vector<SInstrumentEvent> TInstrumentEvents;
+    typedef std::vector<SVolumeEvent>     TVolumeEvents;
+    typedef std::vector<SPitchEvent>      TPitchEvents;
+
+#define bit_pos( pos ) (1<<pos)
+
+    class CVoiceData
+    {
+    public:
+        enum EEventStatus
+        {
+            kES_NoteEnd   = bit_pos( 0 ),
+            kES_PitchEnd  = bit_pos( 1 ),
+            kES_InstrEnd  = bit_pos( 2 ),
+            kES_VolumeEnd = bit_pos( 3 ),
+
+            kES_None     = 0
+        };
+
+        explicit CVoiceData()
+            :   mForceNote           ( true )
+               ,mEventStatus         ( kES_None )
+               ,current_note         ( 0 )
+               ,current_note_duration( 0 )
+               ,mNoteDuration        ( 0 )
+               ,next_instrument_event( 0 )
+               ,next_volume_event    ( 0 )
+               ,next_pitch_event     ( 0 )
+        {
+        }
+
+        void Reset()
+        {
+            mForceNote            = true;
+            mEventStatus          = kES_None;
+            current_note          = 0;
+            current_note_duration = 0;
+            mNoteDuration         = 0;
+            next_instrument_event = 0;
+            next_volume_event     = 0;
+            next_pitch_event      = 0;
+        }
+
+        TNoteEvents       note_events;
+        TInstrumentEvents instrument_events;
+        TVolumeEvents     volume_events;
+        TPitchEvents      pitch_events;
+
+        bool              mForceNote : 1;
+        int               mEventStatus;
+        unsigned int      current_note;
+        int               current_note_duration;
+        int               mNoteDuration;
+        unsigned int      next_instrument_event;
+        unsigned int      next_volume_event;
+        unsigned int      next_pitch_event;
+    };
+
+    typedef struct
+    {
+        uint16 index;
+        char   record_used;
+        char   name[9];
+    } SInstrumentName;
+
+    typedef std::vector<SInstrumentName> TInstrumentNames;
+
+    typedef struct
+    {
+        char   version_major;
+        char   version_minor;
+        char   signature[6];
+        uint16 number_of_list_entries_used;
+        uint16 total_number_of_list_entries;
+        int32  abs_offset_of_name_list;
+        int32  abs_offset_of_data;
+
+        TInstrumentNames ins_name_list;
+    } SBnkHeader;
+
+    typedef struct
+    {
+        unsigned char key_scale_level;
+        unsigned char freq_multiplier;
+        unsigned char feed_back;
+        unsigned char attack_rate;
+        unsigned char sustain_level;
+        unsigned char sustaining_sound;
+        unsigned char decay_rate;
+        unsigned char release_rate;
+        unsigned char output_level;
+        unsigned char amplitude_vibrato;
+        unsigned char frequency_vibrato;
+        unsigned char envelope_scaling;
+        unsigned char fm_type;
+    } SFMOperator;
+
+    typedef struct
+    {
+        unsigned char ammulti;
+        unsigned char ksltl;
+        unsigned char ardr;  
+        unsigned char slrr;
+        unsigned char fbc;
+        unsigned char waveform;
+    } SOPL2Op;
+
+    typedef struct
+    {
+        char        mode;
+        char        voice_number;
+        SOPL2Op     modulator;
+        SOPL2Op     carrier;
+    } SRolInstrument;
+
+    typedef struct
+    {
+        std::string    name;
+        SRolInstrument instrument;
+    } SUsedList;
+
+    void load_tempo_events     ( binistream *f );
+    bool load_voice_data       ( binistream *f, std::string const &bnk_filename, const CFileProvider &fp );
+    void load_note_events      ( binistream *f, CVoiceData &voice );
+    void load_instrument_events( binistream *f, CVoiceData &voice,
+                                 binistream *bnk_file, SBnkHeader const &bnk_header );
+    void load_volume_events    ( binistream *f, CVoiceData &voice );
+    void load_pitch_events     ( binistream *f, CVoiceData &voice );
+
+    bool load_bnk_info         ( binistream *f, SBnkHeader &header );
+    int  load_rol_instrument   ( binistream *f, SBnkHeader const &header, std::string &name );
+    void read_rol_instrument   ( binistream *f, SRolInstrument &ins );
+    void read_fm_operator      ( binistream *f, SOPL2Op &opl2_op );
+    int  get_ins_index( std::string const &name ) const;
+
+    void UpdateVoice( int const voice, CVoiceData &voiceData );
+    void SetNote( int const voice, int const note );
+    void SetNoteMelodic(  int const voice, int const note  );
+    void SetNotePercussive( int const voice, int const note );
+    void SetFreq   ( int const voice, int const note, bool const keyOn=false );
+    void SetPitch  ( int const voice, real32 const variation );
+    void SetVolume ( int const voice, int const volume );
+    void SetRefresh( float const multiplier );
+    void send_ins_data_to_chip( int const voice, int const ins_index );
+    void send_operator( int const voice, SOPL2Op const &modulator, SOPL2Op const &carrier );
+
+    class StringCompare
+    {
+    public:
+        bool operator()( SInstrumentName const &lhs, SInstrumentName const &rhs ) const
+        {
+            return keyLess(lhs.name, rhs.name);
+        }
+
+        bool operator()( SInstrumentName const &lhs, std::string const &rhs ) const
+        {
+            return keyLess(lhs.name, rhs.c_str());
+        }
+
+        bool operator()( std::string const &lhs, SInstrumentName const &rhs ) const
+        {
+            return keyLess(lhs.c_str(), rhs.name);
+        }
+    private:
+        bool keyLess( const char *const lhs, const char *const rhs ) const
+        {
+            return stricmp(lhs, rhs) < 0;
+        }
+    };
+
+    typedef std::vector<CVoiceData> TVoiceData;
+
+    SRolHeader *rol_header;
+    std::vector<STempoEvent>    mTempoEvents;
+    TVoiceData                  voice_data;
+    std::vector<SUsedList>      ins_list;
+
+    unsigned int                mNextTempoEvent;
+    int                         mCurrTick;
+    int                         mTimeOfLastNote;
+    float                       mRefresh;
+    unsigned char               bdRegister;
+    unsigned char               bxRegister[9];
+    unsigned char               volumeCache[11];
+    uint16			freqCache[11];
+    real32                      pitchCache[11];
+
+    static int    const kSizeofDataRecord;
+    static int    const kMaxTickBeat;
+    static int    const kSilenceNote;
+    static int    const kNumMelodicVoices;
+    static int    const kNumPercussiveVoices;
+    static int    const kBassDrumChannel;
+    static int    const kSnareDrumChannel;
+    static int    const kTomtomChannel;
+    static int    const kTomtomFreq;
+    static int    const kSnareDrumFreq;
+    static float  const kDefaultUpdateTme;
+    static float  const kPitchFactor;
+    static uint16 const kNoteTable[12];
+};
+
+#endif