aboutsummaryrefslogtreecommitdiff
path: root/music
diff options
context:
space:
mode:
Diffstat (limited to 'music')
-rw-r--r--music/it2midi.cpp36
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