ref: a38ba2a4aa68c6266aec60c90b6362fef4365b27
parent: b09ff6f00346a6aacf09930888523ab8a68115e2
author: Simon Howard <[email protected]>
date: Tue Sep 6 17:06:45 EDT 2005
Newer versions of mmus2mid.c,h from prboom Subversion-branch: /trunk/chocolate-doom Subversion-revision: 76
--- a/src/mmus2mid.c
+++ b/src/mmus2mid.c
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: mmus2mid.c 75 2005-09-05 22:50:56Z fraggle $
+// $Id: mmus2mid.c 76 2005-09-06 21:06:45Z fraggle $
//
// Copyright(C) 1993-1996 Id Software, Inc.
// Copyright (C) 1999 by
@@ -27,6 +27,9 @@
// 02111-1307, USA.
//
// $Log$
+// Revision 1.2 2005/09/06 21:06:45 fraggle
+// Newer versions of mmus2mid.c,h from prboom
+//
// Revision 1.1 2005/09/05 22:50:56 fraggle
// Add mmus2mid code from prboom. Use 'void *' for music handles. Pass
// length of data when registering music.
@@ -61,6 +64,9 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
+#ifdef MSDOS /* proff: I don't use allegro in windows */
+#include <allegro.h>
+#endif /* !MSDOS */
#include "mmus2mid.h"
//#define STANDALONE /* uncomment this to make MMUS2MID.EXE */
@@ -118,27 +124,27 @@
// initial track size allocation
#define TRACKBUFFERSIZE 1024
-// lookup table MUS -> MID controls
-static UBYTE MUS2MIDcontrol[15] =
+// lookup table MUS -> MID controls
+static UBYTE MUS2MIDcontrol[15] =
{
0, // Program change - not a MIDI control change
- 0x00, // Bank select
- 0x01, // Modulation pot
- 0x07, // Volume
- 0x0A, // Pan pot
- 0x0B, // Expression pot
- 0x5B, // Reverb depth
- 0x5D, // Chorus depth
- 0x40, // Sustain pedal
- 0x43, // Soft pedal
- 0x78, // All sounds off
- 0x7B, // All notes off
- 0x7E, // Mono
- 0x7F, // Poly
- 0x79 // Reset all controllers
+ 0x00, // Bank select
+ 0x01, // Modulation pot
+ 0x07, // Volume
+ 0x0A, // Pan pot
+ 0x0B, // Expression pot
+ 0x5B, // Reverb depth
+ 0x5D, // Chorus depth
+ 0x40, // Sustain pedal
+ 0x43, // Soft pedal
+ 0x78, // All sounds off
+ 0x7B, // All notes off
+ 0x7E, // Mono
+ 0x7F, // Poly
+ 0x79 // Reset all controllers
};
-// some strings of bytes used in the midi format
+// some strings of bytes used in the midi format
static UBYTE midikey[] =
{0x00,0xff,0x59,0x02,0x00,0x00}; // C major
@@ -356,7 +362,7 @@
track[i].velocity = 64;
track[i].deltaT = 0;
track[i].lastEvt = 0;
- free(mididata->track[i].data);//jff 3/5/98 remove old allocations
+ //free(mididata->track[i].data);//jff 3/5/98 remove old allocations
mididata->track[i].data=NULL;
track[i].alloced = 0;
mididata->track[i].len = 0;
@@ -373,20 +379,20 @@
// allocate for midi tempo/key track, allow for end of track
if (!(mididata->track[0].data =
- realloc(mididata->track[0].data,sizeof(midikey)+sizeof(miditempo)+4)))
+ realloc(mididata->track[0].data,sizeof(midikey)+sizeof(miditempo)+4)))
return MEMALLOC;
// key C major
memcpy(mididata->track[0].data,midikey,sizeof(midikey));
- // tempo uS/qnote
+ // tempo uS/qnote
memcpy(mididata->track[0].data+sizeof(midikey),miditempo,sizeof(miditempo));
- mididata->track[0].len = sizeof(midikey)+sizeof(miditempo);
+ mididata->track[0].len = sizeof(midikey)+sizeof(miditempo);
TrackCnt++; // music tracks start at 1
// process the MUS events in the MUS buffer
- do
+ do
{
// get a mus event, decode its type and channel fields
@@ -401,7 +407,7 @@
{
// set MIDIchannel and MIDItrack
- MIDIchannel = MUS2MIDchannel[MUSchannel] =
+ MIDIchannel = MUS2MIDchannel[MUSchannel] =
(MUSchannel == 15 ? 9 : FirstChannelAvailable(MUS2MIDchannel));
MIDItrack = MIDIchan2track[MIDIchannel] = (UBYTE)TrackCnt++;
}
@@ -418,7 +424,7 @@
switch(evt)
{
case RELEASE_NOTE:
- // killough 10/7/98: Fix noise problems by not allowing compression
+ // killough 10/7/98: Fix noise problems by not allowing compression
if (!(NewEvent=MidiEvent(mididata,0x90,MIDIchannel,MIDItrack,1)))
return MEMALLOC;
@@ -468,9 +474,9 @@
if (TWriteByte(mididata, MIDItrack, (UBYTE)(MUSh.channels+1)))
return MEMALLOC;
}
- else
- if (TWriteByte(mididata, MIDItrack, 0))
- return MEMALLOC;
+ else
+ if (TWriteByte(mididata, MIDItrack, 0))
+ return MEMALLOC;
break;
case CNTL_CHANGE:
@@ -509,11 +515,11 @@
if (last(event))
{
ULONG DeltaTime = ReadTime(&musptr); // killough 10/7/98: make local
- for (i = 0;i < MIDI_TRACKS; i++) //jff 3/13/98 update all tracks
- track[i].deltaT += DeltaTime; //whether allocated yet or not
+ for (i = 0;i < MIDI_TRACKS; i++) //jff 3/13/98 update all tracks
+ track[i].deltaT += DeltaTime; //whether allocated yet or not
}
- }
+ }
while ((evt != SCORE_END) && ((size_t)(musptr-mus) < muslen));
if (evt!=SCORE_END)
@@ -524,11 +530,11 @@
for (i = 0; i < MIDI_TRACKS; i++)
if (mididata->track[i].len)
{ // killough 10/7/98: simplify code
- if (TWriteByte(mididata, i, 0x00) || // midi end of track code
- TWriteByte(mididata, i, 0xFF) ||
- TWriteByte(mididata, i, 0x2F) ||
- TWriteByte(mididata, i, 0x00))
- return MEMALLOC;
+ if (TWriteByte(mididata, i, 0x00) || // midi end of track code
+ TWriteByte(mididata, i, 0xFF) ||
+ TWriteByte(mididata, i, 0x2F) ||
+ TWriteByte(mididata, i, 0x00))
+ return MEMALLOC;
// jff 1/23/98 fix failure to set data NULL, len 0 for unused tracks
// shorten allocation to proper length (important for Allegro)
@@ -545,6 +551,15 @@
return 0;
}
+void free_mididata(MIDI *mid)
+{
+ int i;
+
+ for (i = 0; i < MIDI_TRACKS; i++)
+ if (mid->track[i].data)
+ free(mid->track[i].data);
+}
+
//
// ReadLength()
//
@@ -569,11 +584,11 @@
//
// MidiToMIDI()
//
-// Convert an in-memory copy of a MIDI format 0 or 1 file to
+// Convert an in-memory copy of a MIDI format 0 or 1 file to
// an Allegro MIDI structure, that is valid or has been zeroed
//
// Passed a pointer to a memory buffer with MIDI format music in it and a
-// pointer to an Allegro MIDI structure.
+// pointer to an Allegro MIDI structure.
//
// Returns 0 if successful, BADMIDHDR if the buffer is not MIDI format
//
@@ -606,10 +621,10 @@
while (memcmp(mid,trackhdr,4)) // simply skip non-track data
{
mid += 4;
- {
- size_t t = ReadLength(&mid); // seek past header
- mid += t; // killough 10/7/98: prevent mid undefined behavior
- }
+ {
+ size_t t = ReadLength(&mid); // seek past header
+ mid += t; // killough 10/7/98: prevent mid undefined behavior
+ }
}
mid += 4;
mididata->track[i].len = ReadLength(&mid); // get length, move mid past it
@@ -643,7 +658,7 @@
//
// Passed a pointer to an Allegro MIDI structure
// Returns nothing
-//
+//
static void FreeTracks(MIDI *mididata)
{
int i;
@@ -727,7 +742,7 @@
midiptr += sizeof(trackhdr);
TWriteLength(&midiptr,mididata->track[i].len); // track length
// data
- memcpy(midiptr,mididata->track[i].data,mididata->track[i].len);
+ memcpy(midiptr,mididata->track[i].data,mididata->track[i].len);
midiptr += mididata->track[i].len;
}
}
--- a/src/mmus2mid.h
+++ b/src/mmus2mid.h
@@ -1,9 +1,14 @@
// Emacs style mode select -*- C++ -*-
-//-----------------------------------------------------------------------------
+//--------------------------------------------------------------------------
//
-// $Id: mmus2mid.h 75 2005-09-05 22:50:56Z fraggle $
+// $Id: mmus2mid.h 76 2005-09-06 21:06:45Z fraggle $
//
// Copyright(C) 1993-1996 Id Software, Inc.
+// Copyright (C) 1999 by
+// id Software, Chi Hoang, Lee Killough, Jim Flynn, Rand Phares, Ty Halderman
+// Copyright (C) 1999-2000 by
+// Jess Haas, Nicolas Kalkhof, Colin Phipps, Florian Schulze
+//
// Copyright(C) 2005 Simon Howard
//
// This program is free software; you can redistribute it and/or
@@ -22,38 +27,13 @@
// 02111-1307, USA.
//
// $Log$
+// Revision 1.2 2005/09/06 21:06:45 fraggle
+// Newer versions of mmus2mid.c,h from prboom
+//
// Revision 1.1 2005/09/05 22:50:56 fraggle
// Add mmus2mid code from prboom. Use 'void *' for music handles. Pass
// length of data when registering music.
//
-/* Emacs style mode select -*- C++ -*-
- *-----------------------------------------------------------------------------
- *
- *
- * PrBoom a Doom port merged with LxDoom and LSDLDoom
- * based on BOOM, a modified and improved DOOM engine
- * Copyright (C) 1999 by
- * id Software, Chi Hoang, Lee Killough, Jim Flynn, Rand Phares, Ty Halderman
- * Copyright (C) 1999-2000 by
- * Jess Haas, Nicolas Kalkhof, Colin Phipps, Florian Schulze
- *
- * 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., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- *
- *-----------------------------------------------------------------------------
- */
#if !defined( MMUS2MID_H )
#define MMUS2MID_H
@@ -62,25 +42,25 @@
typedef enum
{
- MUSDATACOR, // MUS data corrupt
- TOOMCHAN, // Too many channels
- MEMALLOC, // Memory allocation error
- MUSDATAMT, // MUS file empty
- BADMUSCTL, // MUS event 5 or 7 found
- BADSYSEVT, // MUS system event not in 10-14 range
- BADCTLCHG, // MUS control change larger than 9
- TRACKOVF, // MIDI track exceeds allocation
- BADMIDHDR, // bad midi header detected
+ MUSDATACOR, // MUS data corrupt
+ TOOMCHAN, // Too many channels
+ MEMALLOC, // Memory allocation error
+ MUSDATAMT, // MUS file empty
+ BADMUSCTL, // MUS event 5 or 7 found
+ BADSYSEVT, // MUS system event not in 10-14 range
+ BADCTLCHG, // MUS control change larger than 9
+ TRACKOVF, // MIDI track exceeds allocation
+ BADMIDHDR, // bad midi header detected
} error_code_t;
-// some names for integers of various sizes, all unsigned
-typedef unsigned char UBYTE; // a one-byte int
-typedef unsigned short UWORD; // a two-byte int
+// some names for integers of various sizes, all unsigned
+typedef unsigned char UBYTE; // a one-byte int
+typedef unsigned short UWORD; // a two-byte int
// proff: changed from unsigned int to unsigned long to avoid warning
-typedef unsigned long ULONG; // a four-byte int (assumes int 4 bytes)
+typedef unsigned long ULONG; // a four-byte int (assumes int 4 bytes)
#ifndef MSDOS /* proff: This is from allegro.h */
-#define MIDI_TRACKS 32
+#define MIDI_TRACKS 32
typedef struct MIDI /* a midi file */
{
@@ -88,11 +68,12 @@
struct {
unsigned char *data; /* MIDI message stream */
int len; /* length of the track data */
- } track[MIDI_TRACKS];
+ } track[MIDI_TRACKS];
} MIDI;
#endif /* !MSDOS */
extern int mmus2mid(const UBYTE *mus,MIDI *mid, UWORD division, int nocomp);
+extern void free_mididata(MIDI *mid);
extern int MIDIToMidi(MIDI *mididata,UBYTE **mid,int *midlen);
extern int MidiToMIDI(UBYTE *mid,MIDI *mididata);