170 lines
4.6 KiB
C++
170 lines
4.6 KiB
C++
#include <guitar/MIDIHelper.hpp>
|
|
#include <guitar/tablature.hpp>
|
|
#include <guitar/notepath.hpp>
|
|
#include <guitar/requirements.hpp>
|
|
#include <midiseq/mididata.hpp>
|
|
#include <common/profile.hpp>
|
|
#include <common/purewrd.hpp>
|
|
|
|
bool MIDIHelper::getTrackInfo(const String &strPathMIDIFileName,TrackInfos &trackInfos)
|
|
{
|
|
MidiData midiData(strPathMIDIFileName);
|
|
midiData.getTrackInfo(trackInfos);
|
|
return trackInfos.size()?true:false;
|
|
}
|
|
|
|
bool MIDIHelper::import(const String &strPathMidiFileName,const String &strPathTabFileName,int selectedTrack)
|
|
{
|
|
TabEntry entry;
|
|
Tablature tablature;
|
|
TabEntries tabEntries;
|
|
|
|
WORD currPlayTime;
|
|
WORD prevPlayTime;
|
|
int eventCount;
|
|
bool resultCode;
|
|
bool haveTrack;
|
|
Block<Note> notes;
|
|
TrackInfos trackInfos;
|
|
|
|
resultCode=false;
|
|
haveTrack=false;
|
|
if(strPathMidiFileName.isNull())return resultCode;
|
|
mMessages.remove();
|
|
MidiData midiData(strPathMidiFileName);
|
|
|
|
midiData.getTrackInfo(trackInfos);
|
|
if(!trackInfos.size())return false;
|
|
|
|
for(int trIndex=0;trIndex<trackInfos.size();trIndex++)
|
|
{
|
|
if(trackInfos[trIndex].getTrackNo()==selectedTrack&&trackInfos[trIndex].getEventCount())
|
|
{
|
|
haveTrack=true;
|
|
eventCount=trackInfos[trIndex].getEventCount();
|
|
break;
|
|
}
|
|
}
|
|
if(!haveTrack)return resultCode;
|
|
currPlayTime=0;
|
|
prevPlayTime=0;
|
|
resultCode=true;
|
|
for(int index=0;index<eventCount;index++)
|
|
{
|
|
PureEvent &pureEvent=midiData.getEventAt(selectedTrack,index);
|
|
currPlayTime=pureEvent.playTime();
|
|
if(!index)prevPlayTime=currPlayTime;
|
|
if(MIDINoteOn==(pureEvent.eventType()&0xF0))
|
|
{
|
|
if(currPlayTime!=prevPlayTime&¬es.size())
|
|
{
|
|
if(createEntry(notes,entry))tabEntries.insert(&entry);
|
|
notes.remove();
|
|
}
|
|
PureNote pureNote(pureEvent.firstData(),pureEvent.secondData());
|
|
Note note(pureNote);
|
|
notes.insert(¬e);
|
|
}
|
|
prevPlayTime=currPlayTime;
|
|
}
|
|
tablature.setTabEntries(tabEntries);
|
|
tablature.saveAs(strPathTabFileName);
|
|
return resultCode;
|
|
}
|
|
|
|
bool MIDIHelper::import(const String &strPathMidiFileName,Block<String> &strPathTabFileNames)
|
|
{
|
|
String strPathTabFileName;
|
|
WORD currPlayTime;
|
|
WORD prevPlayTime;
|
|
int currentTrack;
|
|
int eventCount;
|
|
Block<PureWORD> tracks;
|
|
Block<Note> notes;
|
|
TrackInfos trackInfos;
|
|
|
|
if(strPathMidiFileName.isNull())return false;
|
|
strPathTabFileNames.remove();
|
|
mMessages.remove();
|
|
MidiData midiData(strPathMidiFileName);
|
|
midiData.makeRealTime();
|
|
|
|
midiData.getTrackInfo(trackInfos);
|
|
if(!trackInfos.size())return false;
|
|
if(!tracks.size())return false;
|
|
for(int trIndex=0;trIndex<tracks.size();trIndex++)
|
|
{
|
|
TabEntry entry;
|
|
Tablature tablature;
|
|
TabEntries tabEntries;
|
|
|
|
currPlayTime=0;
|
|
prevPlayTime=0;
|
|
currentTrack=trackInfos[trIndex].getTrackNo();
|
|
eventCount=trackInfos[trIndex].getEventCount();
|
|
strPathTabFileName=Profile::removeExtension(strPathMidiFileName)+String("_TRK")+String().fromInt(trIndex+1)+String("_")+String(".tab");
|
|
strPathTabFileNames.insert(&strPathTabFileName);
|
|
for(int index=0;index<eventCount;index++)
|
|
{
|
|
PureEvent &pureEvent=midiData.getEventAt(currentTrack,index);
|
|
|
|
currPlayTime=pureEvent.playTime();
|
|
if(!index)prevPlayTime=currPlayTime;
|
|
|
|
if(MIDINoteOn==(pureEvent.eventType()&0xF0))
|
|
{
|
|
if(currPlayTime!=prevPlayTime&¬es.size())
|
|
{
|
|
if(createEntry(notes,entry))tabEntries.insert(&entry);
|
|
notes.remove();
|
|
}
|
|
PureNote pureNote(pureEvent.firstData(),pureEvent.secondData());
|
|
Note note(pureNote);
|
|
notes.insert(¬e);
|
|
}
|
|
prevPlayTime=currPlayTime;
|
|
}
|
|
tablature.setTabEntries(tabEntries);
|
|
tablature.saveAs(strPathTabFileName);
|
|
}// for tracks
|
|
return true;
|
|
}
|
|
|
|
bool MIDIHelper::createEntry(Block<Note> ¬es,TabEntry &entry)
|
|
{
|
|
NotePaths notePaths;
|
|
Requirements requirements;
|
|
|
|
if(!notes.size())return false;
|
|
if(!filterNotesOnFretboard(notes))return false;
|
|
requirements.setRequirements(notes);
|
|
notePaths.size(notes.size());
|
|
for(int pathIndex=0;pathIndex<notePaths.size();pathIndex++)
|
|
{
|
|
NotePath ¬ePath=notePaths[pathIndex];
|
|
mFretboard.getAt(notes[pathIndex],notePath);
|
|
}
|
|
requirements.satisfyRequirements(notePaths);
|
|
entry.remove();
|
|
for(int index=0;index<requirements.size();index++)
|
|
{
|
|
Requirement &requirement=requirements[index];
|
|
if(requirement.getSatisfied())entry.insert(&requirement);
|
|
}
|
|
return entry.size()?true:false;
|
|
}
|
|
|
|
bool MIDIHelper::filterNotesOnFretboard(Block<Note> ¬es)
|
|
{
|
|
for(int noteIndex=0;noteIndex<notes.size();noteIndex++)
|
|
{
|
|
if(!mFretboard.isOnFretboard(notes[noteIndex]))
|
|
{
|
|
mMessages.insert(&String(String("Note is not on the fretboard ")+notes[noteIndex].toString()));
|
|
notes.remove(noteIndex);
|
|
noteIndex--;
|
|
}
|
|
}
|
|
return notes.size()?true:false;
|
|
}
|