/ source / audiolib / src / _midi.h
_midi.h
  1  //-------------------------------------------------------------------------
  2  /*
  3  Copyright (C) 2010-2019 EDuke32 developers and contributors
  4  Copyright (C) 2019 Nuke.YKT
  5  
  6  This file is part of NBlood.
  7  
  8  NBlood is free software; you can redistribute it and/or
  9  modify it under the terms of the GNU General Public License version 2
 10  as published by the Free Software Foundation.
 11  
 12  This program is distributed in the hope that it will be useful,
 13  but WITHOUT ANY WARRANTY; without even the implied warranty of
 14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 15  
 16  See the GNU General Public License for more details.
 17  
 18  You should have received a copy of the GNU General Public License
 19  along with this program; if not, write to the Free Software
 20  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 21  */
 22  //-------------------------------------------------------------------------
 23  
 24  #ifndef ___MIDI_H
 25  #define ___MIDI_H
 26  #include "compat.h"
 27  
 28  #define RELATIVE_BEAT(measure, beat, tick) ((tick) + ((beat) << 9) + ((measure) << 16))
 29  
 30  //Bobby Prince thinks this may be 100
 31  //#define GENMIDI_DefaultVolume 100
 32  #define GENMIDI_DefaultVolume 90
 33  
 34  #define MAX_FORMAT            1
 35  
 36  #define NUM_MIDI_CHANNELS     16
 37  
 38  #define TIME_PRECISION        16
 39  
 40  #define MIDI_HEADER_SIGNATURE 0x6468544d    // "MThd"
 41  #define MIDI_TRACK_SIGNATURE  0x6b72544d    // "MTrk"
 42  
 43  #define MIDI_VOLUME                7
 44  #define MIDI_PAN                   10
 45  #define MIDI_DETUNE                94
 46  #define MIDI_RHYTHM_CHANNEL        9
 47  #define MIDI_BANK_SELECT_MSB       0
 48  #define MIDI_BANK_SELECT_LSB       32
 49  #define MIDI_RPN_MSB               100
 50  #define MIDI_RPN_LSB               101
 51  #define MIDI_DATAENTRY_MSB         6
 52  #define MIDI_DATAENTRY_LSB         38
 53  #define MIDI_PITCHBEND_MSB         0
 54  #define MIDI_PITCHBEND_LSB         0
 55  #define MIDI_RUNNING_STATUS        0x80
 56  #define MIDI_NOTE_OFF              0x8
 57  #define MIDI_NOTE_ON               0x9
 58  #define MIDI_POLY_AFTER_TCH        0xA
 59  #define MIDI_CONTROL_CHANGE        0xB
 60  #define MIDI_PROGRAM_CHANGE        0xC
 61  #define MIDI_AFTER_TOUCH           0xD
 62  #define MIDI_PITCH_BEND            0xE
 63  #define MIDI_SPECIAL               0xF
 64  #define MIDI_SYSEX                 0xF0
 65  #define MIDI_SYSEX_CONTINUE        0xF7
 66  #define MIDI_META_EVENT            0xFF
 67  #define MIDI_END_OF_TRACK          0x2F
 68  #define MIDI_HOLD1                 0x40
 69  #define MIDI_SOSTENUTO             0x42
 70  #define MIDI_TEMPO_CHANGE          0x51
 71  #define MIDI_TIME_SIGNATURE        0x58
 72  #define MIDI_REVERB                0x5b
 73  #define MIDI_CHORUS                0x5d
 74  #define MIDI_ALL_SOUNDS_OFF        0x78
 75  #define MIDI_RESET_ALL_CONTROLLERS 0x79
 76  #define MIDI_ALL_NOTES_OFF         0x7b
 77  #define MIDI_MONO_MODE_ON          0x7E
 78  #define MIDI_SYSTEM_RESET          0xFF
 79  
 80  #define GET_NEXT_EVENT( track, data ) do { \
 81      ( data ) = *( track )->pos; \
 82      ( track )->pos += 1; \
 83  } while (0)
 84  
 85  #define GET_MIDI_CHANNEL( event )       ( ( event ) & 0xf )
 86  #define GET_MIDI_COMMAND( event )       ( ( event ) >> 4 )
 87  
 88  #define EMIDI_INFINITE          -1
 89  #define EMIDI_END_LOOP_VALUE    127
 90  #define EMIDI_ALL_CARDS         127
 91  #define EMIDI_INCLUDE_TRACK     110
 92  #define EMIDI_EXCLUDE_TRACK     111
 93  #define EMIDI_PROGRAM_CHANGE    112
 94  #define EMIDI_VOLUME_CHANGE     113
 95  #define EMIDI_CONTEXT_START     114
 96  #define EMIDI_CONTEXT_END       115
 97  #define EMIDI_LOOP_START        116
 98  #define EMIDI_LOOP_END          117
 99  #define EMIDI_SONG_LOOP_START   118
100  #define EMIDI_SONG_LOOP_END     119
101  
102  #define EMIDI_GeneralMIDI       0
103  #define EMIDI_SoundBlaster      4
104  #define EMIDI_AdLib             7
105  
106  #define EMIDI_AffectsCurrentCard(c, type) (((c) == EMIDI_ALL_CARDS) || ((c) == (type)))
107  #define EMIDI_NUM_CONTEXTS      7
108  
109  typedef struct
110  {
111      char *pos;
112      char *loopstart;
113      int16_t loopcount;
114      int16_t RunningStatus;
115      unsigned time;
116      int FPSecondsPerTick;
117      int16_t tick;
118      int16_t beat;
119      int16_t measure;
120      int16_t BeatsPerMeasure;
121      int16_t TicksPerBeat;
122      int16_t TimeBase;
123      int delay;
124      int16_t active;
125  } songcontext;
126  
127  typedef struct
128  {
129      char *start;
130      char *pos;
131  
132      int delay;
133      int16_t active;
134      int16_t RunningStatus;
135  
136      int16_t currentcontext;
137      songcontext context[EMIDI_NUM_CONTEXTS];
138  
139      char EMIDI_IncludeTrack;
140      char EMIDI_ProgramChange;
141      char EMIDI_VolumeChange;
142  } track;
143  
144  #endif