MusicKeyboard/include/midifile.h

214 lines
6.3 KiB
C
Raw Permalink Normal View History

#pragma once
#ifndef _MIDIFILE_H
#define _MIDIFILE_H
#include "midiinfo.h" /* enumerations and constants for GM */
/*
* midiFile.c - Header file for Steevs MIDI Library
* Version 1.4
*
* AUTHOR: Steven Goodwin (StevenGoodwin@gmail.com)
* Copyright 1998-2010, Steven Goodwin.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License,or (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
** All functions start with one of the following prefixes:
** midiFile* For non-GM features that relate to the file, and have
** no use once the file has been created, i.e. CreateFile
** or SetTrack (those data is embedded into the file, but
** not explicitly stored)
** midiSong* For operations that work across the song, i.e. SetTempo
** midiTrack* For operations on a specific track, i.e. AddNoteOn
*/
/*
** Types because we're dealing with files, and need to be careful
*/
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef int BOOL;
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#ifdef __cplusplus
extern "C" {
#endif
/*
** MIDI Constants
*/
#define MIDI_PPQN_DEFAULT 384
#define MIDI_VERSION_DEFAULT 1
/*
** MIDI Limits
*/
#define MAX_MIDI_TRACKS 256
#define MAX_TRACK_POLYPHONY 64
/*
** MIDI structures, accessibly externably
*/
typedef void MIDI_FILE;
typedef struct {
tMIDI_MSG iType;
DWORD dt; /* delta time */
DWORD dwAbsPos;
DWORD iMsgSize;
BOOL bImpliedMsg;
tMIDI_MSG iImpliedMsg;
/* Raw data chunk */
BYTE *data; /* dynamic data block */
DWORD data_sz;
union {
struct {
int iNote;
int iChannel;
int iVolume;
} NoteOn;
struct {
int iNote;
int iChannel;
} NoteOff;
struct {
int iNote;
int iChannel;
int iPressure;
} NoteKeyPressure;
struct {
int iChannel;
tMIDI_CC iControl;
int iParam;
} NoteParameter;
struct {
int iChannel;
int iProgram;
} ChangeProgram;
struct {
int iChannel;
int iPressure;
} ChangePressure;
struct {
int iChannel;
int iPitch;
} PitchWheel;
struct {
tMIDI_META iType;
union {
int iMIDIPort;
int iSequenceNumber;
struct {
BYTE *pData;
} Text;
struct {
int iBPM;
} Tempo;
struct {
int iHours, iMins;
int iSecs, iFrames,iFF;
} SMPTE;
struct {
tMIDI_KEYSIG iKey;
} KeySig;
struct {
int iNom, iDenom;
} TimeSig;
struct {
BYTE *pData;
int iSize;
} Sequencer;
} Data;
} MetaEvent;
struct {
BYTE *pData;
int iSize;
} SysEx;
} MsgData;
/* State information - Please treat these as private*/
tMIDI_MSG iLastMsgType;
BYTE iLastMsgChnl;
} MIDI_MSG;
/*
** midiFile* Prototypes
*/
MIDI_FILE *midiFileCreate(const char *pFilename, BOOL bOverwriteIfExists);
int midiFileSetTracksDefaultChannel(MIDI_FILE *pMF, int iTrack, int iChannel);
int midiFileGetTracksDefaultChannel(const MIDI_FILE *pMF, int iTrack);
BOOL midiFileFlushTrack(MIDI_FILE *pMF, int iTrack, BOOL bFlushToEnd, DWORD dwEndTimePos);
BOOL midiFileSyncTracks(MIDI_FILE *pMF, int iTrack1, int iTrack2);
int midiFileSetPPQN(MIDI_FILE *pMF, int PPQN);
int midiFileGetPPQN(const MIDI_FILE *pMF);
int midiFileSetVersion(MIDI_FILE *pMF, int iVersion);
int midiFileGetVersion(const MIDI_FILE *pMF);
MIDI_FILE *midiFileOpen(const char *pFilename);
BOOL midiFileClose(MIDI_FILE *pMF);
/*
** midiSong* Prototypes
*/
BOOL midiSongAddSMPTEOffset(MIDI_FILE *pMF, int iTrack, int iHours, int iMins, int iSecs, int iFrames, int iFFrames);
BOOL midiSongAddSimpleTimeSig(MIDI_FILE *pMF, int iTrack, int iNom, int iDenom);
BOOL midiSongAddTimeSig(MIDI_FILE *pMF, int iTrack, int iNom, int iDenom, int iClockInMetroTick, int iNotated32nds);
BOOL midiSongAddKeySig(MIDI_FILE *pMF, int iTrack, tMIDI_KEYSIG iKey);
BOOL midiSongAddTempo(MIDI_FILE *pMF, int iTrack, int iTempo);
BOOL midiSongAddMIDIPort(MIDI_FILE *pMF, int iTrack, int iPort);
BOOL midiSongAddEndSequence(MIDI_FILE *pMF, int iTrack);
/*
** midiTrack* Prototypes
*/
BOOL midiTrackAddRaw(MIDI_FILE *pMF, int iTrack, int iDataSize, const BYTE *pData, BOOL bMovePtr, int iDeltaTime);
BOOL midiTrackIncTime(MIDI_FILE *pMF, int iTrack, int iDeltaTime, BOOL bOverridePPQN);
BOOL midiTrackAddText(MIDI_FILE *pMF, int iTrack, tMIDI_TEXT iType, const char *pTxt);
BOOL midiTrackAddMsg(MIDI_FILE *pMF, int iTrack, tMIDI_MSG iMsg, int iParam1, int iParam2);
BOOL midiTrackSetKeyPressure(MIDI_FILE *pMF, int iTrack, int iNote, int iAftertouch);
BOOL midiTrackAddControlChange(MIDI_FILE *pMF, int iTrack, tMIDI_CC iCCType, int iParam);
BOOL midiTrackAddProgramChange(MIDI_FILE *pMF, int iTrack, int iInstrPatch);
BOOL midiTrackChangeKeyPressure(MIDI_FILE *pMF, int iTrack, int iDeltaPressure);
BOOL midiTrackSetPitchWheel(MIDI_FILE *pMF, int iTrack, int iWheelPos);
BOOL midiTrackAddNote(MIDI_FILE *pMF, int iTrack, int iNote, int iLength, int iVol, BOOL bAutoInc, BOOL bOverrideLength);
BOOL midiTrackAddRest(MIDI_FILE *pMF, int iTrack, int iLength, BOOL bOverridePPQN);
BOOL midiTrackGetEndPos(MIDI_FILE *pMF, int iTrack);
/*
** midiRead* Prototypes
*/
int midiReadGetNumTracks(const MIDI_FILE *pMF);
BOOL midiReadGetNextMessage(const MIDI_FILE *pMF, int iTrack, MIDI_MSG *pMsg);
void midiReadInitMessage(MIDI_MSG *pMsg);
void midiReadFreeMessage(MIDI_MSG *pMsg);
#ifdef __cplusplus
}
#endif
#endif /* _MIDIFILE_H */