Mercurial > audlegacy-plugins
comparison src/adplug/core/adtrack.cxx @ 955:4709ce4e209e trunk
[svn] Run indent -ts4 -nut -bli0 -cdw on this messy lot. Upstream is not consistent with whitespace anyway, no loss there.
author | chainsaw |
---|---|
date | Sat, 14 Apr 2007 15:23:50 -0700 |
parents | cae46214b8bf |
children | fa9f85cebade |
comparison
equal
deleted
inserted
replaced
954:d7a6fd179cd2 | 955:4709ce4e209e |
---|---|
35 #include "adtrack.h" | 35 #include "adtrack.h" |
36 #include "debug.h" | 36 #include "debug.h" |
37 | 37 |
38 /*** Public methods ***/ | 38 /*** Public methods ***/ |
39 | 39 |
40 CPlayer *CadtrackLoader::factory(Copl *newopl) | 40 CPlayer * |
41 { | 41 CadtrackLoader::factory (Copl * newopl) |
42 return new CadtrackLoader(newopl); | 42 { |
43 } | 43 return new CadtrackLoader (newopl); |
44 | 44 } |
45 bool CadtrackLoader::load(VFSFile *fd, const CFileProvider &fp) | 45 |
46 { | 46 bool |
47 binistream *f = fp.open(fd); if(!f) return false; | 47 CadtrackLoader::load (VFSFile * fd, const CFileProvider & fp) |
48 { | |
49 binistream *f = fp.open (fd); | |
50 if (!f) | |
51 return false; | |
48 binistream *instf; | 52 binistream *instf; |
49 char note[2]; | 53 char note[2]; |
50 unsigned short rwp; | 54 unsigned short rwp; |
51 unsigned char chp, octave, pnote = 0; | 55 unsigned char chp, octave, pnote = 0; |
52 int i,j; | 56 int i, j; |
53 AdTrackInst myinst; | 57 AdTrackInst myinst; |
54 std::string filename(fd->uri); | 58 std::string filename (fd->uri); |
55 | 59 |
56 // file validation | 60 // file validation |
57 if(!fp.extension(filename, ".sng") || fp.filesize(f) != 36000) | 61 if (!fp.extension (filename, ".sng") || fp.filesize (f) != 36000) |
58 { fp.close(f); return false; } | 62 { |
63 fp.close (f); | |
64 return false; | |
65 } | |
59 | 66 |
60 // check for instruments file | 67 // check for instruments file |
61 std::string instfilename(filename, 0, filename.find_last_of('.')); | 68 std::string instfilename (filename, 0, filename.find_last_of ('.')); |
62 instfilename += ".ins"; | 69 instfilename += ".ins"; |
63 AdPlug_LogWrite("CadtrackLoader::load(,\"%s\"): Checking for \"%s\"...\n", | 70 AdPlug_LogWrite ("CadtrackLoader::load(,\"%s\"): Checking for \"%s\"...\n", |
64 filename.c_str(), instfilename.c_str()); | 71 filename.c_str (), instfilename.c_str ()); |
65 | 72 |
66 VFSFile *instfd = vfs_fopen(instfilename.c_str(), "rb"); | 73 VFSFile *instfd = vfs_fopen (instfilename.c_str (), "rb"); |
67 instf = fp.open(instfd); | 74 instf = fp.open (instfd); |
68 if(!instf || fp.filesize(instf) != 468) { fp.close(f); vfs_fclose(instfd); return false; } | 75 if (!instf || fp.filesize (instf) != 468) |
76 { | |
77 fp.close (f); | |
78 vfs_fclose (instfd); | |
79 return false; | |
80 } | |
69 | 81 |
70 // give CmodPlayer a hint on what we're up to | 82 // give CmodPlayer a hint on what we're up to |
71 realloc_patterns(1,1000,9); realloc_instruments(9); realloc_order(1); | 83 realloc_patterns (1, 1000, 9); |
72 init_trackord(); flags = NoKeyOn; | 84 realloc_instruments (9); |
73 (*order) = 0; length = 1; restartpos = 0; bpm = 120; initspeed = 3; | 85 realloc_order (1); |
86 init_trackord (); | |
87 flags = NoKeyOn; | |
88 (*order) = 0; | |
89 length = 1; | |
90 restartpos = 0; | |
91 bpm = 120; | |
92 initspeed = 3; | |
74 | 93 |
75 // load instruments from instruments file | 94 // load instruments from instruments file |
76 for(i=0;i<9;i++) { | 95 for (i = 0; i < 9; i++) |
77 for(j=0;j<2;j++) { | 96 { |
78 myinst.op[j].appampmod = instf->readInt(2); | 97 for (j = 0; j < 2; j++) |
79 myinst.op[j].appvib = instf->readInt(2); | 98 { |
80 myinst.op[j].maintsuslvl = instf->readInt(2); | 99 myinst.op[j].appampmod = instf->readInt (2); |
81 myinst.op[j].keybscale = instf->readInt(2); | 100 myinst.op[j].appvib = instf->readInt (2); |
82 myinst.op[j].octave = instf->readInt(2); | 101 myinst.op[j].maintsuslvl = instf->readInt (2); |
83 myinst.op[j].freqrisevollvldn = instf->readInt(2); | 102 myinst.op[j].keybscale = instf->readInt (2); |
84 myinst.op[j].softness = instf->readInt(2); | 103 myinst.op[j].octave = instf->readInt (2); |
85 myinst.op[j].attack = instf->readInt(2); | 104 myinst.op[j].freqrisevollvldn = instf->readInt (2); |
86 myinst.op[j].decay = instf->readInt(2); | 105 myinst.op[j].softness = instf->readInt (2); |
87 myinst.op[j].release = instf->readInt(2); | 106 myinst.op[j].attack = instf->readInt (2); |
88 myinst.op[j].sustain = instf->readInt(2); | 107 myinst.op[j].decay = instf->readInt (2); |
89 myinst.op[j].feedback = instf->readInt(2); | 108 myinst.op[j].release = instf->readInt (2); |
90 myinst.op[j].waveform = instf->readInt(2); | 109 myinst.op[j].sustain = instf->readInt (2); |
110 myinst.op[j].feedback = instf->readInt (2); | |
111 myinst.op[j].waveform = instf->readInt (2); | |
91 } | 112 } |
92 convert_instrument(i, &myinst); | 113 convert_instrument (i, &myinst); |
93 } | 114 } |
94 fp.close(instf); | 115 fp.close (instf); |
95 | 116 |
96 // load file | 117 // load file |
97 for(rwp=0;rwp<1000;rwp++) | 118 for (rwp = 0; rwp < 1000; rwp++) |
98 for(chp=0;chp<9;chp++) { | 119 for (chp = 0; chp < 9; chp++) |
120 { | |
99 // read next record | 121 // read next record |
100 f->readString(note, 2); octave = f->readInt(1); f->ignore(); | 122 f->readString (note, 2); |
101 switch(*note) { | 123 octave = f->readInt (1); |
102 case 'C': if(note[1] == '#') pnote = 2; else pnote = 1; break; | 124 f->ignore (); |
103 case 'D': if(note[1] == '#') pnote = 4; else pnote = 3; break; | 125 switch (*note) |
104 case 'E': pnote = 5; break; | 126 { |
105 case 'F': if(note[1] == '#') pnote = 7; else pnote = 6; break; | 127 case 'C': |
106 case 'G': if(note[1] == '#') pnote = 9; else pnote = 8; break; | 128 if (note[1] == '#') |
107 case 'A': if(note[1] == '#') pnote = 11; else pnote = 10; break; | 129 pnote = 2; |
108 case 'B': pnote = 12; break; | 130 else |
131 pnote = 1; | |
132 break; | |
133 case 'D': | |
134 if (note[1] == '#') | |
135 pnote = 4; | |
136 else | |
137 pnote = 3; | |
138 break; | |
139 case 'E': | |
140 pnote = 5; | |
141 break; | |
142 case 'F': | |
143 if (note[1] == '#') | |
144 pnote = 7; | |
145 else | |
146 pnote = 6; | |
147 break; | |
148 case 'G': | |
149 if (note[1] == '#') | |
150 pnote = 9; | |
151 else | |
152 pnote = 8; | |
153 break; | |
154 case 'A': | |
155 if (note[1] == '#') | |
156 pnote = 11; | |
157 else | |
158 pnote = 10; | |
159 break; | |
160 case 'B': | |
161 pnote = 12; | |
162 break; | |
109 case '\0': | 163 case '\0': |
110 if(note[1] == '\0') | 164 if (note[1] == '\0') |
111 tracks[chp][rwp].note = 127; | 165 tracks[chp][rwp].note = 127; |
112 else { | 166 else |
113 fp.close(f); | 167 { |
114 return false; | 168 fp.close (f); |
115 } | 169 return false; |
116 break; | 170 } |
117 default: fp.close(f); return false; | 171 break; |
172 default: | |
173 fp.close (f); | |
174 return false; | |
118 } | 175 } |
119 if((*note) != '\0') { | 176 if ((*note) != '\0') |
120 tracks[chp][rwp].note = pnote + (octave * 12); | 177 { |
121 tracks[chp][rwp].inst = chp + 1; | 178 tracks[chp][rwp].note = pnote + (octave * 12); |
179 tracks[chp][rwp].inst = chp + 1; | |
122 } | 180 } |
123 } | 181 } |
124 | 182 |
125 fp.close(f); | 183 fp.close (f); |
126 rewind(0); | 184 rewind (0); |
127 return true; | 185 return true; |
128 } | 186 } |
129 | 187 |
130 float CadtrackLoader::getrefresh() | 188 float |
189 CadtrackLoader::getrefresh () | |
131 { | 190 { |
132 return 18.2f; | 191 return 18.2f; |
133 } | 192 } |
134 | 193 |
135 /*** Private methods ***/ | 194 /*** Private methods ***/ |
136 | 195 |
137 void CadtrackLoader::convert_instrument(unsigned int n, AdTrackInst *i) | 196 void |
197 CadtrackLoader::convert_instrument (unsigned int n, AdTrackInst * i) | |
138 { | 198 { |
139 // Carrier "Amp Mod / Vib / Env Type / KSR / Multiple" register | 199 // Carrier "Amp Mod / Vib / Env Type / KSR / Multiple" register |
140 inst[n].data[2] = i->op[Carrier].appampmod ? 1 << 7 : 0; | 200 inst[n].data[2] = i->op[Carrier].appampmod ? 1 << 7 : 0; |
141 inst[n].data[2] += i->op[Carrier].appvib ? 1 << 6 : 0; | 201 inst[n].data[2] += i->op[Carrier].appvib ? 1 << 6 : 0; |
142 inst[n].data[2] += i->op[Carrier].maintsuslvl ? 1 << 5 : 0; | 202 inst[n].data[2] += i->op[Carrier].maintsuslvl ? 1 << 5 : 0; |
143 inst[n].data[2] += i->op[Carrier].keybscale ? 1 << 4 : 0; | 203 inst[n].data[2] += i->op[Carrier].keybscale ? 1 << 4 : 0; |
144 inst[n].data[2] += (i->op[Carrier].octave + 1) & 0xffff; // Bug in original tracker | 204 inst[n].data[2] += (i->op[Carrier].octave + 1) & 0xffff; // Bug in original tracker |
145 // Modulator... | 205 // Modulator... |
146 inst[n].data[1] = i->op[Modulator].appampmod ? 1 << 7 : 0; | 206 inst[n].data[1] = i->op[Modulator].appampmod ? 1 << 7 : 0; |
147 inst[n].data[1] += i->op[Modulator].appvib ? 1 << 6 : 0; | 207 inst[n].data[1] += i->op[Modulator].appvib ? 1 << 6 : 0; |
148 inst[n].data[1] += i->op[Modulator].maintsuslvl ? 1 << 5 : 0; | 208 inst[n].data[1] += i->op[Modulator].maintsuslvl ? 1 << 5 : 0; |
149 inst[n].data[1] += i->op[Modulator].keybscale ? 1 << 4 : 0; | 209 inst[n].data[1] += i->op[Modulator].keybscale ? 1 << 4 : 0; |
150 inst[n].data[1] += (i->op[Modulator].octave + 1) & 0xffff; // Bug in original tracker | 210 inst[n].data[1] += (i->op[Modulator].octave + 1) & 0xffff; // Bug in original tracker |
151 | 211 |
152 // Carrier "Key Scaling / Level" register | 212 // Carrier "Key Scaling / Level" register |
153 inst[n].data[10] = (i->op[Carrier].freqrisevollvldn & 3) << 6; | 213 inst[n].data[10] = (i->op[Carrier].freqrisevollvldn & 3) << 6; |
154 inst[n].data[10] += i->op[Carrier].softness & 63; | 214 inst[n].data[10] += i->op[Carrier].softness & 63; |
155 // Modulator... | 215 // Modulator... |