Initial
This commit is contained in:
169
guitar/MIDIHelper.cpp
Normal file
169
guitar/MIDIHelper.cpp
Normal file
@@ -0,0 +1,169 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user