#ifndef _GUITAR_FRETBOARD_HPP_ #define _GUITAR_FRETBOARD_HPP_ #ifndef _GUITAR_TUNING_HPP_ #include #endif #ifndef _COMMON_ARRAY_HPP_ #include #endif #ifndef _MUSIC_NOTES_HPP_ #include #endif #ifndef _MUSIC_CHORD_HPP_ #include #endif #ifndef _GUITAR_FRETTEDNOTE_HPP_ #include #endif // |-5- // |-4- // |-3- // |-2- // |-1- // |-0- class MIDIOutputDevice; class Fretboard : public Array { public: enum{Frets=24,Strings=6}; Fretboard(const Tuning &tuning=Tuning(),int frets=Frets); virtual ~Fretboard(); void createFretboard(const Tuning &tuning,int frets=Frets); const Tuning &getTuning(); void setTuning(const Tuning &tuning); const Note &getAt(int string,int fret); bool getAt(const Music::Chord &chord,Block &frettedNotes); bool getAt(const Note ¬e,FrettedNote &frettedNote); bool getAt(const Note ¬e,Block &frettedNotes); int getFrets(void)const; void setFrets(int frets); bool isOnFretboard(const Note ¬e); bool play(MIDIOutputDevice &device); String toString(void)const; static bool isValidFret(int fret); private: void createFretboard(); bool getAt(const Note ¬e,FrettedNote &frettedNote,Block &containedNotes); bool contains(const FrettedNote &frettedNote,Block &frettedNotes); bool getFillerNotes(int fret,const Music::Chord &chord,Block &frettedNotes); int distance(const FrettedNote &frettedNote,Block &frettedNotes); bool isIn(const FrettedNote &frettedNote,const Music::Chord &chord); Tuning mTuning; int mFrets; }; inline Fretboard::Fretboard(const Tuning &tuning,int frets) : mTuning(tuning),mFrets(frets) { createFretboard(); } inline Fretboard::~Fretboard() { } inline const Tuning &Fretboard::getTuning() { return mTuning; } inline void Fretboard::setTuning(const Tuning &tuning) { mTuning=tuning; createFretboard(); } inline int Fretboard::getFrets(void)const { return mFrets; } inline void Fretboard::setFrets(int frets) { mFrets=frets; createFretboard(); } inline const Note &Fretboard::getAt(int string,int fret) { return (operator[](string)).operator[](fret); } inline bool Fretboard::isValidFret(int fret) { if(fret<=Fretboard::Frets)return true; return false; } #endif