From cd55d53d3b7abee5dea885e310857651a9263b0b Mon Sep 17 00:00:00 2001 From: Chris Xiong Date: Tue, 10 Jun 2025 19:00:55 -0400 Subject: thought I was done with this. --- music/it2midi.cpp | 64 ++++++++++++++++++++++++++++++++++++++----------------- 1 file 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 #include 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 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;if); long pos=ftell(c->f); lastval.resize(64); + if(!c->ppat[p]) + { + for(size_t i=0;if)-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;ispeed;++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;ispeed;++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&¬e<120&&efx!=7) + if(par->chnote[ch]!=255&¬e<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])]]. -- cgit v1.2.3