load_mid.cpp 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025
  1. /*
  2. MikMod Sound System
  3. By Jake Stine of Divine Entertainment (1996-2000)
  4. Support:
  5. If you find problems with this code, send mail to:
  6. [email protected]
  7. Distribution / Code rights:
  8. Use this source code in any fashion you see fit. Giving me credit where
  9. credit is due is optional, depending on your own levels of integrity and
  10. honesty.
  11. -----------------------------------------
  12. Module: LOAD_MID
  13. MID module loader.
  14. by Peter Grootswagers (2006)
  15. <email:[email protected]>
  16. Portability:
  17. All systems - all compilers (hopefully)
  18. */
  19. #include <stdlib.h>
  20. #include <time.h>
  21. #include <string.h>
  22. #include <math.h>
  23. #include <ctype.h>
  24. #ifndef _WIN32
  25. #include <unistd.h> // for sleep
  26. #endif
  27. #ifdef NEWMIKMOD
  28. #include "mikmod.h"
  29. #include "uniform.h"
  30. #include "itshare.h" // for STMEM_PITCHSLIDE
  31. typedef UBYTE BYTE;
  32. typedef UWORD WORD;
  33. #define MAX_POLYPHONY 12 // max notes in one midi channel
  34. #define MAX_TRACKS 63 // max mod tracks
  35. #define WHEELSHIFT 11 // how many bits the 13bit midi wheel value must shift right
  36. #else
  37. #include "stdafx.h"
  38. #include "sndfile.h"
  39. #define PAN_LEFT 0x30
  40. #define PAN_RIGHT 0xD0
  41. #define MAX_POLYPHONY 16 // max notes in one midi channel
  42. #define MAX_TRACKS (MAX_BASECHANNELS-6) // max mod tracks
  43. #define WHEELSHIFT 10 // how many bits the 13bit midi wheel value must shift right
  44. #endif
  45. #include "load_pat.h"
  46. #define ROWSPERNOTE 16
  47. #define ENV_MMMID_SPEED "MMMID_SPEED"
  48. #define ENV_MMMID_DEBUG "MMMID_DEBUG"
  49. #define ENV_MMMID_VERBOSE "MMMID_VERBOSE"
  50. /**************************************************************************
  51. **************************************************************************/
  52. #ifdef NEWMIKMOD
  53. static char MID_Version[] = "Musical Instrument Digital Interface";
  54. #endif
  55. typedef enum {
  56. none,
  57. wheeldown,
  58. wheelup,
  59. fxbrk,
  60. tmpo,
  61. fxsync,
  62. modwheel,
  63. mainvol,
  64. prog
  65. } MIDEVENT_X_EFFECT;
  66. typedef struct _MIDEVENT
  67. {
  68. struct _MIDEVENT *next;
  69. ULONG tracktick;
  70. BYTE flg; // 1 = note present
  71. BYTE note;
  72. BYTE volume;
  73. BYTE smpno;
  74. BYTE fx;
  75. BYTE fxparam;
  76. } MIDEVENT;
  77. typedef struct _MIDTRACK
  78. {
  79. struct _MIDTRACK *next;
  80. MIDEVENT *head;
  81. MIDEVENT *tail;
  82. MIDEVENT *workevent; // keeps track of events in track
  83. int balance; // last balance on this track
  84. ULONG vtracktick; // tracktick of last note event (on or off)
  85. BYTE chan;
  86. BYTE vpos; // 0xff is track is free for use, otherwise it's the note playing on this track
  87. BYTE volume; // last note volume on this track
  88. BYTE instr; // current instrument for this track
  89. } MIDTRACK;
  90. #ifdef NEWMIKMOD
  91. #define MMFILE MMSTREAM
  92. #define mmfseek(f,p,w) _mm_fseek(f,p,w)
  93. #define mmftell(x) _mm_ftell(x)
  94. #define mmreadUBYTE(f) _mm_read_UBYTE(f)
  95. #define mmreadSBYTES(buf,sz,f) _mm_read_SBYTES(buf,sz,f)
  96. #define mmreadUBYTES(buf,sz,f) _mm_read_UBYTES(buf,sz,f)
  97. #else
  98. #if defined(WIN32) && defined(_mm_free)
  99. #undef _mm_free
  100. #endif
  101. #define MMSTREAM FILE
  102. #define _mm_fseek(f,pos,whence) fseek(f,pos,whence)
  103. #define _mm_read_UBYTES(buf,sz,f) fread(buf,sz,1,f)
  104. #define _mm_read_SBYTES(buf,sz,f) fread(buf,sz,1,f)
  105. #define DupStr(h,buf,sz) strdup(buf)
  106. #define _mm_calloc(h,n,sz) calloc(n,sz)
  107. #define _mm_recalloc(h,buf,sz,elsz) realloc(buf,sz)
  108. #define _mm_free(h,p) free(p)
  109. typedef struct {
  110. char *mm;
  111. int sz;
  112. int pos;
  113. } MMFILE;
  114. static void mmfseek(MMFILE *mmfile, long p, int whence)
  115. {
  116. switch(whence) {
  117. case SEEK_SET:
  118. mmfile->pos = p;
  119. break;
  120. case SEEK_CUR:
  121. mmfile->pos += p;
  122. break;
  123. case SEEK_END:
  124. mmfile->pos = mmfile->sz + p;
  125. break;
  126. }
  127. }
  128. static long mmftell(MMFILE *mmfile)
  129. {
  130. return mmfile->pos;
  131. }
  132. static BYTE mmreadUBYTE(MMFILE *mmfile)
  133. {
  134. BYTE b;
  135. b = (BYTE)mmfile->mm[mmfile->pos];
  136. mmfile->pos++;
  137. return b;
  138. }
  139. static void mmreadUBYTES(BYTE *buf, long sz, MMFILE *mmfile)
  140. {
  141. memcpy(buf, &mmfile->mm[mmfile->pos], sz);
  142. mmfile->pos += sz;
  143. }
  144. static void mmreadSBYTES(char *buf, long sz, MMFILE *mmfile)
  145. {
  146. memcpy(buf, &mmfile->mm[mmfile->pos], sz);
  147. mmfile->pos += sz;
  148. }
  149. #endif
  150. /**************************************************************************
  151. **************************************************************************/
  152. typedef struct _MIDHANDLE
  153. {
  154. #ifdef NEWMIKMOD
  155. MM_ALLOC *allochandle;
  156. MM_ALLOC *trackhandle;
  157. #endif
  158. MMFILE *mmf;
  159. MIDTRACK *track;
  160. MIDTRACK *tp;
  161. ULONG tracktime;
  162. const char *debug;
  163. const char *verbose;
  164. int speed;
  165. int midispeed;
  166. int midiformat;
  167. int resolution;
  168. int miditracks;
  169. int divider;
  170. int tempo;
  171. int percussion;
  172. long deltatime;
  173. } MIDHANDLE;
  174. static void mid_dump_tracks(MIDHANDLE *h)
  175. {
  176. MIDTRACK *tr;
  177. MIDEVENT *e;
  178. int t;
  179. printf("tracktime = %ld\n", (long)(h->tracktime));
  180. printf("speed = %d\n", h->speed);
  181. printf("midispeed = %d\n", h->midispeed);
  182. printf("midiformat = %d\n", h->midiformat);
  183. printf("resolution = %d\n", h->resolution);
  184. printf("miditracks = %d\n", h->miditracks);
  185. printf("divider = %d\n", h->divider);
  186. printf("tempo = %d\n", h->tempo);
  187. printf("percussion = %d\n", h->percussion);
  188. printf("deltatime = %ld\n", h->deltatime);
  189. t = 0;
  190. for( tr=h->track; tr; tr = tr->next ) {
  191. t++;
  192. printf("TRACK %2d chan=%d note=0x%02x vol=%d pan=0x%02x instr=%d\n", t, tr->chan + 1, tr->vpos, tr->balance, tr->volume, tr->instr);
  193. for( e=tr->head; e; e=e->next ) {
  194. printf("%2d %6ld %s %3d %3d %3d ",
  195. t, (long)(e->tracktick),
  196. e->flg? "NOTE": "CTRL", e->note, e->volume, e->smpno);
  197. switch( e->fx ) {
  198. case fxbrk: printf("fxbrk\n");break;
  199. case fxsync: printf("fxsync\n");break;
  200. case prog: printf("prog %d\n", e->fxparam);break;
  201. case mainvol: printf("mainvol %d\n", e->fxparam);break;
  202. case modwheel: printf("modwheel %d\n", e->fxparam);break;
  203. case wheeldown: printf("wheeldown %d\n", e->fxparam);break;
  204. case wheelup: printf("wheelup %d\n", e->fxparam);break;
  205. case tmpo: printf("tmpo %d\n", e->fxparam);break;
  206. default: printf("\n");break;
  207. }
  208. }
  209. }
  210. }
  211. static void mid_message(const char *s1, const char *s2)
  212. {
  213. char txt[256];
  214. if( strlen(s1) + strlen(s2) > 255 ) return;
  215. sprintf(txt, s1, s2);
  216. #ifdef NEWMIKMOD
  217. _mmlog(txt);
  218. #else
  219. fprintf(stderr, "load_mid > %s\n", txt);
  220. #endif
  221. }
  222. static ULONG miditicks(MIDHANDLE *h, ULONG modtick)
  223. {
  224. return modtick * h->divider / ROWSPERNOTE / h->speed;
  225. }
  226. static ULONG modticks(MIDHANDLE *h, ULONG miditick)
  227. {
  228. return miditick * ROWSPERNOTE * h->speed / h->divider;
  229. }
  230. static void mid_adjust_for_optimal_tempo(MIDHANDLE *h, int maxtempo)
  231. {
  232. // the tempo is adjusted so that the maximum tempo is 255
  233. // this way we have the biggest change that very short notes get played
  234. // and we make sure the tempo doesn't become too large or too small
  235. // if the piece in hand isn't so weird it changes tempo from 20 to 255, that is.
  236. // tempo is only registered in first track (h->track) because it is a global event
  237. MIDEVENT *e;
  238. int d, t;
  239. if( maxtempo < 1 ) return;
  240. d = h->divider;
  241. t = maxtempo;
  242. h->divider = (t * d) / 255;
  243. while( (h->midispeed = miditicks(h, h->speed)) < h->speed ) {
  244. ++t;
  245. h->divider = (t * d) / 255;
  246. }
  247. if( h->verbose && t > maxtempo )
  248. printf("Adjusted maximum tempo from %d to %d to get %d miditicks per patternrow\n",
  249. maxtempo, 2 * maxtempo - t, h->midispeed);
  250. if( h->track ) {
  251. for( e=h->track->head; e; e=e->next ) {
  252. if( e->fx == tmpo )
  253. e->fxparam = (255 * e->fxparam ) / t;
  254. }
  255. }
  256. }
  257. // =====================================================================================
  258. static MIDEVENT *mid_new_event(MIDHANDLE *h)
  259. // =====================================================================================
  260. {
  261. MIDEVENT *retval;
  262. retval = (MIDEVENT *)_mm_calloc(h->trackhandle, 1,sizeof(MIDEVENT));
  263. retval->next = NULL;
  264. retval->tracktick = h->tracktime;
  265. retval->flg = 0;
  266. retval->note = 0;
  267. retval->volume = 0;
  268. retval->smpno = 0;
  269. retval->fx = none;
  270. retval->fxparam = 0;
  271. return retval;
  272. }
  273. // =====================================================================================
  274. static MIDTRACK *mid_new_track(MIDHANDLE *h, int mch, int pos)
  275. // =====================================================================================
  276. {
  277. MIDTRACK *retval;
  278. retval = (MIDTRACK *)_mm_calloc(h->trackhandle, 1,sizeof(MIDTRACK));
  279. retval->next = NULL;
  280. retval->vpos = pos;
  281. retval->instr = 1;
  282. retval->chan = mch;
  283. retval->head = NULL;
  284. retval->tail = NULL;
  285. retval->workevent = NULL;
  286. retval->vtracktick = 0;
  287. retval->volume = h->track? h->track->volume: 120;
  288. retval->balance = 64;
  289. return retval;
  290. }
  291. static int mid_numtracks(MIDHANDLE *h)
  292. {
  293. int n;
  294. MIDTRACK *t;
  295. n=0;
  296. for( t = h->track; t; t=t->next )
  297. n++;
  298. return n;
  299. }
  300. // find out how many midichannel we have
  301. static int mid_numchans(MIDHANDLE *h)
  302. {
  303. int i,c,n;
  304. MIDTRACK *t;
  305. c = 0;
  306. for( t = h->track; t; t=t->next )
  307. c |= (1<<t->chan);
  308. n = 0;
  309. for( i=0; i<16; i++ )
  310. if( c & (1<<i) ) n++;
  311. return n;
  312. }
  313. // find out which ordinal a midichannel has
  314. static int mid_ordchan(MIDHANDLE *h, int mch)
  315. {
  316. int i,c,n;
  317. MIDTRACK *t;
  318. c = 0;
  319. for( t = h->track; t; t=t->next )
  320. c |= (1<<t->chan);
  321. n = 0;
  322. for( i=0; i<mch; i++ )
  323. if( c & (1<<i) ) n++;
  324. return n;
  325. }
  326. static void mid_rewind_tracks(MIDHANDLE *h)
  327. {
  328. MIDTRACK *tr;
  329. h->tracktime = 0;
  330. for( tr = h->track; tr; tr = tr->next ) {
  331. tr->vpos = 0xff;
  332. tr->workevent = tr->head;
  333. tr->vtracktick = 0;
  334. }
  335. }
  336. static void mid_update_track(MIDTRACK *tr)
  337. {
  338. MIDEVENT *e;
  339. e = tr->workevent;
  340. if( e->flg ) {
  341. if( e->volume ) tr->vpos = e->note;
  342. else tr->vpos = 0xff;
  343. tr->volume = e->volume;
  344. tr->vtracktick = e->tracktick;
  345. }
  346. if( e->fx == prog ) tr->instr = e->fxparam;
  347. }
  348. static void mid_sync_track(MIDTRACK *tr, ULONG tracktime)
  349. {
  350. MIDEVENT *e;
  351. e = tr->workevent;
  352. if( e && e->tracktick > tracktime ) e = tr->head; // start again....
  353. for( ; e && e->tracktick <= tracktime; e=e->next ) {
  354. tr->workevent = e;
  355. mid_update_track(tr);
  356. }
  357. }
  358. // =====================================================================================
  359. static MIDTRACK *mid_find_track(MIDHANDLE *h, int mch, int pos)
  360. // =====================================================================================
  361. {
  362. MIDTRACK *tr;
  363. for( tr=h->track; tr; tr=tr->next ) {
  364. mid_sync_track(tr, h->tracktime);
  365. if( tr->chan == mch && tr->vpos == pos )
  366. return tr;
  367. }
  368. return NULL;
  369. }
  370. // =====================================================================================
  371. static MIDTRACK *mid_locate_track(MIDHANDLE *h, int mch, int pos)
  372. // =====================================================================================
  373. {
  374. MIDTRACK *tr, *prev, *trunused;
  375. MIDEVENT *e;
  376. int instrno = 1;
  377. int polyphony;
  378. int vol = 0, bal = 0;
  379. int numtracks;
  380. ULONG tmin;
  381. prev = NULL;
  382. trunused = NULL;
  383. polyphony = 0;
  384. numtracks = 0;
  385. tmin = h->midispeed; // minimal distance between note events in track
  386. // look up track with desired channel and pos (note)
  387. for( tr=h->track; tr; tr=tr->next ) {
  388. mid_sync_track(tr, h->tracktime);
  389. if( tr->chan == mch ) {
  390. if( tr->vpos == pos )
  391. return tr;
  392. if( tr->vpos == 0xff ) {
  393. // check if track with silence is quiet long enough
  394. if( h->tracktime > tr->vtracktick + tmin ) trunused = tr;
  395. }
  396. else vol = tr->volume;
  397. instrno = tr->instr;
  398. bal = tr->balance;
  399. polyphony++;
  400. }
  401. numtracks++;
  402. prev = tr;
  403. }
  404. if( trunused ) {
  405. trunused->vpos = pos;
  406. return trunused;
  407. }
  408. if( polyphony > MAX_POLYPHONY || (polyphony > 0 && numtracks > MAX_TRACKS) ) { // do not use up too much channels
  409. for( tr=h->track; tr; tr=tr->next ) {
  410. if( tr->chan == mch ) {
  411. e = tr->workevent;
  412. if( h->tracktime > e->tracktick + tmin ) {
  413. tmin = h->tracktime - e->tracktick;
  414. trunused = tr;
  415. }
  416. }
  417. }
  418. if( trunused ) {
  419. trunused->vpos = pos;
  420. return trunused;
  421. }
  422. }
  423. if( numtracks > MAX_TRACKS ) { // we can not allocate new tracks
  424. tmin = 0;
  425. for( tr=h->track; tr; tr=tr->next ) {
  426. if( tr->chan == mch ) {
  427. e = tr->workevent;
  428. if( h->tracktime >= e->tracktick + tmin ) {
  429. tmin = h->tracktime - e->tracktick;
  430. trunused = tr;
  431. }
  432. }
  433. }
  434. if( trunused ) {
  435. trunused->vpos = pos;
  436. return trunused;
  437. }
  438. tmin = 0;
  439. for( tr=h->track; tr; tr=tr->next ) {
  440. e = tr->workevent;
  441. if( h->tracktime >= e->tracktick + tmin ) {
  442. tmin = h->tracktime - e->tracktick;
  443. trunused = tr;
  444. }
  445. }
  446. if( trunused ) {
  447. trunused->vpos = pos;
  448. trunused->chan = mch;
  449. return trunused;
  450. }
  451. }
  452. tr = mid_new_track(h, mch, pos);
  453. tr->instr = instrno;
  454. tr->volume = vol;
  455. tr->balance = bal;
  456. if( prev ) prev->next = tr;
  457. else h->track = tr;
  458. return tr;
  459. }
  460. static void mid_add_event(MIDHANDLE *h, MIDTRACK *tp, MIDEVENT *e)
  461. {
  462. MIDEVENT *ew, *ep;
  463. ep = NULL;
  464. ew = tp->workevent;
  465. if( ew && ew->tracktick > e->tracktick ) ew = tp->head; // start again from the beginning...
  466. for( ; ew && ew->tracktick <= e->tracktick; ew = ew->next ) {
  467. ep = ew;
  468. tp->workevent = ew;
  469. mid_update_track(tp);
  470. }
  471. if( ep ) {
  472. ep->next = e;
  473. e->next = ew;
  474. }
  475. else {
  476. e->next = tp->head;
  477. tp->head = e;
  478. }
  479. if( !e->next )
  480. tp->tail = e;
  481. tp->workevent = e;
  482. mid_update_track(tp);
  483. }
  484. static void mid_add_tempo_event(MIDHANDLE *h, int tempo)
  485. {
  486. MIDEVENT *e;
  487. e = mid_new_event(h);
  488. e->flg = 0;
  489. e->fx = tmpo;
  490. e->fxparam = tempo;
  491. mid_add_event(h, h->track, e);
  492. }
  493. static void mid_add_partbreak(MIDHANDLE *h)
  494. {
  495. MIDEVENT *e;
  496. e = mid_new_event(h);
  497. e->flg = 0;
  498. e->fx = fxbrk;
  499. mid_add_event(h, h->track, e);
  500. }
  501. static void mid_add_noteoff(MIDHANDLE *h, MIDTRACK *tp)
  502. {
  503. MIDEVENT *e;
  504. e = mid_new_event(h);
  505. e->flg = 1;
  506. e->note = tp->vpos;
  507. e->smpno = tp->instr;
  508. mid_add_event(h, tp, e);
  509. }
  510. static void mid_add_noteon(MIDHANDLE *h, MIDTRACK *tp, int n, int vol)
  511. {
  512. MIDEVENT *e;
  513. e = mid_new_event(h);
  514. e->flg = 1;
  515. e->note = n;
  516. e->smpno = tp->instr;
  517. e->volume = vol;
  518. mid_add_event(h, tp, e);
  519. }
  520. static BYTE modtremolo(int midimod)
  521. {
  522. int m;
  523. if( midimod == 0 ) return 0;
  524. if( midimod > 63 ) {
  525. m = (128 - midimod) / 4;
  526. if( m==0 ) m = 1;
  527. return m|0xf0; // find slide down
  528. }
  529. m = midimod / 4;
  530. if( m==0 ) m = 1;
  531. return (m<<4)|0x0f; // find slide up
  532. }
  533. // =====================================================================================
  534. static void mid_mod_wheel(MIDHANDLE *h, int mch, int mod)
  535. // =====================================================================================
  536. {
  537. MIDTRACK *tr;
  538. MIDEVENT *e;
  539. for( tr=h->track; tr; tr=tr->next ) {
  540. if( tr->chan == mch ) {
  541. mid_sync_track(tr, h->tracktime);
  542. if( tr->vpos != 0xff ) { // only on tracks with notes on...
  543. e = mid_new_event(h);
  544. e->flg = 0;
  545. e->fx = modwheel;
  546. e->fxparam = modtremolo(mod);
  547. mid_add_event(h, tr, e);
  548. }
  549. }
  550. }
  551. }
  552. // =====================================================================================
  553. static void mid_main_volume(MIDHANDLE *h, int mch, int vol)
  554. // =====================================================================================
  555. {
  556. MIDTRACK *tr;
  557. MIDEVENT *e;
  558. for( tr=h->track; tr; tr=tr->next ) {
  559. if( tr->chan == mch ) {
  560. e = mid_new_event(h);
  561. e->flg = 0;
  562. e->fx = mainvol;
  563. e->fxparam = vol;
  564. mid_add_event(h, tr, e);
  565. }
  566. }
  567. }
  568. // transform 0..63..127 to left..center..right in 2n+1 areas
  569. static int modpan(int midipan, int n)
  570. {
  571. int npan, area, x;
  572. x = 2 * n + 1;
  573. area = (midipan * x * (PAN_RIGHT - PAN_LEFT))>>7;
  574. npan = (PAN_LEFT * x + area) / x;
  575. return npan;
  576. }
  577. // =====================================================================================
  578. static void mid_pan(MIDHANDLE *h, int mch, int pan)
  579. // =====================================================================================
  580. {
  581. MIDTRACK *tr;
  582. int hits;
  583. hits = 0;
  584. for( tr=h->track; tr; tr=tr->next ) {
  585. if( tr->chan == mch ) {
  586. hits++;
  587. tr->balance = pan;
  588. }
  589. }
  590. if( !hits ) {
  591. tr = mid_locate_track(h, mch, 0xff);
  592. tr->balance = pan;
  593. }
  594. }
  595. // =====================================================================================
  596. static void mid_add_program(MIDHANDLE *h, int mch, int pr)
  597. // =====================================================================================
  598. {
  599. MIDTRACK *tr;
  600. MIDEVENT *e;
  601. int hits;
  602. hits = 0;
  603. for( tr=h->track; tr; tr=tr->next ) {
  604. if( tr->chan == mch ) {
  605. hits++;
  606. e = mid_new_event(h);
  607. e->flg = 0;
  608. e->fx = prog;
  609. e->fxparam = pat_gmtosmp(pr + 1);
  610. mid_add_event(h, tr, e);
  611. }
  612. }
  613. if( !hits ) {
  614. tr = mid_locate_track(h, mch, 0xff);
  615. e = mid_new_event(h);
  616. e->flg = 0;
  617. e->fx = prog;
  618. e->fxparam = pat_gmtosmp(pr + 1);
  619. mid_add_event(h, tr, e);
  620. }
  621. }
  622. // =====================================================================================
  623. static void mid_all_notes_off(MIDHANDLE *h, int mch)
  624. // =====================================================================================
  625. {
  626. MIDTRACK *tr;
  627. if( h->debug ) printf("%ld %d all notes off\n",(long)(h->tracktime), mch+1);
  628. for( tr=h->track; tr; tr=tr->next ) {
  629. if( tr->chan == mch || mch == -1 ) {
  630. mid_sync_track(tr, h->tracktime);
  631. if( tr->vpos != 0xff )
  632. mid_add_noteoff(h, tr);
  633. }
  634. }
  635. }
  636. #ifndef NEWMIKMOD
  637. static void mid_add_sync(MIDHANDLE *h, MIDTRACK *tp)
  638. {
  639. MIDEVENT *e;
  640. e = mid_new_event(h);
  641. e->flg = 0;
  642. e->fx = fxsync;
  643. mid_add_event(h, tp, e);
  644. }
  645. #endif
  646. static BYTE mid_to_mod_wheel(unsigned int midwheel)
  647. {
  648. unsigned int i;
  649. if( midwheel == 0 ) return 0;
  650. i = midwheel >> WHEELSHIFT;
  651. return i+1;
  652. }
  653. static void mid_add_wheel(MIDHANDLE *h, MIDTRACK *tp, int wheel)
  654. {
  655. MIDEVENT *e;
  656. e = mid_new_event(h);
  657. e->flg = 0;
  658. if( wheel < 0 ) {
  659. e->fx = wheeldown;
  660. e->fxparam = mid_to_mod_wheel(-wheel);
  661. }
  662. else {
  663. e->fx = wheelup;
  664. e->fxparam = mid_to_mod_wheel(wheel);
  665. }
  666. mid_add_event(h, tp, e);
  667. }
  668. static void mid_add_pitchwheel(MIDHANDLE *h, int mch, int wheel)
  669. {
  670. MIDTRACK *tr;
  671. int hits;
  672. hits = 0;
  673. for( tr=h->track; tr; tr=tr->next ) {
  674. if( tr->chan == mch ) {
  675. hits++;
  676. mid_sync_track(tr, h->tracktime);
  677. if( tr->vpos != 0xff ) // only on tracks with notes on...
  678. mid_add_wheel(h, tr, wheel);
  679. }
  680. }
  681. if( !hits ) { // special case in midiformat 1 events in first track...
  682. tr = mid_locate_track(h, mch, 0xff);
  683. mid_add_wheel(h, tr, wheel);
  684. }
  685. }
  686. static long int mid_read_long(MIDHANDLE *h)
  687. {
  688. BYTE buf[4];
  689. mmreadUBYTES(buf, 4, h->mmf);
  690. return (buf[0]<<24)|(buf[1]<<16)|(buf[2]<<8)|buf[3];
  691. }
  692. static short int mid_read_short(MIDHANDLE *h)
  693. {
  694. BYTE buf[2];
  695. mmreadUBYTES(buf, 2, h->mmf);
  696. return (buf[0]<<8)|buf[1];
  697. }
  698. static BYTE mid_read_byte(MIDHANDLE *h)
  699. {
  700. return mmreadUBYTE(h->mmf);
  701. }
  702. static int mid_read_delta(MIDHANDLE *h)
  703. {
  704. BYTE bits;
  705. int i, d;
  706. d = 0;
  707. for( i=0; i<4; ) {
  708. bits = mid_read_byte(h);
  709. i++;
  710. d = (d<<7)|(bits&0x7f);
  711. if( !(bits & 0x80) )
  712. break;
  713. }
  714. h->deltatime = d;
  715. return i;
  716. }
  717. // =====================================================================================
  718. #ifdef NEWMIKMOD
  719. BOOL MID_Test(MMSTREAM *mmfile)
  720. #else
  721. BOOL CSoundFile::TestMID(const BYTE *lpStream, DWORD dwMemLength)
  722. #endif
  723. // =====================================================================================
  724. {
  725. char id[5];
  726. MIDHANDLE h;
  727. #ifdef NEWMIKMOD
  728. h.mmf = mmfile;
  729. #else
  730. MMFILE mm;
  731. mm.mm = (char *)lpStream;
  732. mm.sz = dwMemLength;
  733. h.mmf = &mm;
  734. #endif
  735. mmfseek(h.mmf,0,SEEK_SET);
  736. mmreadSBYTES(id, 4, h.mmf);
  737. id[4] = '\0';
  738. return !strcmp(id,"MThd") && mid_read_long(&h) == 6;
  739. }
  740. // =====================================================================================
  741. static MIDHANDLE *MID_Init(void)
  742. {
  743. MIDHANDLE *retval;
  744. #ifdef NEWMIKMOD
  745. MM_ALLOC *allochandle;
  746. allochandle = _mmalloc_create("Load_MID", NULL);
  747. retval = (MIDHANDLE *)_mm_calloc(allochandle, 1,sizeof(MIDHANDLE));
  748. if( !retval ) return NULL;
  749. retval->allochandle = allochandle;
  750. allochandle = _mmalloc_create("Load_ABC_tracks", NULL);
  751. retval->trackhandle = allochandle;
  752. #else
  753. retval = (MIDHANDLE *)calloc(1,sizeof(MIDHANDLE));
  754. if( !retval ) return NULL;
  755. #endif
  756. retval->track = NULL;
  757. retval->percussion = 0;
  758. retval->debug = NULL;
  759. return retval;
  760. }
  761. #ifndef NEWMIKMOD
  762. static void MID_CleanupTrack(MIDTRACK *tp)
  763. {
  764. MIDEVENT *ep, *en;
  765. if( tp ) {
  766. for( ep=tp->head; ep; ep = en ) {
  767. en=ep->next;
  768. free(ep);
  769. }
  770. tp->head = NULL;
  771. }
  772. }
  773. #endif
  774. // =====================================================================================
  775. static void MID_CleanupTracks(MIDHANDLE *handle)
  776. // =====================================================================================
  777. {
  778. #ifdef NEWMIKMOD
  779. if(handle && handle->trackhandle) {
  780. _mmalloc_close(handle->trackhandle);
  781. handle->trackhandle = 0;
  782. }
  783. #else
  784. MIDTRACK *tp, *tn;
  785. if(handle) {
  786. for( tp=handle->track; tp; tp = tn ) {
  787. tn=tp->next;
  788. MID_CleanupTrack(tp);
  789. }
  790. handle->track = NULL;
  791. }
  792. #endif
  793. }
  794. // =====================================================================================
  795. static void MID_Cleanup(MIDHANDLE *handle)
  796. // =====================================================================================
  797. {
  798. #ifdef NEWMIKMOD
  799. if(handle && handle->allochandle) {
  800. MID_CleanupTracks(handle);
  801. _mmalloc_close(handle->allochandle);
  802. handle->allochandle = 0;
  803. }
  804. #else
  805. if(handle) {
  806. MID_CleanupTracks(handle);
  807. free(handle);
  808. handle = 0;
  809. }
  810. #endif
  811. }
  812. static int mid_is_global_event(MIDEVENT *e)
  813. {
  814. return (e->fx == tmpo || e->fx == fxbrk);
  815. }
  816. static MIDEVENT *mid_next_global(MIDEVENT *e)
  817. {
  818. for( ; e && !mid_is_global_event(e); e=e->next ) ;
  819. return e;
  820. }
  821. static MIDEVENT *mid_next_fx(MIDEVENT *e)
  822. {
  823. for( ; e && e->fx == none; e=e->next ) ;
  824. return e;
  825. }
  826. static int mid_is_note_event(MIDEVENT *e)
  827. {
  828. #ifdef LOOPED_NOTES_OFF
  829. return (e->flg == 0);
  830. #else
  831. if( e->flg == 0 ) return 0;
  832. if( e->volume ) return 1;
  833. return pat_smplooped(e->smpno); // let non looping samples die out...
  834. #endif
  835. }
  836. static MIDEVENT *mid_next_note(MIDEVENT *e)
  837. {
  838. for( ; e && !mid_is_note_event(e); e=e->next ) ;
  839. return e;
  840. }
  841. // =====================================================================================
  842. #ifdef NEWMIKMOD
  843. static void MID_ReadPatterns(UNIMOD *of, MIDHANDLE *h, int numpat)
  844. // =====================================================================================
  845. {
  846. int pat,row,i,ch,trkset;
  847. BYTE n,ins,vol;
  848. MIDTRACK *t;
  849. MIDEVENT *e, *en, *ef, *el;
  850. ULONG tt1, tt2;
  851. UNITRK_EFFECT eff;
  852. // initialize start points of event list in tracks
  853. for( t = h->track; t; t = t->next ) t->workevent = t->head;
  854. for( pat = 0; pat < numpat; pat++ ) {
  855. utrk_reset(of->ut);
  856. for( row = 0; row < 64; row++ ) {
  857. tt1 = miditicks(h, (pat * 64 + row ) * h->speed);
  858. tt2 = tt1 + h->midispeed;
  859. for( e=mid_next_global(h->track->workevent); e && e->tracktick < tt2; e=mid_next_global(e->next) ) {
  860. if( e && e->tracktick >= tt1 ) { // we have a controller event in this row
  861. switch( e->fx ) {
  862. case tmpo:
  863. eff.effect = UNI_GLOB_TEMPO;
  864. eff.param.u = e->fxparam;
  865. eff.framedly = UFD_RUNONCE;
  866. utrk_write_global(of->ut, &eff, PTMEM_TEMPO);
  867. break;
  868. case fxbrk:
  869. eff.effect = UNI_GLOB_PATBREAK;
  870. eff.param.u = 0;
  871. eff.framedly = UFD_RUNONCE;
  872. utrk_write_global(of->ut, &eff, UNIMEM_NONE);
  873. break;
  874. }
  875. }
  876. }
  877. ch = 0;
  878. for( t = h->track; t; t = t->next ) {
  879. trkset = 0;
  880. e = NULL;
  881. for( el=mid_next_fx(t->workevent); el && el->tracktick < tt2; el=mid_next_fx(el->next) ) {
  882. if( el && el->tracktick >= tt1 ) {
  883. switch( el->fx ) {
  884. case modwheel:
  885. case wheelup:
  886. case wheeldown:
  887. e = el;
  888. default:
  889. break;
  890. }
  891. }
  892. }
  893. if( e ) { // we have a controller event in this row
  894. switch( e->fx ) {
  895. case modwheel:
  896. if( !trkset ) {
  897. utrk_settrack(of->ut, ch);
  898. trkset = 1;
  899. }
  900. eff.effect = UNI_VOLSLIDE;
  901. eff.framedly = UFD_RUNONCE;
  902. if( (e->fxparam & 0x0f) == 0x0f )
  903. eff.param.s = (e->fxparam >> 3)&0x1f;
  904. else
  905. eff.param.s = -((e->fxparam & 0x0f)*2);
  906. utrk_write_local(of->ut, &eff, STMEM_VOLSLIDE);
  907. break;
  908. case wheelup:
  909. if( !trkset ) {
  910. utrk_settrack(of->ut, ch);
  911. trkset = 1;
  912. }
  913. eff.effect = UNI_PITCHSLIDE;
  914. eff.framedly = UFD_RUNONCE;
  915. eff.param.s = e->fxparam;
  916. utrk_write_local(of->ut, &eff, STMEM_PITCHSLIDE);
  917. break;
  918. case wheeldown:
  919. if( !trkset ) {
  920. utrk_settrack(of->ut, ch);
  921. trkset = 1;
  922. }
  923. eff.effect = UNI_PITCHSLIDE;
  924. eff.framedly = UFD_RUNONCE;
  925. eff.param.s = -(int)(e->fxparam);
  926. utrk_write_local(of->ut, &eff, STMEM_PITCHSLIDE);
  927. break;
  928. }
  929. }
  930. for( e=mid_next_note(t->workevent); e && e->tracktick < tt1; e=mid_next_note(e->next) )
  931. t->workevent = e;
  932. i = 0;
  933. ef = NULL;
  934. en = e;
  935. el = e;
  936. for( ; e && e->tracktick < tt2; e=mid_next_note(e->next) ) { // we have a note event in this row
  937. t->workevent = e;
  938. i++;
  939. if( e->volume ) {
  940. if( !ef ) ef = e;
  941. el = e;
  942. }
  943. }
  944. if( i ) {
  945. if( !trkset ) {
  946. utrk_settrack(of->ut, ch);
  947. trkset = 1;
  948. }
  949. if( i == 1 || ef == el || !ef ) { // only one event in this row
  950. if( ef ) e = ef;
  951. else e = en;
  952. el = t->workevent;
  953. n = pat_modnote(e->note);
  954. ins = e->smpno;
  955. eff.framedly = modticks(h, e->tracktick - tt1);
  956. eff.param.u = 0;
  957. eff.param.byte_a = n;
  958. eff.param.byte_b = ins;
  959. vol = e->volume;
  960. if( vol == 0 ) {
  961. eff.effect = UNI_NOTEKILL;
  962. utrk_write_local(of->ut, &eff, UNIMEM_NONE);
  963. }
  964. else {
  965. if( el->volume == 0 ) {
  966. eff.framedly = modticks(h, el->tracktick - tt1);
  967. eff.effect = UNI_NOTEKILL;
  968. utrk_write_local(of->ut, &eff, UNIMEM_NONE);
  969. }
  970. else {
  971. if( eff.framedly ) {
  972. eff.effect = UNI_NOTEDELAY;
  973. utrk_write_local(of->ut, &eff, UNIMEM_NONE);
  974. }
  975. }
  976. }
  977. utrk_write_inst(of->ut, ins);
  978. utrk_write_note(of->ut, n); // <- normal note
  979. pt_write_effect(of->ut, 0xc, vol);
  980. }
  981. else {
  982. // two notes in one row, use FINEPITCHSLIDE runonce effect
  983. // start first note on first tick and framedly runonce on seconds note tick
  984. // use volume and instrument of last note
  985. n = pat_modnote(ef->note);
  986. i = pat_modnote(el->note);
  987. ins = el->smpno;
  988. vol = el->volume;
  989. eff.effect = UNI_PITCHSLIDE;
  990. eff.framedly = modticks(h, el->tracktick - tt1)|UFD_RUNONCE;
  991. eff.param.s = ((i > n)?i-n:n-i);
  992. utrk_write_inst(of->ut, ins);
  993. utrk_write_note(of->ut, n); // <- normal note
  994. pt_write_effect(of->ut, 0xc, vol);
  995. utrk_write_local(of->ut, &eff, (i > n)? PTMEM_PITCHSLIDEUP: PTMEM_PITCHSLIDEDN);
  996. }
  997. }
  998. ch++;
  999. }
  1000. utrk_newline(of->ut);
  1001. }
  1002. if(!utrk_dup_pattern(of->ut,of)) return;
  1003. }
  1004. }
  1005. #else
  1006. static int MID_ReadPatterns(MODCOMMAND *pattern[], WORD psize[], MIDHANDLE *h, int numpat, int channels)
  1007. // =====================================================================================
  1008. {
  1009. int pat,row,i,ch;
  1010. BYTE n,ins,vol;
  1011. MIDTRACK *t;
  1012. MIDEVENT *e, *en, *ef, *el;
  1013. ULONG tt1, tt2;
  1014. MODCOMMAND *m;
  1015. int patbrk, tempo;
  1016. if( numpat > MAX_PATTERNS ) numpat = MAX_PATTERNS;
  1017. // initialize start points of event list in tracks
  1018. for( t = h->track; t; t = t->next ) t->workevent = t->head;
  1019. for( pat = 0; pat < numpat; pat++ ) {
  1020. pattern[pat] = CSoundFile::AllocatePattern(64, channels);
  1021. if( !pattern[pat] ) return 0;
  1022. psize[pat] = 64;
  1023. for( row = 0; row < 64; row++ ) {
  1024. tt1 = miditicks(h, (pat * 64 + row ) * h->speed);
  1025. tt2 = tt1 + h->midispeed;
  1026. ch = 0;
  1027. tempo = 0;
  1028. patbrk = 0;
  1029. for( e=mid_next_global(h->track->workevent); e && e->tracktick < tt2; e=mid_next_global(e->next) ) {
  1030. if( e && e->tracktick >= tt1 ) { // we have a controller event in this row
  1031. switch( e->fx ) {
  1032. case tmpo:
  1033. tempo = e->fxparam;
  1034. break;
  1035. case fxbrk:
  1036. patbrk = 1;
  1037. break;
  1038. }
  1039. }
  1040. }
  1041. for( t = h->track; t; t = t->next ) {
  1042. m = &pattern[pat][row * channels + ch];
  1043. m->param = 0;
  1044. m->command = CMD_NONE;
  1045. for( e=mid_next_fx(t->workevent); e && e->tracktick < tt2; e=mid_next_fx(e->next) ) {
  1046. if( e && e->tracktick >= tt1 ) { // we have a controller event in this row
  1047. switch( e->fx ) {
  1048. case modwheel:
  1049. m->param = e->fxparam;
  1050. m->command = CMD_VOLUMESLIDE;
  1051. break;
  1052. case wheelup:
  1053. m->param = e->fxparam|0x10;
  1054. m->command = CMD_XFINEPORTAUPDOWN;
  1055. break;
  1056. case wheeldown:
  1057. m->param = e->fxparam|0x20;
  1058. m->command = CMD_XFINEPORTAUPDOWN;
  1059. break;
  1060. }
  1061. }
  1062. }
  1063. for( e=mid_next_note(t->workevent); e && e->tracktick < tt1; e=mid_next_note(e->next) )
  1064. t->workevent = e;
  1065. i = 0;
  1066. ef = NULL;
  1067. en = e;
  1068. el = e;
  1069. for( ; e && e->tracktick < tt2; e=mid_next_note(e->next) ) { // we have a note event in this row
  1070. t->workevent = e;
  1071. i++;
  1072. if( e->volume ) {
  1073. if( !ef ) ef = e;
  1074. el = e;
  1075. }
  1076. }
  1077. if( i ) {
  1078. if( i == 1 || ef == el || !ef ) { // only one event in this row or a note on with some note off
  1079. if( ef ) e = ef;
  1080. else e = en;
  1081. el = t->workevent;
  1082. n = pat_modnote(e->note);
  1083. ins = e->smpno;
  1084. if( e->volume == 0 ) {
  1085. m->param = (BYTE)modticks(h, e->tracktick - tt1);
  1086. if( m->param ) { // note cut
  1087. m->command = CMD_S3MCMDEX;
  1088. m->param |= 0xC0;
  1089. }
  1090. else {
  1091. m->param = 0;
  1092. m->command = CMD_KEYOFF;
  1093. }
  1094. vol = 0;
  1095. }
  1096. else {
  1097. vol = e->volume/2;
  1098. if( el->volume == 0 ) {
  1099. m->param = (BYTE)modticks(h, el->tracktick - tt1);
  1100. if( m->param ) { // note cut
  1101. m->command = CMD_S3MCMDEX;
  1102. m->param |= 0xC0;
  1103. }
  1104. }
  1105. else {
  1106. m->param = (BYTE)modticks(h, e->tracktick - tt1);
  1107. if( m->param ) { // note delay
  1108. m->command = CMD_S3MCMDEX;
  1109. m->param |= 0xD0;
  1110. }
  1111. }
  1112. }
  1113. m->instr = ins;
  1114. m->note = n; // <- normal note
  1115. m->volcmd = VOLCMD_VOLUME;
  1116. m->vol = vol;
  1117. }
  1118. else {
  1119. // two notes in one row, use FINEPITCHSLIDE runonce effect
  1120. // start first note on first tick and framedly runonce on seconds note tick
  1121. // use volume and instrument of last note
  1122. n = pat_modnote(ef->note);
  1123. i = pat_modnote(el->note);
  1124. ins = el->smpno;
  1125. vol = el->volume/2;
  1126. if( vol > 64 ) vol = 64;
  1127. m->instr = ins;
  1128. m->note = n; // <- normal note
  1129. m->volcmd = VOLCMD_VOLUME;
  1130. m->vol = vol;
  1131. m->param = ((i > n)?i-n:n-i);
  1132. if( m->param < 16 ) {
  1133. if( m->param ) {
  1134. m->command = CMD_XFINEPORTAUPDOWN;
  1135. m->param |= (i > n)? 0x10: 0x20;
  1136. }
  1137. else { // retrigger same note...
  1138. m->command = CMD_RETRIG;
  1139. m->param = (BYTE)modticks(h, el->tracktick - tt1);
  1140. }
  1141. }
  1142. else
  1143. m->command = (i > n)? CMD_PORTAMENTOUP: CMD_PORTAMENTODOWN;
  1144. }
  1145. }
  1146. if( m->param == 0 && m->command == CMD_NONE ) {
  1147. if( tempo ) {
  1148. m->command = CMD_TEMPO;
  1149. m->param = tempo;
  1150. tempo = 0;
  1151. }
  1152. else {
  1153. if( patbrk ) {
  1154. m->command = CMD_PATTERNBREAK;
  1155. patbrk = 0;
  1156. }
  1157. }
  1158. }
  1159. ch++;
  1160. }
  1161. if( tempo || patbrk ) return 1;
  1162. }
  1163. }
  1164. return 0;
  1165. }
  1166. #endif
  1167. static ULONG mid_next_tracktick(MIDEVENT *e)
  1168. {
  1169. MIDEVENT *en;
  1170. en = e->next;
  1171. if( en ) return en->tracktick;
  1172. return 0x7fffffff; // practically indefinite
  1173. }
  1174. // cut off alle events that follow the given event
  1175. static void mid_stripoff(MIDTRACK *tp, MIDEVENT *e)
  1176. {
  1177. #ifndef NEWMIKMOD
  1178. MIDEVENT *ep, *en;
  1179. for( ep=e->next; ep; ep = en ) {
  1180. en=ep->next;
  1181. free(ep);
  1182. }
  1183. #endif
  1184. e->next = NULL;
  1185. tp->tail = e;
  1186. tp->workevent = tp->head;
  1187. mid_sync_track(tp, e->tracktick);
  1188. }
  1189. static void mid_notes_to_percussion(MIDTRACK *tp, ULONG adjust, ULONG tmin)
  1190. {
  1191. MIDEVENT *e, *lno = 0;
  1192. int n = 0,v;
  1193. ULONG ton, toff = 0, tnext;
  1194. v = 0x7f; // as loud as it gets
  1195. ton = 0;
  1196. for( e=tp->head; e; e=e->next ) {
  1197. if( e->tracktick < adjust ) e->tracktick = 0;
  1198. else e->tracktick -= adjust;
  1199. if( e->flg == 1 ) {
  1200. if( e->volume > 0 ) {
  1201. n = e->note;
  1202. e->smpno = pat_gmtosmp(pat_gm_drumnr(n));
  1203. e->note = pat_gm_drumnote(n);
  1204. e->volume = (v * e->volume) / 128;
  1205. if( v && !e->volume ) e->volume = 1;
  1206. ton = e->tracktick;
  1207. }
  1208. else {
  1209. toff = ton + tmin;
  1210. if( toff > e->tracktick ) {
  1211. tnext = mid_next_tracktick(e);
  1212. if( toff + tmin < tnext ) e->tracktick = toff;
  1213. else {
  1214. if( toff < tnext ) e->tracktick = toff - 1;
  1215. else e->tracktick = tnext - 1;
  1216. }
  1217. }
  1218. toff = e->tracktick;
  1219. lno = e;
  1220. }
  1221. }
  1222. else {
  1223. if( e->fx == mainvol ) {
  1224. v = e->fxparam;
  1225. if( !v && ton > toff ) {
  1226. e->flg = 1;
  1227. e->volume = 0;
  1228. e->note = pat_gm_drumnote(n);
  1229. toff = e->tracktick;
  1230. lno = e;
  1231. }
  1232. }
  1233. }
  1234. }
  1235. if( ton > toff ) {
  1236. char info[32];
  1237. sprintf(info,"%ld > %ld note %d", (long)ton, (long)toff, n);
  1238. mid_message("drum track ends with note on (%s)", info);
  1239. }
  1240. if( lno && lno->next ) mid_stripoff(tp, lno);
  1241. }
  1242. static void mid_prog_to_notes(MIDTRACK *tp, ULONG adjust, ULONG tmin)
  1243. {
  1244. MIDEVENT *e, *lno = 0;
  1245. int i = 0, n = 0, v = 0x7f;
  1246. ULONG ton, toff = 0, tnext;
  1247. ton = 0;
  1248. for( e=tp->head; e; e=e->next ) {
  1249. if( e->tracktick < adjust ) e->tracktick = 0;
  1250. else e->tracktick -= adjust;
  1251. if( e->flg == 1 ) {
  1252. if( !i ) i = pat_gmtosmp(1); // happens in eternal2.mid
  1253. e->smpno = i;
  1254. n = e->note;
  1255. if( e->volume > 0 ) {
  1256. e->volume = (v * e->volume) / 128;
  1257. if( v && !e->volume ) e->volume = 1;
  1258. ton = e->tracktick;
  1259. }
  1260. else {
  1261. toff = ton + tmin;
  1262. if( toff > e->tracktick ) {
  1263. tnext = mid_next_tracktick(e);
  1264. if( toff + tmin < tnext ) e->tracktick = toff;
  1265. else {
  1266. if( toff < tnext ) e->tracktick = toff - 1;
  1267. else e->tracktick = tnext - 1;
  1268. }
  1269. }
  1270. toff = e->tracktick;
  1271. lno = e;
  1272. }
  1273. }
  1274. else {
  1275. if( e->fx == prog ) i = e->fxparam;
  1276. if( e->fx == mainvol ) {
  1277. v = e->fxparam;
  1278. if( !v && ton > toff ) {
  1279. e->flg = 1;
  1280. e->volume = 0;
  1281. e->note = n;
  1282. toff = e->tracktick;
  1283. lno = e;
  1284. }
  1285. }
  1286. }
  1287. }
  1288. if( ton > toff ) {
  1289. char info[40];
  1290. sprintf(info,"channel %d, %ld > %ld note %d", tp->chan + 1, (long)ton, (long)toff, n);
  1291. mid_message("melody track ends with note on (%s)", info);
  1292. }
  1293. if( lno && lno->next ) mid_stripoff(tp, lno);
  1294. }
  1295. static int midiword(BYTE *b)
  1296. {
  1297. int i;
  1298. i = (b[0]&0x7f)|((b[1]&0x7f)<<7);
  1299. return i;
  1300. }
  1301. static int midishort(BYTE *b)
  1302. {
  1303. return midiword(b) - 0x2000;
  1304. }
  1305. ULONG mid_first_noteonevent_tick(MIDEVENT *e)
  1306. {
  1307. while( e && (e->flg == 0 || e->volume == 0) ) e=e->next;
  1308. if( !e ) return 0x7fffffff;
  1309. return e->tracktick;
  1310. }
  1311. // =====================================================================================
  1312. #ifdef NEWMIKMOD
  1313. BOOL MID_Load(MIDHANDLE *h, UNIMOD *of, MMSTREAM *mmfile)
  1314. #else
  1315. BOOL CSoundFile::ReadMID(const BYTE *lpStream, DWORD dwMemLength)
  1316. #endif
  1317. {
  1318. static int avoid_reentry = 0;
  1319. #ifdef NEWMIKMOD
  1320. #define m_nDefaultTempo of->inittempo
  1321. #else
  1322. MIDHANDLE *h;
  1323. MMFILE mm;
  1324. #endif
  1325. int ch, dmulti, maxtempo, panlow, panhigh, numchans, numtracks;
  1326. MIDTRACK *ttp;
  1327. uint32_t t, numpats;
  1328. char buf[256];
  1329. long miditracklen;
  1330. BYTE runningstatus;
  1331. BYTE cmd;
  1332. BYTE midibyte[2];
  1333. long metalen, delta;
  1334. BYTE *p;
  1335. while( avoid_reentry ) sleep(1);
  1336. avoid_reentry = 1;
  1337. #ifdef NEWMIKMOD
  1338. h->mmf = mmfile;
  1339. #else
  1340. if( !TestMID(lpStream, dwMemLength) ) {
  1341. avoid_reentry = 0;
  1342. return FALSE;
  1343. }
  1344. h = MID_Init();
  1345. if( !h ) {
  1346. avoid_reentry = 0;
  1347. return FALSE;
  1348. }
  1349. h->mmf = &mm;
  1350. mm.mm = (char *)lpStream;
  1351. mm.sz = dwMemLength;
  1352. mm.pos = 0;
  1353. #endif
  1354. h->debug = getenv(ENV_MMMID_DEBUG);
  1355. h->verbose = getenv(ENV_MMMID_VERBOSE);
  1356. pat_resetsmp();
  1357. pat_init_patnames();
  1358. mmfseek(h->mmf,8,SEEK_SET);
  1359. h->midiformat = mid_read_short(h);
  1360. h->miditracks = mid_read_short(h);
  1361. h->resolution = mid_read_short(h);
  1362. // at this point the h->mmf is positioned at first miditrack
  1363. if( h->midiformat == 0 ) h->miditracks = 1;
  1364. if( h->resolution & 0x8000 )
  1365. h->divider = ((h->resolution & 0x7f00)>>8)*(h->resolution & 0xff);
  1366. else
  1367. h->divider = h->resolution;
  1368. h->divider <<= 2; // ticks per quartnote ==> ticks per note
  1369. h->tempo = 122;
  1370. m_nDefaultTempo = 0;
  1371. h->tracktime = 0;
  1372. h->speed = 6;
  1373. p = (BYTE *)getenv(ENV_MMMID_SPEED);
  1374. if( p && isdigit(*p) && p[0] != '0' && p[1] == '\0' ) {
  1375. // transform speed
  1376. t = *p - '0';
  1377. h->speed *= t;
  1378. h->divider *= t;
  1379. h->speed /= 6;
  1380. h->divider /= 6;
  1381. }
  1382. // calculate optimal delta multiplier dmulti keeping tempo adjustments
  1383. // from 10 to 255 in mind (hoping there will be no midi's with tempo's
  1384. // lower than 10, that is sooo sick...)
  1385. // this is necessary for the tracks to patterns routine
  1386. dmulti = 1;
  1387. maxtempo = h->divider;
  1388. while( (h->midispeed = miditicks(h, h->speed)) * 10 < 255 * h->speed ) {
  1389. ++dmulti;
  1390. h->divider = maxtempo * dmulti;
  1391. }
  1392. h->tp = NULL;
  1393. memset(buf,0,sizeof(buf));
  1394. #ifdef NEWMIKMOD
  1395. of->songname = NULL;
  1396. #else
  1397. strcpy(m_szNames[0], "");
  1398. #endif
  1399. maxtempo = 0;
  1400. panlow = 64;
  1401. panhigh = 64;
  1402. if( h->verbose ) {
  1403. printf("Scanning MIDI with format: %d resolution: %d tracks: %d\n",
  1404. h->midiformat,
  1405. h->resolution,
  1406. h->miditracks);
  1407. }
  1408. if( h->verbose && dmulti > 1 ) {
  1409. printf("Multiplying resolution and deltatimes by %d to get %d miditicks per patternrow\n",
  1410. dmulti, h->midispeed);
  1411. }
  1412. for( t=0; t<(uint32_t)h->miditracks; t++ ) {
  1413. if( h->verbose ) printf("Parsing track %d\n", t+1);
  1414. mmreadSBYTES(buf,4,h->mmf);
  1415. buf[4] = '\0';
  1416. if( strcmp(buf,"MTrk") ) {
  1417. mid_message("invalid track-chunk '%s' is not 'MTrk'",buf);
  1418. avoid_reentry = 0;
  1419. return FALSE;
  1420. }
  1421. miditracklen = mid_read_long(h);
  1422. runningstatus = 0;
  1423. if( t && h->midiformat == 1 ) mid_rewind_tracks(h); // tracks sound simultaneously
  1424. while( miditracklen > 0 ) {
  1425. miditracklen -= mid_read_delta(h);
  1426. midibyte[0] = mid_read_byte(h);
  1427. miditracklen--;
  1428. if( midibyte[0] & 0x80 ) {
  1429. runningstatus = midibyte[0];
  1430. switch( runningstatus ) {
  1431. case 0xf1:
  1432. case 0xf4:
  1433. case 0xf5:
  1434. case 0xf6:
  1435. case 0xf7:
  1436. case 0xf8:
  1437. case 0xf9:
  1438. case 0xfa:
  1439. case 0xfb:
  1440. case 0xfc:
  1441. case 0xfd:
  1442. case 0xfe:
  1443. break;
  1444. default:
  1445. midibyte[0] = mid_read_byte(h);
  1446. miditracklen--;
  1447. break;
  1448. }
  1449. }
  1450. h->tracktime += dmulti * h->deltatime;
  1451. ch = runningstatus & 0x0f;
  1452. cmd = runningstatus & 0xf0;
  1453. switch( cmd ) {
  1454. case 0x80: // note off
  1455. midibyte[1] = mid_read_byte(h);
  1456. miditracklen--;
  1457. ttp = mid_find_track(h, ch, midibyte[0]);
  1458. if( ttp ) mid_add_noteoff(h, ttp);
  1459. if( h->debug )
  1460. printf("%2d %08ld Note off: ch %d 0x%02x 0x%02x\n",
  1461. t, (long)(h->tracktime),
  1462. ch + 1, midibyte[0], midibyte[1]);
  1463. break;
  1464. case 0x90: // note on
  1465. midibyte[1] = mid_read_byte(h);
  1466. miditracklen--;
  1467. if( midibyte[1] ) {
  1468. ttp = mid_locate_track(h, ch, midibyte[0]);
  1469. mid_add_noteon(h, ttp, midibyte[0], midibyte[1]);
  1470. if( h->debug )
  1471. printf("%2d %08ld Note on: ch %d 0x%02x 0x%02x\n",
  1472. t, (long)(h->tracktime),
  1473. ch + 1, midibyte[0], midibyte[1]);
  1474. }
  1475. else {
  1476. ttp = mid_find_track(h, ch, midibyte[0]);
  1477. if( ttp ) mid_add_noteoff(h, ttp);
  1478. if( h->debug )
  1479. printf("%2d %08ld note off: ch %d 0x%02x\n",
  1480. t, (long)(h->tracktime),
  1481. ch + 1, midibyte[0]);
  1482. }
  1483. break;
  1484. case 0xa0: // polyphonic key pressure
  1485. midibyte[1] = mid_read_byte(h);
  1486. miditracklen--;
  1487. if( h->debug )
  1488. printf("%2d %08ld polyphonic key pressure: ch %d 0x%02x 0x%02x\n", t, (long)(h->tracktime), ch + 1, midibyte[0], midibyte[1]);
  1489. break;
  1490. case 0xb0: // control change
  1491. midibyte[1] = mid_read_byte(h);
  1492. miditracklen--;
  1493. switch(midibyte[0]) {
  1494. case 0x01: // mod wheel
  1495. mid_mod_wheel(h, ch, midibyte[1]);
  1496. break;
  1497. case 0x07: // main volume
  1498. mid_main_volume(h, ch, midibyte[1]);
  1499. break;
  1500. case 0x0a: // pan
  1501. if( midibyte[1] < panlow ) panlow = midibyte[1];
  1502. if( midibyte[1] > panhigh ) panhigh = midibyte[1];
  1503. mid_pan(h, ch, midibyte[1]);
  1504. break;
  1505. case 0x0b: // expression
  1506. break;
  1507. case 0x7b:
  1508. if( midibyte[1] == 0x00 ) // all notes off
  1509. mid_all_notes_off(h, ch);
  1510. break;
  1511. default:
  1512. break;
  1513. }
  1514. if( h->debug )
  1515. printf("%2d %08ld control change: ch %d 0x%02x 0x%02x\n",
  1516. t, (long)(h->tracktime), ch + 1, midibyte[0], midibyte[1]);
  1517. break;
  1518. case 0xc0: // program change
  1519. mid_add_program(h, ch, midibyte[0]);
  1520. if( h->debug )
  1521. printf("%2d %08ld program change: ch %d %d\n",
  1522. t, (long)(h->tracktime), ch + 1, midibyte[0]);
  1523. break;
  1524. case 0xd0: // channel pressure
  1525. if( h->debug )
  1526. printf("%2d %08ld channel pressure: ch %d 0x%02x\n", t, (long)(h->tracktime), ch + 1, midibyte[0]);
  1527. break;
  1528. case 0xe0: // pitch wheel change
  1529. midibyte[1] = mid_read_byte(h);
  1530. miditracklen--;
  1531. if( h->debug )
  1532. printf("%2d %08ld pitch wheel change: ch %d %d\n",
  1533. t, (long)(h->tracktime), ch + 1, midishort(midibyte));
  1534. mid_add_pitchwheel(h, ch, midishort(midibyte));
  1535. break;
  1536. case 0xf0: // system & realtime
  1537. switch( runningstatus ) {
  1538. case 0xf0: // sysex
  1539. if( h->debug ) printf("%2d %08ld sysex: 0x%02x",
  1540. t, (long)(h->tracktime), midibyte[0]);
  1541. while( midibyte[0] != 0xf7 ) {
  1542. midibyte[0] = mid_read_byte(h);
  1543. miditracklen--;
  1544. if( h->debug ) printf(" %02X", midibyte[0]);
  1545. }
  1546. if( h->debug ) printf("\n");
  1547. break;
  1548. case 0xf2: // song position pointer
  1549. midibyte[1] = mid_read_byte(h);
  1550. miditracklen--;
  1551. if( h->debug )
  1552. printf("%2d %08ld song position pointer: %d",
  1553. t, (long)(h->tracktime), midishort(midibyte));
  1554. break;
  1555. case 0xf7:
  1556. delta = h->deltatime;
  1557. miditracklen -= mid_read_delta(h);
  1558. metalen = h->deltatime;
  1559. if( h->debug )
  1560. printf("%2d %08ld sysex continued: %ld",
  1561. t, (long)(h->tracktime), metalen);
  1562. while( metalen > 0 ) {
  1563. midibyte[1] = mid_read_byte(h);
  1564. metalen--;
  1565. miditracklen--;
  1566. if( h->debug ) printf(" %02X", midibyte[1]);
  1567. }
  1568. h->deltatime = delta;
  1569. break;
  1570. case 0xff: // meta event
  1571. delta = h->deltatime;
  1572. miditracklen -= mid_read_delta(h);
  1573. metalen = h->deltatime;
  1574. if( metalen > 31 ) metalen = 31;
  1575. if( metalen ) {
  1576. mmreadSBYTES(buf, metalen, h->mmf);
  1577. miditracklen -= metalen;
  1578. }
  1579. buf[metalen] = '\0';
  1580. metalen = h->deltatime - metalen;
  1581. while( metalen > 0 ) {
  1582. midibyte[1] = mid_read_byte(h);
  1583. metalen--;
  1584. miditracklen--;
  1585. }
  1586. h->deltatime = delta;
  1587. switch( midibyte[0] ) {
  1588. case 0x03: // type: track name
  1589. if( h->debug )
  1590. printf("%2d %08ld META trackname:%s\n", t, (long)(h->tracktime), buf);
  1591. #ifdef NEWMIKMOD
  1592. if( !of->songname )
  1593. of->songname = DupStr(of->allochandle, buf, strlen(buf));
  1594. #else
  1595. if( m_szNames[0][0] == '\0' )
  1596. strcpy(m_szNames[0], buf);
  1597. #endif
  1598. break;
  1599. case 0x51: // type: tempo
  1600. p=(BYTE *)buf;
  1601. delta = (p[0]<<16)|(p[1]<<8)|p[2];
  1602. if( delta )
  1603. h->tempo = 60000000 / delta;
  1604. if( h->debug ) printf("%2d %08ld META tempo:%d\n", t, (long)(h->tracktime), h->tempo);
  1605. if( m_nDefaultTempo == 0 ) m_nDefaultTempo = h->tempo;
  1606. else {
  1607. ttp = h->track;
  1608. if( !ttp ) ttp = mid_locate_track(h, 0, 0xff);
  1609. mid_add_tempo_event(h,h->tempo);
  1610. }
  1611. if( h->tempo > maxtempo ) maxtempo = h->tempo;
  1612. break;
  1613. case 0x2f: // type: end of track
  1614. if( h->debug ) printf("%2d %08ld META end of track\n", t, (long)(h->tracktime));
  1615. if( miditracklen > 0 ) {
  1616. sprintf(buf, "%ld", miditracklen);
  1617. mid_message("Meta event not at end of track, %s bytes left in track", buf);
  1618. miditracklen = 0;
  1619. }
  1620. break;
  1621. default:
  1622. if( h->debug ) printf("%2d %08ld META type 0x%02x\n", t, (long)(h->tracktime), midibyte[0]);
  1623. break;
  1624. }
  1625. break;
  1626. default:
  1627. if( h->debug ) printf("%2d %08ld System type 0x%02x\n", t, (long)(h->tracktime), midibyte[0]);
  1628. break;
  1629. }
  1630. break;
  1631. default: // no running status, just skip it...
  1632. if( h->debug ) printf("%2d %08ld unknown runningstatus: 0x%02x skipped:0x%02x\n", t, (long)(h->tracktime), runningstatus, midibyte[0]);
  1633. break;
  1634. }
  1635. if( miditracklen < 1 && (runningstatus != 0xff || midibyte[0] != 0x2f) ) {
  1636. delta = mmftell(h->mmf);
  1637. mmreadSBYTES(buf,4,h->mmf);
  1638. buf[4] = '\0';
  1639. if( strcmp(buf,"MTrk") ) {
  1640. miditracklen = 0x7fffffff;
  1641. mid_message("Meta event not at end of track, %s bytes left in track", "superfluous");
  1642. }
  1643. else
  1644. mid_message("Meta event not at end of track, %s bytes left in track", "no");
  1645. mmfseek(h->mmf,delta,SEEK_SET);
  1646. }
  1647. }
  1648. }
  1649. if( h->verbose ) printf("Determining percussion channel\n");
  1650. // get the lowest event time and the used channels
  1651. delta = 0x7fffffff;
  1652. metalen = 0; // use as bit bucket for used channels
  1653. for( ttp=h->track; ttp; ttp=ttp->next ) {
  1654. metalen |= (1<<ttp->chan);
  1655. if( ttp->head ) {
  1656. ULONG tt;
  1657. tt = mid_first_noteonevent_tick(ttp->head);
  1658. if( tt < (ULONG)delta )
  1659. delta = tt;
  1660. }
  1661. }
  1662. if( metalen & 0x03ff ) {
  1663. if( (metalen & 0x0f00) == 0x0400 )
  1664. h->percussion = 10; // buggy sng2mid uses channel 10
  1665. else
  1666. h->percussion = 9;
  1667. }
  1668. else h->percussion = 15;
  1669. if( h->verbose )
  1670. printf("Percussion channel is %d\nStripping off silences and other optimalisations\n", h->percussion + 1);
  1671. // last but not least shut off all pending events, transform drumnotes when appropriate
  1672. // strip off silences at begin and end and get the greatest tracktime
  1673. h->tracktime = 0;
  1674. metalen = h->midispeed;
  1675. for( ttp=h->track; ttp; ttp=ttp->next ) {
  1676. if( ttp->chan == h->percussion )
  1677. mid_notes_to_percussion(ttp, delta, metalen);
  1678. else
  1679. mid_prog_to_notes(ttp, delta, metalen);
  1680. if( ttp->tail && ttp->tail->tracktick > h->tracktime )
  1681. h->tracktime = ttp->tail->tracktick;
  1682. }
  1683. h->tracktime += h->divider >> 2; // add one quartnote to the song for silence
  1684. mid_add_partbreak(h);
  1685. if( h->debug )
  1686. mid_dump_tracks(h);
  1687. numchans = mid_numchans(h);
  1688. if( panlow > 48 || panhigh < 80 ) {
  1689. for( ttp=h->track; ttp; ttp=ttp->next ) {
  1690. ttp->balance = ((0x40*numchans+0x80*mid_ordchan(h, ttp->chan))/numchans)&0x7f;
  1691. }
  1692. }
  1693. // set module variables
  1694. numtracks = mid_numtracks(h);
  1695. if( m_nDefaultTempo == 0 ) m_nDefaultTempo = h->tempo;
  1696. if( maxtempo == 0 ) maxtempo = h->tempo;
  1697. if( maxtempo != 255 ) {
  1698. if( h->verbose ) printf("Adjusting tempo %d to 255\n", maxtempo);
  1699. mid_adjust_for_optimal_tempo(h, maxtempo);
  1700. }
  1701. if( maxtempo > 0 ) m_nDefaultTempo = (255 * m_nDefaultTempo) / maxtempo;
  1702. numpats = 1 + (modticks(h, h->tracktime) / h->speed / 64 );
  1703. if( h->verbose ) printf("Generating %d patterns with speed %d\n", numpats, h->speed);
  1704. #ifdef NEWMIKMOD
  1705. if( !of->songname ) of->songname = DupStr(of->allochandle, "Untitled", 8);
  1706. of->memsize = STMEM_LAST; // Number of memory slots to reserve!
  1707. of->modtype = _mm_strdup(of->allochandle, MID_Version);
  1708. of->numpat = numpats;
  1709. of->numpos = of->numpat;
  1710. of->reppos = 0;
  1711. of->initspeed = h->speed;
  1712. of->numchn = numtracks;
  1713. of->numtrk = of->numpat * of->numchn;
  1714. of->initvolume = 64;
  1715. of->pansep = 128;
  1716. // orderlist
  1717. if(!AllocPositions(of, of->numpos)) {
  1718. avoid_reentry = 0;
  1719. return FALSE;
  1720. }
  1721. for(t=0; t<of->numpos; t++)
  1722. of->positions[t] = t;
  1723. if( !PAT_Load_Instruments(of) ) {
  1724. avoid_reentry = 0;
  1725. return FALSE;
  1726. }
  1727. // ==============================
  1728. // Load the pattern info now!
  1729. if(!AllocTracks(of)) {
  1730. avoid_reentry = 0;
  1731. return FALSE;
  1732. }
  1733. if(!AllocPatterns(of)) {
  1734. avoid_reentry = 0;
  1735. return FALSE;
  1736. }
  1737. of->ut = utrk_init(of->numchn, h->allochandle);
  1738. utrk_memory_reset(of->ut);
  1739. utrk_local_memflag(of->ut, PTMEM_PORTAMENTO, TRUE, FALSE);
  1740. MID_ReadPatterns(of, h, numpats);
  1741. // ============================================================
  1742. // set panning positions
  1743. t = 0;
  1744. for( ttp=h->track; ttp; ttp=ttp->next ) {
  1745. of->panning[t] = modpan(ttp->balance, numchans / 2);
  1746. t++;
  1747. }
  1748. #else
  1749. m_nType = MOD_TYPE_MID;
  1750. m_nDefaultSpeed = h->speed;
  1751. m_nChannels = numtracks;
  1752. m_dwSongFlags = SONG_LINEARSLIDES;
  1753. m_nMinPeriod = 28 << 2;
  1754. m_nMaxPeriod = 1712 << 3;
  1755. // orderlist
  1756. for(t=0; t < numpats; t++)
  1757. Order[t] = t;
  1758. if( !PAT_Load_Instruments(this) ) {
  1759. avoid_reentry = 0;
  1760. return FALSE;
  1761. }
  1762. // ==============================
  1763. // Load the pattern info now!
  1764. if( MID_ReadPatterns(Patterns, PatternSize, h, numpats, m_nChannels) ) {
  1765. // :^( need one more channel to handle the global events ;^b
  1766. m_nChannels++;
  1767. h->tp = mid_new_track(h, h->track->chan, 0xff);
  1768. for( ttp=h->track; ttp->next; ttp=ttp->next ) ;
  1769. ttp->next = h->tp;
  1770. mid_add_sync(h, h->tp);
  1771. for( t=0; t<numpats; t++ ) {
  1772. FreePattern(Patterns[t]);
  1773. Patterns[t] = NULL;
  1774. }
  1775. MID_ReadPatterns(Patterns, PatternSize, h, numpats, m_nChannels);
  1776. }
  1777. // ============================================================
  1778. // set panning positions
  1779. t = 0;
  1780. for( ttp=h->track; ttp; ttp=ttp->next ) {
  1781. ChnSettings[t].nPan = modpan(ttp->balance, numchans / 2);
  1782. ChnSettings[t].nVolume = 64;
  1783. t++;
  1784. }
  1785. MID_Cleanup(h); // we dont need it anymore
  1786. #endif
  1787. if( h->verbose ) printf("Done\n");
  1788. avoid_reentry = 0; // it is safe now, I'm finished
  1789. return TRUE;
  1790. }
  1791. #ifdef NEWMIKMOD
  1792. // =====================================================================================
  1793. CHAR *MID_LoadTitle(MMSTREAM *mmfile)
  1794. // =====================================================================================
  1795. {
  1796. int t;
  1797. char buf[24];
  1798. long miditracklen;
  1799. BYTE runningstatus;
  1800. BYTE cmd;
  1801. BYTE midibyte[2];
  1802. long metalen;
  1803. MIDHANDLE hh, *h;
  1804. h = &hh;
  1805. h->mmf = mmfile;
  1806. mmfseek(h->mmf,8,SEEK_SET);
  1807. h->midiformat = mid_read_short(h);
  1808. h->miditracks = mid_read_short(h);
  1809. h->resolution = mid_read_short(h);
  1810. // at this point the h->mmf is positioned at first miditrack
  1811. if( h->midiformat == 0 ) h->miditracks = 1;
  1812. h->tracktime = 0;
  1813. for( t=0; t<h->miditracks; t++ ) {
  1814. mmreadSBYTES(buf,4,h->mmf);
  1815. miditracklen = mid_read_long(h);
  1816. runningstatus = 0;
  1817. while( miditracklen > 0 ) {
  1818. miditracklen -= mid_read_delta(h);
  1819. midibyte[0] = mid_read_byte(h);
  1820. miditracklen--;
  1821. if( midibyte[0] & 0x80 ) {
  1822. runningstatus = midibyte[0];
  1823. switch( runningstatus ) {
  1824. case 0xf1:
  1825. case 0xf4:
  1826. case 0xf5:
  1827. case 0xf6:
  1828. case 0xf7:
  1829. case 0xf8:
  1830. case 0xf9:
  1831. case 0xfa:
  1832. case 0xfb:
  1833. case 0xfc:
  1834. case 0xfd:
  1835. case 0xfe:
  1836. break;
  1837. default:
  1838. midibyte[0] = mid_read_byte(h);
  1839. miditracklen--;
  1840. break;
  1841. }
  1842. }
  1843. cmd = runningstatus & 0xf0;
  1844. switch( cmd ) {
  1845. case 0x80: // note off
  1846. case 0x90: // note on
  1847. case 0xa0: // polyphonic key pressure
  1848. case 0xb0: // control change
  1849. case 0xe0: // pitch wheel change
  1850. midibyte[1] = mid_read_byte(h);
  1851. miditracklen--;
  1852. case 0xc0: // program change
  1853. case 0xd0: // channel pressure
  1854. break;
  1855. case 0xf0: // system & realtime
  1856. switch( runningstatus ) {
  1857. case 0xf0: // sysex
  1858. while( midibyte[0] != 0xf7 ) {
  1859. midibyte[0] = mid_read_byte(h);
  1860. miditracklen--;
  1861. }
  1862. break;
  1863. case 0xf2: // song position pointer
  1864. midibyte[1] = mid_read_byte(h);
  1865. miditracklen--;
  1866. break;
  1867. case 0xf7:
  1868. miditracklen -= mid_read_delta(h);
  1869. metalen = h->deltatime;
  1870. while( metalen > 0 ) {
  1871. midibyte[1] = mid_read_byte(h);
  1872. metalen--;
  1873. miditracklen--;
  1874. }
  1875. break;
  1876. case 0xff: // meta event
  1877. miditracklen -= mid_read_delta(h);
  1878. metalen = h->deltatime;
  1879. if( metalen > 21 ) metalen = 21;
  1880. if( metalen ) {
  1881. mmreadSBYTES(buf, metalen, h->mmf);
  1882. miditracklen -= metalen;
  1883. }
  1884. buf[metalen] = '\0';
  1885. metalen = h->deltatime - metalen;
  1886. while( metalen > 0 ) {
  1887. midibyte[1] = mid_read_byte(h);
  1888. metalen--;
  1889. miditracklen--;
  1890. }
  1891. switch( midibyte[0] ) {
  1892. case 0x03: // type: track name
  1893. return DupStr(NULL, buf, strlen(buf));
  1894. break;
  1895. case 0x2f: // type: end of track
  1896. miditracklen = 0;
  1897. break;
  1898. default:
  1899. break;
  1900. }
  1901. break;
  1902. default:
  1903. break;
  1904. }
  1905. break;
  1906. default: // no running status, just skip it...
  1907. break;
  1908. }
  1909. if( miditracklen < 1 && (runningstatus != 0xff || midibyte[0] != 0x2f) ) {
  1910. metalen = mmftell(h->mmf);
  1911. mmreadSBYTES(buf,4,h->mmf);
  1912. buf[4] = '\0';
  1913. if( strcmp(buf,"MTrk") ) miditracklen = 0x7fffffff;
  1914. mmfseek(h->mmf,metalen,SEEK_SET);
  1915. }
  1916. }
  1917. }
  1918. return DupStr(NULL, "Untitled" ,8);
  1919. }
  1920. MLOADER load_mid =
  1921. {
  1922. "MID",
  1923. "Musical Instrument Digital Interface",
  1924. 0x30,
  1925. NULL,
  1926. MID_Test,
  1927. (void *(*)(void))MID_Init,
  1928. (void (*)(ML_HANDLE *))MID_Cleanup,
  1929. /* Every single loader seems to need one of these! */
  1930. (BOOL (*)(ML_HANDLE *, UNIMOD *, MMSTREAM *))MID_Load,
  1931. MID_LoadTitle
  1932. };
  1933. #endif