diff options
Diffstat (limited to 'music')
-rw-r--r-- | music/it2midi.cpp | 36 |
1 files changed, 21 insertions, 15 deletions
diff --git a/music/it2midi.cpp b/music/it2midi.cpp index 09bd861..5bebc3d 100644 --- a/music/it2midi.cpp +++ b/music/it2midi.cpp @@ -79,7 +79,8 @@ #include <vector> const int debuggxx=0; const int disablegxx=0; -const int pretendspeed=-1;//set to 3 to force standarized speed +const int pretendspeed=6;//set to 3 to force standarized speed, -1 to disable +const int pretendswing=-1;//set to non -1 value to force a swing speed value in timing calculations (e.g. set to 5 for modules with A02/A03 swing). we don't support changing it midways in this version const char* IMPHdr="IMPM"; uint16_t readSW(FILE* f) { @@ -443,6 +444,11 @@ struct MidiEvent time=_t;type=_tp;p1=_p1;p2=_p2; if(s)str=std::string(s);else str=""; } + MidiEvent(uint32_t _t,uint32_t _tp,uint32_t _p1,uint32_t _p2,std::string s) + { + time=_t;type=_tp;p1=_p1;p2=_p2; + str=s; + } static MidiEvent noteOff(uint32_t t,uint32_t ch,uint32_t note,uint32_t vel=0x40) { if(vel==0x40)return MidiEvent(t,0x90|ch,note,0); @@ -470,13 +476,13 @@ struct MidiEvent int us=60000000./tmpo; char c[4]; c[0]=us>>16&0xFF;c[1]=us>>8&0xFF;c[2]=us&0xFF;c[3]=0; - return MidiEvent(t,0xFF,0x51,0x03,c); + return MidiEvent(t,0xFF,0x51,0x03,std::string(c, 4)); } static MidiEvent tsig(uint32_t t,uint32_t n,uint32_t pot_d) { char c[5]; c[0]=n;c[1]=pot_d;c[2]=24;c[3]=8;c[4]=0; - return MidiEvent(t,0xFF,0x58,0x04,c); + return MidiEvent(t,0xFF,0x58,0x04,std::string(c, 5)); } static MidiEvent trkname(uint32_t t,const char* s) { @@ -651,7 +657,7 @@ class ITConverter if(ch==0xFF) { ++par->currow; - par->curmiditk+=~pretendspeed?40*pretendspeed:40*par->speed; + par->curmiditk+=~pretendspeed?pretendspeed*(~pretendswing?40.*par->speed/pretendswing:40):40*par->speed; for(uint8_t i=0;i<64;++i) if(par->chnote[i]!=255) { @@ -748,7 +754,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((~pretendspeed?120/pretendspeed*tk:40*tk)+par->curmiditk,0,pbvi)); + eventList.push_back(MidiEvent::pb((~pretendspeed?(~pretendswing?40.*par->speed/pretendswing:40)*pretendspeed/par->speed*tk:40*tk)+par->curmiditk,0,pbvi)); } } break; @@ -771,7 +777,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((~pretendspeed?120/pretendspeed*tk:40*tk)+par->curmiditk,0,pbvi)); + eventList.push_back(MidiEvent::pb((~pretendspeed?(~pretendswing?40.*par->speed/pretendswing:40)*pretendspeed/par->speed*tk:40*tk)+par->curmiditk,0,pbvi)); } } } @@ -817,7 +823,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((~pretendspeed?120/pretendspeed*tk:40*tk)+par->curmiditk,0,pbvi)); + eventList.push_back(MidiEvent::pb((~pretendspeed?(~pretendswing?40.*par->speed/pretendswing:40)*pretendspeed/par->speed*tk:40*tk)+par->curmiditk,0,pbvi)); } } break; @@ -853,7 +859,7 @@ class ITConverter if(mask>>0&1)curnote=note; if(curnote<120) { - uint32_t incr = ~pretendspeed?40/pretendspeed*par->speed:40*par->speed/3; + uint32_t incr = ~pretendspeed?(~pretendswing?40.*par->speed/pretendswing:40)*pretendspeed/3:40*par->speed/3; par->f.tracks[par->minstch[std::make_pair(ch,par->chinst[ch])]]. eventList.push_back(MidiEvent::noteOff(par->curmiditk+incr,0,curnote)); par->f.tracks[par->minstch[std::make_pair(ch,par->chinst[ch])]]. @@ -904,12 +910,12 @@ class ITConverter while (ctk + tspan < par->speed) { - eventList.push_back(MidiEvent::noteOff(par->curmiditk+(~pretendspeed?120/pretendspeed:40)*ctk,0,curnote)); + eventList.push_back(MidiEvent::noteOff(par->curmiditk+(~pretendspeed?(~pretendswing?40.*par->speed/pretendswing:40)*pretendspeed/par->speed:40)*ctk,0,curnote)); vel = retrigmod[vmod](vel); - eventList.push_back(MidiEvent::noteOn(par->curmiditk+(~pretendspeed?120/pretendspeed:40)*ctk,0,curnote, vel)); + eventList.push_back(MidiEvent::noteOn(par->curmiditk+(~pretendspeed?(~pretendswing?40.*par->speed/pretendswing:40)*pretendspeed/par->speed:40)*ctk,0,curnote, vel)); ctk += tspan; } - eventList.push_back(MidiEvent::noteOff(par->curmiditk+(~pretendspeed?120/pretendspeed:40)*ctk,0,curnote)); + eventList.push_back(MidiEvent::noteOff(par->curmiditk+(~pretendspeed?(~pretendswing?40.*par->speed/pretendswing:40)*pretendspeed/par->speed:40)*ctk,0,curnote)); } break; case 19://Sxx controls @@ -941,7 +947,7 @@ class ITConverter if(fxp>0x20) { par->tempo=fxp; - par->f.tracks[0].eventList.push_back(MidiEvent::tempo(par->curmiditk,~pretendspeed?1.*fxp*pretendspeed/par->speed:fxp)); + par->f.tracks[0].eventList.push_back(MidiEvent::tempo(par->curmiditk,~pretendspeed?1.*fxp*pretendspeed/(~pretendswing?pretendswing:par->speed):fxp)); } else { @@ -952,7 +958,7 @@ class ITConverter for(int i=1;i<par->speed;++i) { 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)); + par->f.tracks[0].eventList.push_back(MidiEvent::tempo(par->curmiditk+(~pretendspeed?(~pretendswing?40.*par->speed/pretendswing:40)*pretendspeed/par->speed*i:40*i),~pretendspeed?1.*par->tempo*pretendspeed/(~pretendswing?pretendswing:par->speed):par->tempo)); } } else if(fxp>0x00) @@ -961,7 +967,7 @@ class ITConverter for(int i=1;i<par->speed;++i) { 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)); + par->f.tracks[0].eventList.push_back(MidiEvent::tempo(par->curmiditk+(~pretendspeed?(~pretendswing?40.*par->speed/pretendswing:40)*pretendspeed/par->speed*i:40*i),~pretendspeed?1.*par->tempo*pretendspeed/(~pretendswing?pretendswing:par->speed):par->tempo)); } } } @@ -1079,7 +1085,7 @@ class ITConverter } f.tracks[0].eventList.push_back(MidiEvent::trkname(0,c.title.c_str())); f.tracks[0].eventList.push_back(MidiEvent::tsig(0,1,2)); - f.tracks[0].eventList.push_back(MidiEvent::tempo(0,tempo)); + f.tracks[0].eventList.push_back(MidiEvent::tempo(0,~pretendspeed?tempo/(~pretendswing?pretendswing:speed)*pretendspeed:tempo)); ITCellActionConv* cac=new ITCellActionConv(this); p=new ITPlayer(c,cac); for(int i=0;i<64;++i)//turn off any remaining notes |