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

142 lines
3.5 KiB
C++

#include <guitar/TabEntry.hpp>
#include <guitar/GlobalDefs.hpp>
#include <guitar/fretboard.hpp>
#include <midiseq/midiout.hpp>
#include <midiseq/ChannelModeMessage.hpp>
TabEntry::TabEntry(const TabEntry &entry)
{
*this=entry;
}
TabEntry &TabEntry::operator=(const TabEntry &entry)
{
remove();
for(int index=0;index<entry.size();index++)insert(&((TabEntry&)entry)[index]);
setNoteType(entry.getNoteType());
return *this;
}
bool TabEntry::operator==(const TabEntry &entry)const
{
if(size()!=entry.size())return false;
for(int index=0;index<size();index++)
{
if(!(((Block<FrettedNote>&)*this).operator[](index)==((TabEntry&)entry)[index]))return false;
}
return true;
}
bool TabEntry::play(MIDIOutputDevice &midiDevice,bool useDelay)const
{
if(!midiDevice.hasDevice())return false;
// midiDevice.midiEvent(ChannelModeMessage(ChannelModeMessage::AllNotesOff).getEvent());
for(int index=0;index<size();index++)
{
((TabEntry&)*this).operator[](index).noteOn(midiDevice);
}
if(false!=useDelay)delay();
// midiDevice.midiEvent(ChannelModeMessage(ChannelModeMessage::AllNotesOff).getEvent());
return true;
}
void TabEntry::delay(void)const
{
int actualDelay=Timing::getDelay(mNoteType);
::Sleep(actualDelay);
}
bool TabEntry::contains(int string) // is there already an entry for string (ie) two notes on same string
{
int entryIndex;
return contains(string,entryIndex);
}
bool TabEntry::contains(int string,int &entryIndex)
{
for(int index=0;index<size();index++)
{
FrettedNote &frettedNote=operator[](index);
if(frettedNote.getString()==string)
{
entryIndex=index;
return true;
}
}
return false;
}
bool TabEntry::addFrettedNote(int string,const FrettedNote &frettedNote)
{
Fretboard fretboard;
FrettedNote newNote(fretboard.getAt(string,frettedNote.getFret()),string,frettedNote.getFret(),frettedNote.getAction());
insert(&newNote);
return true;
}
bool TabEntry::setFrettedNote(int string,const FrettedNote &frettedNote)
{
int entryIndex;
if(!contains(string,entryIndex))return false;
operator[](entryIndex).setFret(frettedNote.getFret());
operator[](entryIndex).setAction(frettedNote.getAction());
return true;
}
bool TabEntry::remove(int string,int fret)
{
int entryIndex;
if(!contains(string,entryIndex))return false;
Block<FrettedNote>::remove(entryIndex);
return true;
}
String TabEntry::toString(void)const
{
String str;
str+="TABENTRY ";
for(int index=0;index<size();index++)
{
str+=((Block<FrettedNote>&)*this).operator[](index).toString();
if(index<size()-1)str+=",";
}
str+=String(" Timing=")+mNoteType.toString();
return str;
}
bool TabEntry::fromString(String strText)
{
Fretboard fretboard;
char *ptr=strText.str();
if(strText.isNull()||!(String("TABENTRY")==strText.betweenString(0,' ')))return false;
ptr=::strtok(ptr,"[\0");
ptr=::strtok(0,"[\0");
while(true)
{
FrettedNote frettedNote;
GlobalDefs::outDebug(ptr);
String strItem=ptr;
frettedNote.setString(strItem.betweenString('=',' ').toInt());
frettedNote.setFret(strItem.betweenString('=',0).betweenString('=',' ').toInt());
frettedNote.setNote(fretboard.getAt(frettedNote.getString(),frettedNote.getFret()));
frettedNote.setAction(Action().fromString(strItem.betweenString('=',0).
betweenString('=',0).betweenString('=',0).betweenString('=',']')));
insert(&frettedNote);
ptr=::strtok(0,"[\0");
if(!ptr)break;
}
return false;
}
bool TabEntry::fromChord(const Music::Chord &chord)
{
Fretboard fretboard;
remove();
if(!fretboard.getAt(chord,*this))return false;
return true;
}