aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--music/it2midi.cpp64
1 files changed, 44 insertions, 20 deletions
diff --git a/music/it2midi.cpp b/music/it2midi.cpp
index ac64bee..09bd861 100644
--- a/music/it2midi.cpp
+++ b/music/it2midi.cpp
@@ -78,6 +78,8 @@
#include <utility>
#include <vector>
const int debuggxx=0;
+const int disablegxx=0;
+const int pretendspeed=-1;//set to 3 to force standarized speed
const char* IMPHdr="IMPM";
uint16_t readSW(FILE* f)
{
@@ -153,6 +155,7 @@ class ITRow
{
std::vector<ITCell> cells;
private:
+ ITRow(){}
ITRow(ITContainer *c,ITPattern *pat);
public:
ITCell& operator [](size_t s){if(s<64)return cells[s];}
@@ -258,7 +261,7 @@ class ITContainer
for(uint16_t i=0;i<cpat;++i)
{
patterns.push_back(ITPattern(this,i));
- //patterns.back().dumpPattern();
+// patterns.back().dumpPattern();
}
}
~ITContainer()
@@ -314,6 +317,15 @@ ITPattern::ITPattern(ITContainer *c,int p)
readDW(c->f);
long pos=ftell(c->f);
lastval.resize(64);
+ if(!c->ppat[p])
+ {
+ for(size_t i=0;i<nrows;++i)
+ {
+ rows.push_back(ITRow());
+ rows.back().cells.resize(64);
+ }
+ return;
+ }
for(size_t i=0;i<nrows;++i)
rows.push_back(ITRow(c,this));
if(ftell(c->f)-pos!=len)
@@ -639,7 +651,7 @@ class ITConverter
if(ch==0xFF)
{
++par->currow;
- par->curmiditk+=40*par->speed;
+ par->curmiditk+=~pretendspeed?40*pretendspeed:40*par->speed;
for(uint8_t i=0;i<64;++i)
if(par->chnote[i]!=255)
{
@@ -675,7 +687,11 @@ class ITConverter
uint32_t curnote=par->chnote[ch];
if(mask>>0&1)curnote=note;
if(curnote<120 && curnote>=12)
- par->chvelm[ch]=par->c.sample[par->c.instr[par->chinst[ch]].sampleref[curnote-12]-1].defvol*2;
+ {
+ if (par->c.instr[par->chinst[ch]].sampleref[curnote-12]-1 < par->c.sample.size())
+ par->chvelm[ch]=par->c.sample[par->c.instr[par->chinst[ch]].sampleref[curnote-12]-1].defvol*2;
+ else par->chvelm[ch]=127;
+ }
if(par->chvelm[ch]>127)
par->chvelm[ch]=127;
if(par->chvelm[ch]==0)
@@ -732,7 +748,7 @@ class ITConverter
if(pbv<-1)pbv=-1;
uint32_t pbvi=int(pbv*8192)+8192;
par->f.tracks[par->minstch[std::make_pair(ch,par->chinst[ch])]].
- eventList.push_back(MidiEvent::pb(40*tk+par->curmiditk,0,pbvi));
+ eventList.push_back(MidiEvent::pb((~pretendspeed?120/pretendspeed*tk:40*tk)+par->curmiditk,0,pbvi));
}
}
break;
@@ -755,13 +771,14 @@ class ITConverter
if(pbv<-1)pbv=-1;
uint32_t pbvi=int(pbv*8192)+8192;
par->f.tracks[par->minstch[std::make_pair(ch,par->chinst[ch])]].
- eventList.push_back(MidiEvent::pb(40*tk+par->curmiditk,0,pbvi));
+ eventList.push_back(MidiEvent::pb((~pretendspeed?120/pretendspeed*tk:40*tk)+par->curmiditk,0,pbvi));
}
}
}
break;
case 7://porta
{
+ if(disablegxx)break;
if(fxp)
{
par->chefxmem[ch][efx]=fxp;
@@ -800,7 +817,7 @@ class ITConverter
if(pbv<-1)pbv=-1;
uint32_t pbvi=int(pbv*8192)+8192;
par->f.tracks[par->minstch[std::make_pair(ch,par->chinst[ch])]].
- eventList.push_back(MidiEvent::pb(40*tk+par->curmiditk,0,pbvi));
+ eventList.push_back(MidiEvent::pb((~pretendspeed?120/pretendspeed*tk:40*tk)+par->curmiditk,0,pbvi));
}
}
break;
@@ -836,18 +853,19 @@ class ITConverter
if(mask>>0&1)curnote=note;
if(curnote<120)
{
+ uint32_t incr = ~pretendspeed?40/pretendspeed*par->speed:40*par->speed/3;
par->f.tracks[par->minstch[std::make_pair(ch,par->chinst[ch])]].
- eventList.push_back(MidiEvent::noteOff(par->curmiditk+40*par->speed/3,0,curnote));
+ eventList.push_back(MidiEvent::noteOff(par->curmiditk+incr,0,curnote));
par->f.tracks[par->minstch[std::make_pair(ch,par->chinst[ch])]].
- eventList.push_back(MidiEvent::noteOn(par->curmiditk+40*par->speed/3,0,curnote+(fxp>>4),par->chvelm[ch]));
+ eventList.push_back(MidiEvent::noteOn(par->curmiditk+incr,0,curnote+(fxp>>4),par->chvelm[ch]));
par->f.tracks[par->minstch[std::make_pair(ch,par->chinst[ch])]].
- eventList.push_back(MidiEvent::noteOff(par->curmiditk+80*par->speed/3,0,curnote+(fxp>>4)));
+ eventList.push_back(MidiEvent::noteOff(par->curmiditk+incr*2,0,curnote+(fxp>>4)));
par->f.tracks[par->minstch[std::make_pair(ch,par->chinst[ch])]].
- eventList.push_back(MidiEvent::noteOn(par->curmiditk+80*par->speed/3,0,curnote+(fxp&0x0F),par->chvelm[ch]));
+ eventList.push_back(MidiEvent::noteOn(par->curmiditk+incr*2,0,curnote+(fxp&0x0F),par->chvelm[ch]));
par->f.tracks[par->minstch[std::make_pair(ch,par->chinst[ch])]].
- eventList.push_back(MidiEvent::noteOff(par->curmiditk+120*par->speed/3,0,curnote+(fxp&0x0F)));
+ eventList.push_back(MidiEvent::noteOff(par->curmiditk+incr*3,0,curnote+(fxp&0x0F)));
par->f.tracks[par->minstch[std::make_pair(ch,par->chinst[ch])]].
- eventList.push_back(MidiEvent::noteOn(par->curmiditk+120*par->speed/3,0,curnote,par->chvelm[ch]));
+ eventList.push_back(MidiEvent::noteOn(par->curmiditk+incr*3,0,curnote,par->chvelm[ch]));
}
}
break;
@@ -886,12 +904,12 @@ class ITConverter
while (ctk + tspan < par->speed)
{
- eventList.push_back(MidiEvent::noteOff(par->curmiditk+40*ctk,0,curnote));
+ eventList.push_back(MidiEvent::noteOff(par->curmiditk+(~pretendspeed?120/pretendspeed:40)*ctk,0,curnote));
vel = retrigmod[vmod](vel);
- eventList.push_back(MidiEvent::noteOn(par->curmiditk+40*ctk,0,curnote, vel));
+ eventList.push_back(MidiEvent::noteOn(par->curmiditk+(~pretendspeed?120/pretendspeed:40)*ctk,0,curnote, vel));
ctk += tspan;
}
- eventList.push_back(MidiEvent::noteOff(par->curmiditk+40*ctk,0,curnote));
+ eventList.push_back(MidiEvent::noteOff(par->curmiditk+(~pretendspeed?120/pretendspeed:40)*ctk,0,curnote));
}
break;
case 19://Sxx controls
@@ -923,7 +941,7 @@ class ITConverter
if(fxp>0x20)
{
par->tempo=fxp;
- par->f.tracks[0].eventList.push_back(MidiEvent::tempo(par->curmiditk,fxp));
+ par->f.tracks[0].eventList.push_back(MidiEvent::tempo(par->curmiditk,~pretendspeed?1.*fxp*pretendspeed/par->speed:fxp));
}
else
{
@@ -932,13 +950,19 @@ class ITConverter
{
tempop=fxp;
for(int i=1;i<par->speed;++i)
- par->f.tracks[0].eventList.push_back(MidiEvent::tempo(par->curmiditk+i*40,par->tempo+=fxp&0x0F));
+ {
+ par->tempo+=fxp&0x0F;
+ par->f.tracks[0].eventList.push_back(MidiEvent::tempo(par->curmiditk+(~pretendspeed?120/pretendspeed*i:40*i),~pretendspeed?1.*par->tempo*pretendspeed/par->speed:par->tempo));
+ }
}
else if(fxp>0x00)
{
tempop=fxp;
for(int i=1;i<par->speed;++i)
- par->f.tracks[0].eventList.push_back(MidiEvent::tempo(par->curmiditk+i*40,par->tempo-=fxp&0x0F));
+ {
+ par->tempo-=fxp&0x0F;
+ par->f.tracks[0].eventList.push_back(MidiEvent::tempo(par->curmiditk+(~pretendspeed?120/pretendspeed*i:40*i),~pretendspeed?1.*par->tempo*pretendspeed/par->speed:par->tempo));
+ }
}
}
}
@@ -997,7 +1021,7 @@ class ITConverter
printf("instr: %d @ ch %d note %d row %d\n",inst,ch,note,par->currow);
throw std::runtime_error("wtf instrument???");
}
- if(par->chnote[ch]!=255&&note<120&&efx!=7)
+ if(par->chnote[ch]!=255&&note<120&&(efx!=7||disablegxx))
par->f.tracks[par->minstch[std::make_pair(ch,previnst)]].
eventList.push_back(MidiEvent::noteOff(par->curmiditk,0,par->chnote[ch]));
if(note>=120)
@@ -1009,7 +1033,7 @@ class ITConverter
}
else
{
- if(efx!=7)
+ if(efx!=7||disablegxx)
{
par->chnote[ch]=note;par->chage[ch]=0;
par->f.tracks[par->minstch[std::make_pair(ch,par->chinst[ch])]].