home *** CD-ROM | disk | FTP | other *** search
/ Bila Vrana / BILA_VRANA.iso / 031A / GMS100.ZIP / gms100 / source / song.h < prev   
C/C++ Source or Header  |  1996-05-15  |  4KB  |  133 lines

  1. // Stuff relating to the song class
  2.  
  3. union overall_am_vib_union {
  4.   unsigned char byte;
  5.   struct {
  6.     unsigned : 6;
  7.     unsigned deep_vibrato: 1;
  8.     unsigned deep_amplitude_modulation: 1;
  9.   } bitmap;
  10. };
  11.  
  12. class song {
  13. public:
  14.   char *name;
  15.   char *info_page;   // Points to 14 null-terminated lines.
  16.   unsigned int highest_block;
  17.   block *block_pointer[MAX_BLOCKS];
  18.   unsigned int highest_pattern;
  19.   unsigned int pattern_list[MAX_PATTERNS];
  20.   unsigned int highest_instrument;
  21.   instrument *instrument_pointer[MAX_INSTRUMENTS];
  22.   unsigned int highest_stereo_left;
  23.   unsigned int highest_track;
  24.   enum sound_cards {adlib, sb, sbpro1, sbpro2} soundsystem;
  25.   overall_am_vib_union overall_am_vib;
  26.   unsigned int current_pattern;
  27.   unsigned int current_block;
  28.   unsigned int current_line;
  29.   unsigned char *current_note[MAX_TRACKS];
  30.   unsigned int tempo;
  31.   unsigned int secondary_tempo;
  32.   static const char tracker_id_string[][20];
  33.   static const unsigned int tracker_id_length[];
  34. #ifdef EDITOR_HOOKS
  35.   static const char inst_id_string[][20];
  36.   static const unsigned int inst_id_length[];
  37. #endif
  38.  
  39.   song();
  40.   ~song();
  41.   void position_jump(unsigned int new_pattern, unsigned int new_line = 0);
  42.   void block_jump(unsigned int new_block, unsigned int new_line = 0);
  43.   void skip_note(unsigned char *¬e);
  44.   void advance_line();
  45.   block *block_at_pattern(unsigned int pattern)
  46.     {return block_pointer[pattern_list[pattern]];}
  47.   unsigned char *find_line(unsigned char *note_pointer,
  48.     unsigned int line);
  49. #ifdef EDITOR_HOOKS
  50.   void add_blank_effect(block *which_block, unsigned int which_channel,
  51.     unsigned char *note);
  52.   void remove_effect(block *which_block, unsigned int which_channel,
  53.     unsigned char *effect);                    /* realloc()s - MUST resync
  54.                                                   position pointers after
  55.                                                   doing these! */
  56.   void editor_reformat();
  57.   unsigned int autoload_module(FILE *module);
  58.   unsigned int load_rad(FILE *module);
  59.   void save_gms(FILE *module);
  60.   unsigned int autoload_instrument(FILE *inst_file, unsigned int inst_num);
  61.   unsigned int load_gmi(FILE *inst_file, unsigned int inst_num);
  62.   void save_gmi(FILE *inst_file, unsigned int inst_num);
  63. #endif
  64.   void wipe_old_song();
  65.   unsigned int load_gms(FILE *module);
  66. };
  67.  
  68. inline void song::skip_note(unsigned char *¬e) {
  69.   if (note)   // Don't advance an "empty" track
  70.     if (*(note++) & 128)
  71.       if (*(note++) & 128) {
  72.         while (*note & 128)
  73.           note += 2;
  74.         note += 2;
  75.       }
  76. }
  77.  
  78. inline unsigned char *song::find_line(unsigned char *note_pointer,
  79.   unsigned int line) {
  80.   unsigned int stepper;
  81.  
  82.   for(stepper = 0;stepper < line;stepper++)
  83.     skip_note(note_pointer);
  84.   return note_pointer;
  85. }
  86.  
  87. #ifdef COMPILING_SONG
  88. const char song::tracker_id_string[][20] =
  89.   {{'G', 'M', 'S', '-', 'R', 'C', 'A', '~', '~', '~',     // GMS x.x
  90.    '~', '~', '~', '~', '~', '~', '~', '~', '~', '~'}
  91. #ifdef EDITOR_HOOKS
  92. ,
  93.    {'R', 'A', 'D', ' ', 'b', 'y', ' ', 'R', 'E', 'A',     // RAD x.x
  94.    'L', 'i', 'T', 'Y', '!', '!', '~', '~', '~', '~'}};
  95. #else
  96. };
  97. #endif
  98. // The magic cookies that let GMS recognize tracker datafiles.
  99.  
  100. const unsigned int song::tracker_id_length[] =
  101.   {7      // GMS x.x
  102. #ifdef EDITOR_HOOKS
  103. ,
  104.    16};   // RAD x.x
  105. #else
  106. };
  107. #endif
  108. // The number of characters in each magic cookie.
  109. #endif
  110.  
  111. #define GMS_MOD_OFFSET 0
  112. #define RAD_MOD_OFFSET 1
  113. #define HIGHEST_MOD_OFFSET 1
  114.  
  115. #ifdef COMPILING_SONGEXT
  116. const char song::inst_id_string[][20] =
  117.   {{'G', 'M', 'I', '-', 'R', 'C', 'A', '~', '~', '~',     // GMS x.x
  118.    '~', '~', '~', '~', '~', '~', '~', '~', '~', '~'}};
  119. // Magic cookies for instruments.
  120.  
  121. const unsigned int song::inst_id_length[] =
  122.   {7};   // GMS x.x
  123.  
  124. #define GMS_INST_OFFSET 0
  125. #define HIGHEST_INST_OFFSET 0
  126. #endif
  127.  
  128. #ifdef COMPILING_SONG
  129. song song_obj;
  130. #else
  131. extern song song_obj;
  132. #endif
  133.