7 UNIMOD (mikmod's internal format) module loader.
10 All systems - all compilers (hopefully)
22 if(!fread(id,4,1,modfp)) return 0;
23 if(!memcmp(id,"UN05",4)) return 1;
34 void UNI_Cleanup(void)
45 len=_mm_read_I_UWORD(modfp);
48 s=(char *)malloc(len+1);
61 len=_mm_read_I_UWORD(modfp);
62 t=(UBYTE *)malloc(len);
73 _mm_fseek(modfp,4,SEEK_SET);
75 /* try to read module header */
77 of.numchn =_mm_read_UBYTE(modfp);
78 of.numpos =_mm_read_I_UWORD(modfp);
79 of.reppos =_mm_read_I_UWORD(modfp);
80 of.numpat =_mm_read_I_UWORD(modfp);
81 of.numtrk =_mm_read_I_UWORD(modfp);
82 of.numins =_mm_read_I_UWORD(modfp);
83 of.initspeed=_mm_read_UBYTE(modfp);
84 of.inittempo=_mm_read_UBYTE(modfp);
85 _mm_read_UBYTES(of.positions,256,modfp);
86 _mm_read_UBYTES(of.panning,32,modfp);
87 of.flags =_mm_read_UBYTE(modfp);
90 myerr=ERROR_LOADING_HEADER;
94 of.songname=StrRead();
96 of.comment=StrRead(); /* <- new since UN01 */
98 /* printf("Song: %s\nModty: %s\n",of.songname,of.modtype);
101 if(!AllocInstruments()) return 0;
102 if(!AllocTracks()) return 0;
103 if(!AllocPatterns()) return 0;
105 /* Read sampleinfos */
107 for(t=0;t<of.numins;t++){
109 INSTRUMENT *i=&of.instruments[t];
111 i->numsmp=_mm_read_UBYTE(modfp);
112 _mm_read_UBYTES(i->samplenumber,96,modfp);
114 i->volflg=_mm_read_UBYTE(modfp);
115 i->volpts=_mm_read_UBYTE(modfp);
116 i->volsus=_mm_read_UBYTE(modfp);
117 i->volbeg=_mm_read_UBYTE(modfp);
118 i->volend=_mm_read_UBYTE(modfp);
121 i->volenv[u].pos=_mm_read_I_SWORD(modfp);
122 i->volenv[u].val=_mm_read_I_SWORD(modfp);
125 i->panflg=_mm_read_UBYTE(modfp);
126 i->panpts=_mm_read_UBYTE(modfp);
127 i->pansus=_mm_read_UBYTE(modfp);
128 i->panbeg=_mm_read_UBYTE(modfp);
129 i->panend=_mm_read_UBYTE(modfp);
132 i->panenv[u].pos=_mm_read_I_SWORD(modfp);
133 i->panenv[u].val=_mm_read_I_SWORD(modfp);
136 i->vibtype =_mm_read_UBYTE(modfp);
137 i->vibsweep =_mm_read_UBYTE(modfp);
138 i->vibdepth =_mm_read_UBYTE(modfp);
139 i->vibrate =_mm_read_UBYTE(modfp);
141 i->volfade =_mm_read_I_UWORD(modfp);
142 i->insname =StrRead();
144 /* printf("Ins: %s\n",i->insname);
146 if(!AllocSamples(i)) return 0;
148 for(u=0;u<i->numsmp;u++){
150 SAMPLE *s=&i->samples[u];
152 s->c2spd = _mm_read_I_UWORD(modfp);
153 s->transpose= _mm_read_SBYTE(modfp);
154 s->volume = _mm_read_UBYTE(modfp);
155 s->panning = _mm_read_UBYTE(modfp);
156 s->length = _mm_read_I_ULONG(modfp);
157 s->loopstart= _mm_read_I_ULONG(modfp);
158 s->loopend = _mm_read_I_ULONG(modfp);
159 s->flags = _mm_read_I_UWORD(modfp);
162 s->samplename=StrRead();
168 _mm_read_I_UWORDS(of.pattrows,of.numpat,modfp);
169 _mm_read_I_UWORDS(of.patterns,of.numpat*of.numchn,modfp);
173 for(t=0;t<of.numtrk;t++){
174 of.tracks[t]=TrkRead();
184 "Portable UNI loader v0.3",