annotate src/midifile.c @ 0:785057719d9b

Import.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 05 Aug 2013 12:25:43 +0300
parents
children 4df6d9714314
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1 /*
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
2 * midiFile.c - A general purpose midi file handling library. This code
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3 * can read and write MIDI files in formats 0 and 1.
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
4 * Version 1.4
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
5 *
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
6 * AUTHOR: Steven Goodwin (StevenGoodwin@gmail.com)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
7 * Copyright 1998-2010, Steven Goodwin
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
8 *
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
9 * This program is free software; you can redistribute it and/or
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
10 * modify it under the terms of the GNU General Public License as
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
11 * published by the Free Software Foundation; either version 2 of
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
12 * the License,or (at your option) any later version.
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
13 *
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
14 * This program is distributed in the hope that it will be useful,
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
17 * GNU General Public License for more details.
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
18 *
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
19 * You should have received a copy of the GNU General Public License
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
20 * along with this program; if not, write to the Free Software
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
22 */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
23
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
24 #include <stdio.h>
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
25 #include <stdlib.h>
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
26 #include <string.h>
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
27 #ifndef __APPLE__
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
28 #include <malloc.h>
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
29 #endif
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
30 #include "midifile.h"
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
31
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
32 /*
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
33 ** Internal Data Structures
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
34 */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
35 typedef struct {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
36 BYTE note, chn;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
37 BYTE valid, p2;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
38 DWORD end_pos;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
39 } MIDI_LAST_NOTE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
40
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
41 typedef struct {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
42 BYTE *ptr;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
43 BYTE *pBase;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
44 BYTE *pEnd;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
45
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
46 DWORD pos;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
47 DWORD dt;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
48 /* For Reading MIDI Files */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
49 DWORD sz; /* size of whole iTrack */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
50 /* For Writing MIDI Files */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
51 DWORD iBlockSize; /* max size of track */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
52 BYTE iDefaultChannel; /* use for write only */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
53 BYTE last_status; /* used for running status */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
54
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
55 MIDI_LAST_NOTE LastNote[MAX_TRACK_POLYPHONY];
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
56 } MIDI_FILE_TRACK;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
57
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
58 typedef struct {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
59 DWORD iHeaderSize;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
60 /**/
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
61 WORD iVersion; /* 0, 1 or 2 */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
62 WORD iNumTracks; /* number of tracks... (will be 1 for MIDI type 0) */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
63 WORD PPQN; /* pulses per quarter note */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
64 } MIDI_HEADER;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
65
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
66 typedef struct {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
67 FILE *pFile;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
68 BOOL bOpenForWriting;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
69
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
70 MIDI_HEADER Header;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
71 BYTE *ptr; /* to whole data block */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
72 DWORD file_sz;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
73
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
74 MIDI_FILE_TRACK Track[MAX_MIDI_TRACKS];
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
75 } _MIDI_FILE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
76
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
77
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
78 /*
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
79 ** Internal Functions
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
80 */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
81 #define DT_DEF 32 /* assume maximum delta-time + msg is no more than 32 bytes */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
82 #define SWAP_WORD(w) (WORD)(((w)>>8)|((w)<<8))
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
83 #define SWAP_DWORD(d) (DWORD)((d)>>24)|(((d)>>8)&0xff00)|(((d)<<8)&0xff0000)|(((d)<<24))
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
84
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
85 #define _VAR_CAST _MIDI_FILE *pMF = (_MIDI_FILE *)_pMF
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
86 #define IsFilePtrValid(pMF) (pMF)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
87 #define IsTrackValid(_x) (_midiValidateTrack(pMF, _x))
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
88 #define IsChannelValid(_x) ((_x)>=1 && (_x)<=16)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
89 #define IsNoteValid(_x) ((_x)>=0 && (_x)<128)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
90 #define IsMessageValid(_x) ((_x)>=msgNoteOff && (_x)<=msgMetaEvent)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
91
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
92
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
93 static BOOL _midiValidateTrack(const _MIDI_FILE *pMF, int iTrack)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
94 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
95 if (!IsFilePtrValid(pMF)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
96
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
97 if (pMF->bOpenForWriting)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
98 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
99 if (iTrack < 0 || iTrack >= MAX_MIDI_TRACKS)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
100 return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
101 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
102 else /* open for reading */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
103 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
104 if (!pMF->ptr)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
105 return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
106
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
107 if (iTrack < 0 || iTrack>=pMF->Header.iNumTracks)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
108 return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
109 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
110
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
111 return TRUE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
112 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
113
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
114 static BYTE *_midiWriteVarLen(BYTE *ptr, int n)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
115 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
116 register long buffer;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
117 register long value=n;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
118
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
119 buffer = value & 0x7f;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
120 while ((value >>= 7) > 0)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
121 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
122 buffer <<= 8;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
123 buffer |= 0x80;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
124 buffer += (value & 0x7f);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
125 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
126
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
127 while (TRUE)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
128 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
129 *ptr++ = (BYTE)buffer;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
130 if (buffer & 0x80)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
131 buffer >>= 8;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
132 else
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
133 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
134 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
135
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
136 return(ptr);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
137 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
138
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
139 /* Return a ptr to valid block of memory to store a message
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
140 ** of up to sz_reqd bytes
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
141 */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
142 static BYTE *_midiGetPtr(_MIDI_FILE *pMF, int iTrack, int sz_reqd)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
143 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
144 const DWORD mem_sz_inc = 8092; /* arbitary */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
145 BYTE *ptr;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
146 int curr_offset;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
147 MIDI_FILE_TRACK *pTrack = &pMF->Track[iTrack];
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
148
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
149 ptr = pTrack->ptr;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
150 if (ptr == NULL || ptr+sz_reqd > pTrack->pEnd) /* need more RAM! */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
151 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
152 curr_offset = ptr-pTrack->pBase;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
153 if ((ptr = (BYTE *)realloc(pTrack->pBase, mem_sz_inc+pTrack->iBlockSize)))
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
154 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
155 pTrack->pBase = ptr;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
156 pTrack->iBlockSize += mem_sz_inc;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
157 pTrack->pEnd = ptr+pTrack->iBlockSize;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
158 /* Move new ptr to continue data entry: */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
159 pTrack->ptr = ptr+curr_offset;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
160 ptr += curr_offset;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
161 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
162 else
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
163 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
164 /* NO MEMORY LEFT */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
165 return NULL;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
166 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
167 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
168
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
169 return ptr;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
170 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
171
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
172
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
173 static int _midiGetLength(int ppqn, int iNoteLen, BOOL bOverride)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
174 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
175 int length = ppqn;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
176
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
177 if (bOverride)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
178 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
179 length = iNoteLen;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
180 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
181 else
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
182 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
183 switch(iNoteLen)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
184 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
185 case MIDI_NOTE_DOTTED_MINIM:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
186 length *= 3;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
187 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
188
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
189 case MIDI_NOTE_DOTTED_CROCHET:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
190 length *= 3;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
191 length /= 2;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
192 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
193
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
194 case MIDI_NOTE_DOTTED_QUAVER:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
195 length *= 3;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
196 length /= 4;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
197 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
198
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
199 case MIDI_NOTE_DOTTED_SEMIQUAVER:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
200 length *= 3;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
201 length /= 8;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
202 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
203
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
204 case MIDI_NOTE_DOTTED_SEMIDEMIQUAVER:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
205 length *= 3;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
206 length /= 16;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
207 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
208
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
209 case MIDI_NOTE_BREVE:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
210 length *= 4;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
211 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
212
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
213 case MIDI_NOTE_MINIM:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
214 length *= 2;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
215 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
216
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
217 case MIDI_NOTE_QUAVER:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
218 length /= 2;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
219 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
220
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
221 case MIDI_NOTE_SEMIQUAVER:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
222 length /= 4;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
223 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
224
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
225 case MIDI_NOTE_SEMIDEMIQUAVER:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
226 length /= 8;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
227 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
228
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
229 case MIDI_NOTE_TRIPLE_CROCHET:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
230 length *= 2;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
231 length /= 3;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
232 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
233 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
234 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
235
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
236 return length;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
237 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
238
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
239 /*
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
240 ** midiFile* Functions
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
241 */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
242 MIDI_FILE *midiFileCreate(const char *pFilename, BOOL bOverwriteIfExists)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
243 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
244 _MIDI_FILE *pMF = (_MIDI_FILE *)malloc(sizeof(_MIDI_FILE));
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
245 int i;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
246
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
247 if (!pMF) return NULL;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
248
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
249 if (!bOverwriteIfExists)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
250 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
251 if ((pMF->pFile = fopen(pFilename, "r")))
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
252 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
253 fclose(pMF->pFile);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
254 free(pMF);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
255 return NULL;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
256 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
257 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
258
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
259 if ((pMF->pFile = fopen(pFilename, "wb+")))
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
260 {/*empty*/}
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
261 else
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
262 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
263 free((void *)pMF);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
264 return NULL;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
265 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
266
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
267 pMF->bOpenForWriting = TRUE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
268 pMF->Header.PPQN = MIDI_PPQN_DEFAULT;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
269 pMF->Header.iVersion = MIDI_VERSION_DEFAULT;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
270
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
271 for(i=0;i<MAX_MIDI_TRACKS;++i)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
272 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
273 pMF->Track[i].pos = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
274 pMF->Track[i].ptr = NULL;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
275 pMF->Track[i].pBase = NULL;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
276 pMF->Track[i].pEnd = NULL;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
277 pMF->Track[i].iBlockSize = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
278 pMF->Track[i].dt = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
279 pMF->Track[i].iDefaultChannel = (BYTE)(i & 0xf);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
280
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
281 memset(pMF->Track[i].LastNote, '\0', sizeof(pMF->Track[i].LastNote));
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
282 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
283
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
284 return (MIDI_FILE *)pMF;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
285 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
286
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
287 int midiFileSetTracksDefaultChannel(MIDI_FILE *_pMF, int iTrack, int iChannel)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
288 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
289 int prev;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
290
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
291 _VAR_CAST;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
292 if (!IsFilePtrValid(pMF)) return 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
293 if (!IsTrackValid(iTrack)) return 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
294 if (!IsChannelValid(iChannel)) return 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
295
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
296 /* For programmer each, iChannel is between 1 & 16 - but MIDI uses
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
297 ** 0-15. Thus, the fudge factor of 1 :)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
298 */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
299 prev = pMF->Track[iTrack].iDefaultChannel+1;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
300 pMF->Track[iTrack].iDefaultChannel = (BYTE)(iChannel-1);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
301 return prev;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
302 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
303
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
304 int midiFileGetTracksDefaultChannel(const MIDI_FILE *_pMF, int iTrack)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
305 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
306 _VAR_CAST;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
307 if (!IsFilePtrValid(pMF)) return 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
308 if (!IsTrackValid(iTrack)) return 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
309
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
310 return pMF->Track[iTrack].iDefaultChannel+1;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
311 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
312
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
313 int midiFileSetPPQN(MIDI_FILE *_pMF, int PPQN)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
314 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
315 int prev;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
316
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
317 _VAR_CAST;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
318 if (!IsFilePtrValid(pMF)) return MIDI_PPQN_DEFAULT;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
319 prev = pMF->Header.PPQN;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
320 pMF->Header.PPQN = (WORD)PPQN;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
321 return prev;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
322 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
323
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
324 int midiFileGetPPQN(const MIDI_FILE *_pMF)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
325 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
326 _VAR_CAST;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
327 if (!IsFilePtrValid(pMF)) return MIDI_PPQN_DEFAULT;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
328 return (int)pMF->Header.PPQN;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
329 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
330
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
331 int midiFileSetVersion(MIDI_FILE *_pMF, int iVersion)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
332 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
333 int prev;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
334
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
335 _VAR_CAST;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
336 if (!IsFilePtrValid(pMF)) return MIDI_VERSION_DEFAULT;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
337 if (iVersion<0 || iVersion>2) return MIDI_VERSION_DEFAULT;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
338 prev = pMF->Header.iVersion;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
339 pMF->Header.iVersion = (WORD)iVersion;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
340 return prev;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
341 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
342
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
343 int midiFileGetVersion(const MIDI_FILE *_pMF)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
344 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
345 _VAR_CAST;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
346 if (!IsFilePtrValid(pMF)) return MIDI_VERSION_DEFAULT;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
347 return pMF->Header.iVersion;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
348 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
349
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
350 MIDI_FILE *midiFileOpen(const char *pFilename)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
351 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
352 FILE *fp = fopen(pFilename, "rb");
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
353 _MIDI_FILE *pMF = NULL;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
354 BYTE *ptr;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
355 BOOL bValidFile=FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
356 long size;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
357
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
358 if (fp)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
359 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
360 if ((pMF = (_MIDI_FILE *)malloc(sizeof(_MIDI_FILE))))
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
361 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
362 fseek(fp, 0L, SEEK_END);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
363 size = ftell(fp);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
364 if ((pMF->ptr = (BYTE *)malloc(size)))
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
365 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
366 fseek(fp, 0L, SEEK_SET);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
367 fread(pMF->ptr, sizeof(BYTE), size, fp);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
368 /* Is this a valid MIDI file ? */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
369 ptr = pMF->ptr;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
370 if (*(ptr+0) == 'M' && *(ptr+1) == 'T' &&
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
371 *(ptr+2) == 'h' && *(ptr+3) == 'd')
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
372 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
373 DWORD dwData;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
374 WORD wData;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
375 int i;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
376
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
377 dwData = *((DWORD *)(ptr+4));
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
378 pMF->Header.iHeaderSize = SWAP_DWORD(dwData);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
379
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
380 wData = *((WORD *)(ptr+8));
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
381 pMF->Header.iVersion = (WORD)SWAP_WORD(wData);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
382
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
383 wData = *((WORD *)(ptr+10));
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
384 pMF->Header.iNumTracks = (WORD)SWAP_WORD(wData);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
385
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
386 wData = *((WORD *)(ptr+12));
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
387 pMF->Header.PPQN = (WORD)SWAP_WORD(wData);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
388
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
389 ptr += pMF->Header.iHeaderSize+8;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
390 /*
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
391 ** Get all tracks
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
392 */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
393 for(i=0;i<MAX_MIDI_TRACKS;++i)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
394 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
395 pMF->Track[i].pos = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
396 pMF->Track[i].last_status = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
397 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
398
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
399 for(i=0;i<pMF->Header.iNumTracks;++i)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
400 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
401 pMF->Track[i].pBase = ptr;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
402 pMF->Track[i].ptr = ptr+8;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
403 dwData = *((DWORD *)(ptr+4));
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
404 pMF->Track[i].sz = SWAP_DWORD(dwData);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
405 pMF->Track[i].pEnd = ptr+pMF->Track[i].sz+8;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
406 ptr += pMF->Track[i].sz+8;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
407 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
408
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
409 pMF->bOpenForWriting = FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
410 pMF->pFile = NULL;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
411 bValidFile = TRUE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
412 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
413 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
414 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
415
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
416 fclose(fp);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
417 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
418
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
419 if (!bValidFile)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
420 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
421 if (pMF) free((void *)pMF);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
422 return NULL;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
423 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
424
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
425 return (MIDI_FILE *)pMF;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
426 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
427
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
428 typedef struct {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
429 int iIdx;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
430 int iEndPos;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
431 } MIDI_END_POINT;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
432
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
433 static int qs_cmp_pEndPoints(const void *e1, const void *e2)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
434 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
435 MIDI_END_POINT *p1 = (MIDI_END_POINT *)e1;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
436 MIDI_END_POINT *p2 = (MIDI_END_POINT *)e2;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
437
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
438 return p1->iEndPos-p2->iEndPos;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
439 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
440
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
441 BOOL midiFileFlushTrack(MIDI_FILE *_pMF, int iTrack, BOOL bFlushToEnd, DWORD dwEndTimePos)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
442 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
443 int sz;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
444 BYTE *ptr;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
445 MIDI_END_POINT *pEndPoints;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
446 int num, i, mx_pts;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
447 BOOL bNoChanges = TRUE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
448
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
449 _VAR_CAST;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
450 if (!IsFilePtrValid(pMF)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
451 if (!_midiValidateTrack(pMF, iTrack)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
452 sz = sizeof(pMF->Track[0].LastNote)/sizeof(pMF->Track[0].LastNote[0]);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
453
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
454 /*
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
455 ** Flush all
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
456 */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
457 pEndPoints = (MIDI_END_POINT *)malloc(sz * sizeof(MIDI_END_POINT));
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
458 mx_pts = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
459 for(i=0;i<sz;++i)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
460 if (pMF->Track[iTrack].LastNote[i].valid)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
461 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
462 pEndPoints[mx_pts].iIdx = i;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
463 pEndPoints[mx_pts].iEndPos = pMF->Track[iTrack].LastNote[i].end_pos;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
464 mx_pts++;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
465 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
466
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
467 if (bFlushToEnd)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
468 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
469 if (mx_pts)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
470 dwEndTimePos = pEndPoints[mx_pts-1].iEndPos;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
471 else
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
472 dwEndTimePos = pMF->Track[iTrack].pos;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
473 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
474
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
475 if (mx_pts)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
476 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
477 /* Sort, smallest first, and add the note off msgs */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
478 qsort(pEndPoints, mx_pts, sizeof(MIDI_END_POINT), qs_cmp_pEndPoints);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
479
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
480 i = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
481 while ((dwEndTimePos >= (DWORD)pEndPoints[i].iEndPos || bFlushToEnd) && i<mx_pts)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
482 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
483 ptr = _midiGetPtr(pMF, iTrack, DT_DEF);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
484 if (!ptr)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
485 return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
486
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
487 num = pEndPoints[i].iIdx; /* get 'LastNote' index */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
488
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
489 ptr = _midiWriteVarLen(ptr, pMF->Track[iTrack].LastNote[num].end_pos - pMF->Track[iTrack].pos);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
490 /* msgNoteOn msgNoteOff */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
491 *ptr++ = (BYTE)(msgNoteOff | pMF->Track[iTrack].LastNote[num].chn);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
492 *ptr++ = pMF->Track[iTrack].LastNote[num].note;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
493 *ptr++ = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
494
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
495 pMF->Track[iTrack].LastNote[num].valid = FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
496 pMF->Track[iTrack].pos = pMF->Track[iTrack].LastNote[num].end_pos;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
497
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
498 pMF->Track[iTrack].ptr = ptr;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
499
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
500 ++i;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
501 bNoChanges = FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
502 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
503 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
504
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
505 free((void *)pEndPoints);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
506 /*
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
507 ** Re-calc current position
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
508 */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
509 pMF->Track[iTrack].dt = dwEndTimePos - pMF->Track[iTrack].pos;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
510
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
511 return TRUE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
512 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
513
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
514 BOOL midiFileSyncTracks(MIDI_FILE *_pMF, int iTrack1, int iTrack2)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
515 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
516 int p1, p2;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
517
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
518 _VAR_CAST;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
519 if (!IsFilePtrValid(pMF)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
520 if (!IsTrackValid(iTrack1)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
521 if (!IsTrackValid(iTrack2)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
522
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
523 p1 = pMF->Track[iTrack1].pos + pMF->Track[iTrack1].dt;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
524 p2 = pMF->Track[iTrack2].pos + pMF->Track[iTrack2].dt;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
525
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
526 if (p1 < p2) midiTrackIncTime(pMF, iTrack1, p2-p1, TRUE);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
527 else if (p2 < p1) midiTrackIncTime(pMF, iTrack2, p1-p2, TRUE);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
528
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
529 return TRUE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
530 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
531
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
532
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
533 BOOL midiFileClose(MIDI_FILE *_pMF)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
534 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
535 _VAR_CAST;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
536 if (!IsFilePtrValid(pMF)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
537
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
538 if (pMF->bOpenForWriting)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
539 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
540 WORD iNumTracks = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
541 WORD wTest = 256;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
542 BOOL bSwap = FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
543 int i;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
544
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
545 /* Intel processor style-endians need byte swap :( */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
546 if (*((BYTE *)&wTest) == 0)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
547 bSwap = TRUE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
548
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
549 /* Flush our buffers */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
550 for(i=0;i<MAX_MIDI_TRACKS;++i)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
551 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
552 if (pMF->Track[i].ptr)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
553 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
554 midiSongAddEndSequence(pMF, i);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
555 midiFileFlushTrack(pMF, i, TRUE, 0);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
556 iNumTracks++;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
557 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
558 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
559 /*
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
560 ** Header
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
561 */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
562 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
563 const BYTE mthd[4] = {'M', 'T', 'h', 'd'};
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
564 DWORD dwData;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
565 WORD wData;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
566 WORD version, PPQN;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
567
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
568 fwrite(mthd, sizeof(BYTE), 4, pMF->pFile);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
569 dwData = 6;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
570 if (bSwap) dwData = SWAP_DWORD(dwData);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
571 fwrite(&dwData, sizeof(DWORD), 1, pMF->pFile);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
572
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
573 wData = (WORD)(iNumTracks==1?pMF->Header.iVersion:1);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
574 if (bSwap) version = SWAP_WORD(wData); else version = (WORD)wData;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
575 if (bSwap) iNumTracks = SWAP_WORD(iNumTracks);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
576 wData = pMF->Header.PPQN;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
577 if (bSwap) PPQN = SWAP_WORD(wData); else PPQN = wData;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
578 fwrite(&version, sizeof(WORD), 1, pMF->pFile);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
579 fwrite(&iNumTracks, sizeof(WORD), 1, pMF->pFile);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
580 fwrite(&PPQN, sizeof(WORD), 1, pMF->pFile);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
581 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
582 /*
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
583 ** Track data
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
584 */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
585 for(i=0;i<MAX_MIDI_TRACKS;++i)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
586 if (pMF->Track[i].ptr)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
587 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
588 const BYTE mtrk[4] = {'M', 'T', 'r', 'k'};
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
589 DWORD sz, dwData;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
590
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
591 /* Write track header */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
592 fwrite(&mtrk, sizeof(BYTE), 4, pMF->pFile);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
593
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
594 /* Write data size */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
595 sz = dwData = (int)(pMF->Track[i].ptr - pMF->Track[i].pBase);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
596 if (bSwap) sz = SWAP_DWORD(sz);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
597 fwrite(&sz, sizeof(DWORD), 1, pMF->pFile);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
598
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
599 /* Write data */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
600 fwrite(pMF->Track[i].pBase, sizeof(BYTE), dwData, pMF->pFile);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
601
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
602 /* Free memory */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
603 free((void *)pMF->Track[i].pBase);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
604 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
605
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
606 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
607
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
608 if (pMF->pFile)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
609 return fclose(pMF->pFile)?FALSE:TRUE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
610 free((void *)pMF);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
611 return TRUE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
612 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
613
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
614
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
615 /*
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
616 ** midiSong* Functions
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
617 */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
618 BOOL midiSongAddSMPTEOffset(MIDI_FILE *_pMF, int iTrack, int iHours, int iMins, int iSecs, int iFrames, int iFFrames)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
619 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
620 static BYTE tmp[] = {msgMetaEvent, metaSMPTEOffset, 0x05, 0,0,0,0,0};
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
621
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
622 _VAR_CAST;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
623 if (!IsFilePtrValid(pMF)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
624 if (!IsTrackValid(iTrack)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
625
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
626 if (iMins<0 || iMins>59) iMins=0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
627 if (iSecs<0 || iSecs>59) iSecs=0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
628 if (iFrames<0 || iFrames>24) iFrames=0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
629
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
630 tmp[3] = (BYTE)iHours;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
631 tmp[4] = (BYTE)iMins;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
632 tmp[5] = (BYTE)iSecs;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
633 tmp[6] = (BYTE)iFrames;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
634 tmp[7] = (BYTE)iFFrames;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
635 return midiTrackAddRaw(pMF, iTrack, sizeof(tmp), tmp, FALSE, 0);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
636 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
637
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
638
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
639 BOOL midiSongAddSimpleTimeSig(MIDI_FILE *_pMF, int iTrack, int iNom, int iDenom)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
640 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
641 return midiSongAddTimeSig(_pMF, iTrack, iNom, iDenom, 24, 8);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
642 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
643
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
644 BOOL midiSongAddTimeSig(MIDI_FILE *_pMF, int iTrack, int iNom, int iDenom, int iClockInMetroTick, int iNotated32nds)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
645 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
646 static BYTE tmp[] = {msgMetaEvent, metaTimeSig, 0x04, 0,0,0,0};
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
647
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
648 _VAR_CAST;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
649 if (!IsFilePtrValid(pMF)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
650 if (!IsTrackValid(iTrack)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
651
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
652 tmp[3] = (BYTE)iNom;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
653 tmp[4] = (BYTE)(MIDI_NOTE_MINIM/iDenom);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
654 tmp[5] = (BYTE)iClockInMetroTick;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
655 tmp[6] = (BYTE)iNotated32nds;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
656 return midiTrackAddRaw(pMF, iTrack, sizeof(tmp), tmp, FALSE, 0);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
657 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
658
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
659 BOOL midiSongAddKeySig(MIDI_FILE *_pMF, int iTrack, tMIDI_KEYSIG iKey)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
660 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
661 static BYTE tmp[] = {msgMetaEvent, metaKeySig, 0x02, 0, 0};
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
662
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
663 _VAR_CAST;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
664 if (!IsFilePtrValid(pMF)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
665 if (!IsTrackValid(iTrack)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
666
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
667 tmp[3] = (BYTE)((iKey&keyMaskKey)*((iKey&keyMaskNeg)?-1:1));
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
668 tmp[4] = (BYTE)((iKey&keyMaskMin)?1:0);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
669 return midiTrackAddRaw(pMF, iTrack, sizeof(tmp), tmp, FALSE, 0);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
670 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
671
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
672 BOOL midiSongAddTempo(MIDI_FILE *_pMF, int iTrack, int iTempo)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
673 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
674 static BYTE tmp[] = {msgMetaEvent, metaSetTempo, 0x03, 0,0,0};
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
675 int us; /* micro-seconds per qn */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
676
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
677 _VAR_CAST;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
678 if (!IsFilePtrValid(pMF)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
679 if (!IsTrackValid(iTrack)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
680
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
681 us = 60000000L/iTempo;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
682 tmp[3] = (BYTE)((us>>16)&0xff);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
683 tmp[4] = (BYTE)((us>>8)&0xff);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
684 tmp[5] = (BYTE)((us>>0)&0xff);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
685 return midiTrackAddRaw(pMF, iTrack, sizeof(tmp), tmp, FALSE, 0);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
686 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
687
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
688 BOOL midiSongAddMIDIPort(MIDI_FILE *_pMF, int iTrack, int iPort)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
689 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
690 static BYTE tmp[] = {msgMetaEvent, metaMIDIPort, 1, 0};
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
691
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
692 _VAR_CAST;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
693 if (!IsFilePtrValid(pMF)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
694 if (!IsTrackValid(iTrack)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
695 tmp[3] = (BYTE)iPort;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
696 return midiTrackAddRaw(pMF, iTrack, sizeof(tmp), tmp, FALSE, 0);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
697 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
698
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
699 BOOL midiSongAddEndSequence(MIDI_FILE *_pMF, int iTrack)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
700 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
701 static BYTE tmp[] = {msgMetaEvent, metaEndSequence, 0};
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
702
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
703 _VAR_CAST;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
704 if (!IsFilePtrValid(pMF)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
705 if (!IsTrackValid(iTrack)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
706
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
707 return midiTrackAddRaw(pMF, iTrack, sizeof(tmp), tmp, FALSE, 0);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
708 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
709
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
710
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
711 /*
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
712 ** midiTrack* Functions
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
713 */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
714 BOOL midiTrackAddRaw(MIDI_FILE *_pMF, int iTrack, int data_sz, const BYTE *pData, BOOL bMovePtr, int dt)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
715 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
716 MIDI_FILE_TRACK *pTrk;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
717 BYTE *ptr;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
718 int dtime;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
719
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
720 _VAR_CAST;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
721 if (!IsFilePtrValid(pMF)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
722 if (!IsTrackValid(iTrack)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
723
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
724 pTrk = &pMF->Track[iTrack];
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
725 ptr = _midiGetPtr(pMF, iTrack, data_sz+DT_DEF);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
726 if (!ptr)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
727 return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
728
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
729 dtime = pTrk->dt;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
730 if (bMovePtr)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
731 dtime += dt;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
732
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
733 ptr = _midiWriteVarLen(ptr, dtime);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
734 memcpy(ptr, pData, data_sz);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
735
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
736 pTrk->pos += dtime;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
737 pTrk->dt = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
738 pTrk->ptr = ptr+data_sz;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
739
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
740 return TRUE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
741 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
742
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
743
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
744 BOOL midiTrackIncTime(MIDI_FILE *_pMF, int iTrack, int iDeltaTime, BOOL bOverridePPQN)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
745 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
746 DWORD will_end_at;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
747
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
748 _VAR_CAST;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
749 if (!IsFilePtrValid(pMF)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
750 if (!IsTrackValid(iTrack)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
751
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
752 will_end_at = _midiGetLength(pMF->Header.PPQN, iDeltaTime, bOverridePPQN);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
753 will_end_at += pMF->Track[iTrack].pos + pMF->Track[iTrack].dt;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
754
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
755 midiFileFlushTrack(pMF, iTrack, FALSE, will_end_at);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
756
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
757 return TRUE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
758 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
759
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
760 BOOL midiTrackAddText(MIDI_FILE *_pMF, int iTrack, tMIDI_TEXT iType, const char *pTxt)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
761 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
762 BYTE *ptr;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
763 int sz;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
764
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
765 _VAR_CAST;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
766 if (!IsFilePtrValid(pMF)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
767 if (!IsTrackValid(iTrack)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
768
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
769 sz = strlen(pTxt);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
770 if ((ptr = _midiGetPtr(pMF, iTrack, sz+DT_DEF)))
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
771 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
772 *ptr++ = 0; /* delta-time=0 */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
773 *ptr++ = msgMetaEvent;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
774 *ptr++ = (BYTE)iType;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
775 ptr = _midiWriteVarLen((BYTE *)ptr, sz);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
776 strcpy((char *)ptr, pTxt);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
777 pMF->Track[iTrack].ptr = ptr+sz;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
778 return TRUE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
779 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
780 else
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
781 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
782 return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
783 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
784 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
785
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
786 BOOL midiTrackSetKeyPressure(MIDI_FILE *pMF, int iTrack, int iNote, int iAftertouch)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
787 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
788 return midiTrackAddMsg(pMF, iTrack, msgNoteKeyPressure, iNote, iAftertouch);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
789 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
790
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
791 BOOL midiTrackAddControlChange(MIDI_FILE *pMF, int iTrack, tMIDI_CC iCCType, int iParam)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
792 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
793 return midiTrackAddMsg(pMF, iTrack, msgControlChange, iCCType, iParam);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
794 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
795
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
796 BOOL midiTrackAddProgramChange(MIDI_FILE *pMF, int iTrack, int iInstrPatch)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
797 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
798 return midiTrackAddMsg(pMF, iTrack, msgSetProgram, iInstrPatch, 0);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
799 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
800
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
801 BOOL midiTrackChangeKeyPressure(MIDI_FILE *pMF, int iTrack, int iDeltaPressure)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
802 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
803 return midiTrackAddMsg(pMF, iTrack, msgChangePressure, iDeltaPressure&0x7f, 0);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
804 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
805
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
806 BOOL midiTrackSetPitchWheel(MIDI_FILE *pMF, int iTrack, int iWheelPos)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
807 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
808 WORD wheel = (WORD)iWheelPos;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
809
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
810 /* bitshift 7 instead of eight because we're dealing with 7 bit numbers */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
811 wheel += MIDI_WHEEL_CENTRE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
812 return midiTrackAddMsg(pMF, iTrack, msgSetPitchWheel, wheel&0x7f, (wheel>>7)&0x7f);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
813 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
814
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
815 BOOL midiTrackAddMsg(MIDI_FILE *_pMF, int iTrack, tMIDI_MSG iMsg, int iParam1, int iParam2)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
816 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
817 BYTE *ptr;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
818 BYTE data[3];
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
819 int sz;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
820
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
821 _VAR_CAST;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
822 if (!IsFilePtrValid(pMF)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
823 if (!IsTrackValid(iTrack)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
824 if (!IsMessageValid(iMsg)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
825
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
826 ptr = _midiGetPtr(pMF, iTrack, DT_DEF);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
827 if (!ptr)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
828 return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
829
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
830 data[0] = (BYTE)(iMsg | pMF->Track[iTrack].iDefaultChannel);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
831 data[1] = (BYTE)(iParam1 & 0x7f);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
832 data[2] = (BYTE)(iParam2 & 0x7f);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
833 /*
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
834 ** Is this msg a single, or double BYTE, prm?
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
835 */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
836 switch(iMsg)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
837 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
838 case msgSetProgram: /* only one byte required for these msgs */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
839 case msgChangePressure:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
840 sz = 2;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
841 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
842
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
843 default: /* double byte messages */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
844 sz = 3;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
845 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
846 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
847
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
848 return midiTrackAddRaw(pMF, iTrack, sz, data, FALSE, 0);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
849
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
850 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
851
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
852 BOOL midiTrackAddNote(MIDI_FILE *_pMF, int iTrack, int iNote, int iLength, int iVol, BOOL bAutoInc, BOOL bOverrideLength)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
853 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
854 MIDI_FILE_TRACK *pTrk;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
855 BYTE *ptr;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
856 BOOL bSuccess = FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
857 int i, chn;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
858
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
859 _VAR_CAST;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
860 if (!IsFilePtrValid(pMF)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
861 if (!IsTrackValid(iTrack)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
862 if (!IsNoteValid(iNote)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
863
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
864 pTrk = &pMF->Track[iTrack];
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
865 ptr = _midiGetPtr(pMF, iTrack, DT_DEF);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
866 if (!ptr)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
867 return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
868
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
869 chn = pTrk->iDefaultChannel;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
870 iLength = _midiGetLength(pMF->Header.PPQN, iLength, bOverrideLength);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
871
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
872 for(i=0;i<sizeof(pTrk->LastNote)/sizeof(pTrk->LastNote[0]);++i)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
873 if (pTrk->LastNote[i].valid == FALSE)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
874 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
875 pTrk->LastNote[i].note = (BYTE)iNote;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
876 pTrk->LastNote[i].chn = (BYTE)chn;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
877 pTrk->LastNote[i].end_pos = pTrk->pos+pTrk->dt+iLength;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
878 pTrk->LastNote[i].valid = TRUE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
879 bSuccess = TRUE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
880
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
881 ptr = _midiWriteVarLen(ptr, pTrk->dt); /* delta-time */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
882 *ptr++ = (BYTE)(msgNoteOn | chn);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
883 *ptr++ = (BYTE)iNote;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
884 *ptr++ = (BYTE)iVol;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
885 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
886 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
887
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
888 if (!bSuccess)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
889 return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
890
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
891 pTrk->ptr = ptr;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
892
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
893 pTrk->pos += pTrk->dt;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
894 pTrk->dt = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
895
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
896 if (bAutoInc)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
897 return midiTrackIncTime(pMF, iTrack, iLength, bOverrideLength);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
898
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
899 return TRUE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
900 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
901
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
902 BOOL midiTrackAddRest(MIDI_FILE *_pMF, int iTrack, int iLength, BOOL bOverridePPQN)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
903 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
904 _VAR_CAST;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
905 if (!IsFilePtrValid(pMF)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
906 if (!IsTrackValid(iTrack)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
907
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
908 iLength = _midiGetLength(pMF->Header.PPQN, iLength, bOverridePPQN);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
909 return midiTrackIncTime(pMF, iTrack, iLength, bOverridePPQN);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
910 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
911
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
912 int midiTrackGetEndPos(MIDI_FILE *_pMF, int iTrack)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
913 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
914 _VAR_CAST;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
915 if (!IsFilePtrValid(pMF)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
916 if (!IsTrackValid(iTrack)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
917
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
918 return pMF->Track[iTrack].pos;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
919 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
920
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
921 /*
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
922 ** midiRead* Functions
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
923 */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
924 static BYTE *_midiReadVarLen(BYTE *ptr, DWORD *num)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
925 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
926 register DWORD value;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
927 register BYTE c;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
928
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
929 if ((value = *ptr++) & 0x80)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
930 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
931 value &= 0x7f;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
932 do
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
933 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
934 value = (value << 7) + ((c = *ptr++) & 0x7f);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
935 } while (c & 0x80);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
936 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
937 *num = value;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
938 return(ptr);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
939 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
940
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
941
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
942 static BOOL _midiReadTrackCopyData(MIDI_MSG *pMsg, BYTE *ptr, DWORD sz, BOOL bCopyPtrData)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
943 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
944 if (sz > pMsg->data_sz)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
945 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
946 pMsg->data = (BYTE *)realloc(pMsg->data, sz);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
947 pMsg->data_sz = sz;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
948 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
949
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
950 if (!pMsg->data)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
951 return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
952
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
953 if (bCopyPtrData && ptr)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
954 memcpy(pMsg->data, ptr, sz);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
955
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
956 return TRUE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
957 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
958
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
959 int midiReadGetNumTracks(const MIDI_FILE *_pMF)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
960 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
961 _VAR_CAST;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
962 return pMF->Header.iNumTracks;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
963 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
964
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
965 BOOL midiReadGetNextMessage(const MIDI_FILE *_pMF, int iTrack, MIDI_MSG *pMsg)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
966 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
967 MIDI_FILE_TRACK *pTrack;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
968 BYTE *bptr, *pMsgDataPtr;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
969 int sz;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
970
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
971 _VAR_CAST;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
972 if (!IsTrackValid(iTrack)) return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
973
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
974 pTrack = &pMF->Track[iTrack];
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
975 /* FIXME: Check if there is data on this track first!!! */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
976 if (pTrack->ptr >= pTrack->pEnd)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
977 return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
978
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
979 pTrack->ptr = _midiReadVarLen(pTrack->ptr, &pMsg->dt);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
980 pTrack->pos += pMsg->dt;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
981
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
982 pMsg->dwAbsPos = pTrack->pos;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
983
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
984 if (*pTrack->ptr & 0x80) /* Is this is sys message */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
985 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
986 pMsg->iType = (tMIDI_MSG)((*pTrack->ptr) & 0xf0);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
987 pMsgDataPtr = pTrack->ptr+1;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
988
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
989 /* SysEx & Meta events don't carry channel info, but something
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
990 ** important in their lower bits that we must keep */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
991 if (pMsg->iType == 0xf0)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
992 pMsg->iType = (tMIDI_MSG)(*pTrack->ptr);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
993 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
994 else /* just data - so use the last msg type */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
995 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
996 pMsg->iType = pMsg->iLastMsgType;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
997 pMsgDataPtr = pTrack->ptr;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
998 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
999
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1000 pMsg->iLastMsgType = (tMIDI_MSG)pMsg->iType;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1001 pMsg->iLastMsgChnl = (BYTE)((*pTrack->ptr) & 0x0f)+1;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1002
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1003 switch(pMsg->iType)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1004 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1005 case msgNoteOn:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1006 pMsg->MsgData.NoteOn.iChannel = pMsg->iLastMsgChnl;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1007 pMsg->MsgData.NoteOn.iNote = *(pMsgDataPtr);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1008 pMsg->MsgData.NoteOn.iVolume = *(pMsgDataPtr+1);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1009 pMsg->iMsgSize = 3;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1010 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1011
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1012 case msgNoteOff:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1013 pMsg->MsgData.NoteOff.iChannel = pMsg->iLastMsgChnl;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1014 pMsg->MsgData.NoteOff.iNote = *(pMsgDataPtr);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1015 pMsg->iMsgSize = 3;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1016 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1017
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1018 case msgNoteKeyPressure:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1019 pMsg->MsgData.NoteKeyPressure.iChannel = pMsg->iLastMsgChnl;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1020 pMsg->MsgData.NoteKeyPressure.iNote = *(pMsgDataPtr);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1021 pMsg->MsgData.NoteKeyPressure.iPressure = *(pMsgDataPtr+1);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1022 pMsg->iMsgSize = 3;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1023 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1024
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1025 case msgSetParameter:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1026 pMsg->MsgData.NoteParameter.iChannel = pMsg->iLastMsgChnl;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1027 pMsg->MsgData.NoteParameter.iControl = (tMIDI_CC)*(pMsgDataPtr);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1028 pMsg->MsgData.NoteParameter.iParam = *(pMsgDataPtr+1);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1029 pMsg->iMsgSize = 3;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1030 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1031
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1032 case msgSetProgram:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1033 pMsg->MsgData.ChangeProgram.iChannel = pMsg->iLastMsgChnl;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1034 pMsg->MsgData.ChangeProgram.iProgram = *(pMsgDataPtr);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1035 pMsg->iMsgSize = 2;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1036 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1037
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1038 case msgChangePressure:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1039 pMsg->MsgData.ChangePressure.iChannel = pMsg->iLastMsgChnl;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1040 pMsg->MsgData.ChangePressure.iPressure = *(pMsgDataPtr);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1041 pMsg->iMsgSize = 2;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1042 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1043
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1044 case msgSetPitchWheel:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1045 pMsg->MsgData.PitchWheel.iChannel = pMsg->iLastMsgChnl;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1046 pMsg->MsgData.PitchWheel.iPitch = *(pMsgDataPtr) | (*(pMsgDataPtr+1) << 7);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1047 pMsg->MsgData.PitchWheel.iPitch -= MIDI_WHEEL_CENTRE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1048 pMsg->iMsgSize = 3;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1049 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1050
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1051 case msgMetaEvent:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1052 /* We can use 'pTrack->ptr' from now on, since meta events
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1053 ** always have bit 7 set */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1054 bptr = pTrack->ptr;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1055 pMsg->MsgData.MetaEvent.iType = (tMIDI_META)*(pTrack->ptr+1);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1056 pTrack->ptr = _midiReadVarLen(pTrack->ptr+2, &pMsg->iMsgSize);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1057 sz = (pTrack->ptr-bptr)+pMsg->iMsgSize;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1058
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1059 if (_midiReadTrackCopyData(pMsg, pTrack->ptr, sz, FALSE) == FALSE)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1060 return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1061
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1062 /* Now copy the data...*/
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1063 memcpy(pMsg->data, bptr, sz);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1064
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1065 /* Now place it in a neat structure */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1066 switch(pMsg->MsgData.MetaEvent.iType)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1067 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1068 case metaMIDIPort:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1069 pMsg->MsgData.MetaEvent.Data.iMIDIPort = *(pTrack->ptr+0);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1070 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1071 case metaSequenceNumber:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1072 pMsg->MsgData.MetaEvent.Data.iSequenceNumber = *(pTrack->ptr+0);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1073 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1074 case metaTextEvent:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1075 case metaCopyright:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1076 case metaTrackName:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1077 case metaInstrument:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1078 case metaLyric:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1079 case metaMarker:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1080 case metaCuePoint:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1081 /* TODO - Add NULL terminator ??? */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1082 pMsg->MsgData.MetaEvent.Data.Text.pData = pTrack->ptr;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1083 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1084 case metaEndSequence:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1085 /* NO DATA */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1086 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1087 case metaSetTempo:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1088 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1089 DWORD us = ((*(pTrack->ptr+0))<<16)|((*(pTrack->ptr+1))<<8)|(*(pTrack->ptr+2));
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1090 pMsg->MsgData.MetaEvent.Data.Tempo.iBPM = 60000000L/us;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1091 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1092 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1093 case metaSMPTEOffset:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1094 pMsg->MsgData.MetaEvent.Data.SMPTE.iHours = *(pTrack->ptr+0);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1095 pMsg->MsgData.MetaEvent.Data.SMPTE.iMins= *(pTrack->ptr+1);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1096 pMsg->MsgData.MetaEvent.Data.SMPTE.iSecs = *(pTrack->ptr+2);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1097 pMsg->MsgData.MetaEvent.Data.SMPTE.iFrames = *(pTrack->ptr+3);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1098 pMsg->MsgData.MetaEvent.Data.SMPTE.iFF = *(pTrack->ptr+4);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1099 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1100 case metaTimeSig:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1101 pMsg->MsgData.MetaEvent.Data.TimeSig.iNom = *(pTrack->ptr+0);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1102 pMsg->MsgData.MetaEvent.Data.TimeSig.iDenom = *(pTrack->ptr+1) * MIDI_NOTE_MINIM;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1103 /* TODO: Variations without 24 & 8 */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1104 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1105 case metaKeySig:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1106 if (*pTrack->ptr & 0x80)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1107 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1108 /* Do some trendy sign extending in reverse :) */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1109 pMsg->MsgData.MetaEvent.Data.KeySig.iKey = ((256-*pTrack->ptr)&keyMaskKey);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1110 pMsg->MsgData.MetaEvent.Data.KeySig.iKey |= keyMaskNeg;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1111 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1112 else
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1113 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1114 pMsg->MsgData.MetaEvent.Data.KeySig.iKey = (tMIDI_KEYSIG)(*pTrack->ptr&keyMaskKey);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1115 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1116 if (*(pTrack->ptr+1))
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1117 pMsg->MsgData.MetaEvent.Data.KeySig.iKey |= keyMaskMin;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1118 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1119 case metaSequencerSpecific:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1120 pMsg->MsgData.MetaEvent.Data.Sequencer.iSize = pMsg->iMsgSize;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1121 pMsg->MsgData.MetaEvent.Data.Sequencer.pData = pTrack->ptr;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1122 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1123 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1124
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1125 pTrack->ptr += pMsg->iMsgSize;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1126 pMsg->iMsgSize = sz;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1127 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1128
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1129 case msgSysEx1:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1130 case msgSysEx2:
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1131 bptr = pTrack->ptr;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1132 pTrack->ptr = _midiReadVarLen(pTrack->ptr+1, &pMsg->iMsgSize);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1133 sz = (pTrack->ptr-bptr)+pMsg->iMsgSize;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1134
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1135 if (_midiReadTrackCopyData(pMsg, pTrack->ptr, sz, FALSE) == FALSE)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1136 return FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1137
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1138 /* Now copy the data... */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1139 memcpy(pMsg->data, bptr, sz);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1140 pTrack->ptr += pMsg->iMsgSize;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1141 pMsg->iMsgSize = sz;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1142 pMsg->MsgData.SysEx.pData = pMsg->data;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1143 pMsg->MsgData.SysEx.iSize = sz;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1144 break;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1145 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1146 /*
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1147 ** Standard MIDI messages use a common copy routine
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1148 */
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1149 pMsg->bImpliedMsg = FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1150 if ((pMsg->iType&0xf0) != 0xf0)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1151 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1152 if (*pTrack->ptr & 0x80)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1153 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1154 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1155 else
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1156 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1157 pMsg->bImpliedMsg = TRUE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1158 pMsg->iImpliedMsg = pMsg->iLastMsgType;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1159 pMsg->iMsgSize--;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1160 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1161 _midiReadTrackCopyData(pMsg, pTrack->ptr, pMsg->iMsgSize, TRUE);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1162 pTrack->ptr+=pMsg->iMsgSize;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1163 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1164 return TRUE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1165 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1166
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1167 void midiReadInitMessage(MIDI_MSG *pMsg)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1168 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1169 pMsg->data = NULL;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1170 pMsg->data_sz = 0;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1171 pMsg->bImpliedMsg = FALSE;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1172 }
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1173
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1174 void midiReadFreeMessage(MIDI_MSG *pMsg)
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1175 {
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1176 if (pMsg->data) free((void *)pMsg->data);
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1177 pMsg->data = NULL;
785057719d9b Import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1178 }