Files
Work/guitar/backup/20040302/MIDIHelper.cpp
2024-08-07 09:16:27 -04:00

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&&notes.size())
{
if(createEntry(notes,entry))tabEntries.insert(&entry);
notes.remove();
}
PureNote pureNote(pureEvent.firstData(),pureEvent.secondData());
Note note(pureNote);
notes.insert(&note);
}
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&&notes.size())
{
if(createEntry(notes,entry))tabEntries.insert(&entry);
notes.remove();
}
PureNote pureNote(pureEvent.firstData(),pureEvent.secondData());
Note note(pureNote);
notes.insert(&note);
}
prevPlayTime=currPlayTime;
}
tablature.setTabEntries(tabEntries);
tablature.saveAs(strPathTabFileName);
}// for tracks
return true;
}
bool MIDIHelper::createEntry(Block<Note> &notes,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 &notePath=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> &notes)
{
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;
}