diff --git a/Music/Beginner Course/ChordOfCMajor.abc b/Music/Beginner Course/ChordOfCMajor.abc new file mode 100644 index 0000000..845ad95 --- /dev/null +++ b/Music/Beginner Course/ChordOfCMajor.abc @@ -0,0 +1,21 @@ +X:1 +T:Welcome to C Major Chord +M:4/4 +L:1/4 +K:Cmaj +V: RH1 clef=treble +%%MIDI channel 4 +%%MIDI program 1 4 +%%MIDI gchordoff +V: LH1 clef=bass +%%MIDI channel 3 +%%MIDI program 1 3 +%%MIDI gchordoff +% +[V: RH1] | CCCC | EEEE | GGGG | EEEE | C4 +[V: LH1] | z4 | z4 | z4 | z4 | z4 +[V: RH1] | CCCC | EEEE | GGGG | EEEE | C4 +[V: LH1] | z4 | z4 | z4 | z4 | z4 +[V: RH1] | [C4E4G4] | +[V: LH1] | z4 | +% diff --git a/Music/Beginner Course/ChordOfCMajor.mma b/Music/Beginner Course/ChordOfCMajor.mma new file mode 100644 index 0000000..fe3e08a --- /dev/null +++ b/Music/Beginner Course/ChordOfCMajor.mma @@ -0,0 +1,99 @@ +SeqClear +SeqSize 1 +Time 4 +Timesig 4 4 + +Begin Plectrum-Guitar + Voice NylonGuitar + Octave 4 + Volume m +// Tuning e-- a-- d- g- b- e // A guitar +// Tuning g-- d- a- e // A four string tenor Banjo +// Capo 0 // The fret number of the capo + Sequence { \ + 1.0 0 - 100 - - 90 -; \ + 1.5 0 - - - 90 - -; \ + 2.0 0 - - 90 - 90 -; \ + 2.5 0 - - - 90 - -; \ + 3.0 0 - - - - - 90; \ + 3.5 0 - - - - 90 -; \ + 4.0 0 - - - 90 - -; \ + 4.5 0 - - 90 - - -; \ + } +End + + +Begin Drum-HH + Tone ClosedHiHat + Sequence {1 4 80; 2 4 90; 3 4 90; 4 4 90} +End + + + +DefGroove PlectrumFingerPicking + + + + +SeqClear +SeqSize 1 +Time 4 +Timesig 4 4 + + +Begin Plectrum-Guitar + Voice NylonGuitar + Octave 4 + Volume m + Sequence { \ + 1.0 +5 80 80 80 80 80 80; \ + 2.0 +5 80 80 80 80 80 80; \ + 3.0 +5 80 80 80 80 80 80; \ + 4.0 +5 80 80 80 80 80 80; \ + } +End + + +Begin Drum-HH + Tone ClosedHiHat + Sequence {1 4 90; 2 4 90; 3 4 90; 4 4 90} +End + + + +DefGroove PlectrumStrum + +Begin Solo-Right + Voice Piano1 + Channel 4 +End +Begin Solo-Left + Voice Piano1 + Channel 3 +End + + +Tempo 90 +Timesig 4 4 + +Groove Metronome4 + +z +midiInc file=ChordOfCMajor.solo.mid Solo-Left=3 Solo-Right=4 Volume=100 + +Groove PlectrumFingerPicking +C +Am:5 +G:8 +Am:5 +Groove PlectrumStrum +C +Groove PlectrumFingerPicking +C +Am:5 +G:8 +Am:5 +Groove PlectrumStrum +C +C z! z! z! + diff --git a/Music/Booster Music/AmazingGrace.mma b/Music/Booster Music/AmazingGrace.mma new file mode 100644 index 0000000..2dbe3ee --- /dev/null +++ b/Music/Booster Music/AmazingGrace.mma @@ -0,0 +1,70 @@ +// Musical MIDI Accompaniment file for the Piano Booster project +// For more information see: www.pianobooster.sourceforge.net +// Creative Commons license + +MidiTName Amazing Grace + +Begin Solo-Right + Voice Piano1 + Channel 4 +End + +Begin Solo-Left + Voice Piano1 + Channel 3 +End + +Tempo 87 +Groove Metronome3 +z + +Groove countrywaltz2 + +Beatadjust 2 +midiInc file=AmazingGraceMid.solo.mid Solo-Right=4 Solo-Left=3 Volume=80 +Beatadjust -2 + +1 z + +Repeat + +2 F +3 F +4 Bb +5 F +6 F +7 F +8 C7 +9 C7 +10 F +11 F7 +12 Bb +13 F +14 F +15 C7 +RepeatEnding + +16 F +17 F + +Groove CountrywaltzIntro +20 Bb +21 C +22 F +23 F / z + +Groove CountryWaltz1Sus + +RepeatEnd + +Groove CountryWaltzEnd +16 F +17 F + +Tempo 77 + +18 Bb C F +19 F + +cut -1 + diff --git a/Music/Booster Music/AmazingGraceMid.abc b/Music/Booster Music/AmazingGraceMid.abc new file mode 100644 index 0000000..2f88058 --- /dev/null +++ b/Music/Booster Music/AmazingGraceMid.abc @@ -0,0 +1,34 @@ +X: 1 +T: Amazing Grace +Q: "English Waltz " 87 +C: Traditional +M: 3/4 % time signature +L: 1/4 % default length +%%staves {RH LH} +V: 1 clef=treble +%%MIDI channel 4 +%%MIDI program 1 4 +%%MIDI gchordoff +% +V: 2 clef=bass +%%MIDI channel 3 +%%MIDI program 1 3 +%%MIDI gchordoff +% +K: F % key signature +% +V: 1 +z2 C/F/ |: F2 A/F/ | A2 G | F2 D | +C2 C/F/ | F2 A/G/ | A2 c | c3 | +-c2 A/c/ | c2 A/F/ | A2 G | F2 D | +C2 C/F/ | F2 A/F/ | A2 G |[1 F3 | +-F2 z | z3 | z3 | z3 | +z2 C/F/ :|2 F3 | -F2 |] +% +V: 2 +z3 |: F,,3 | F,3 | B,,3 | +F,3 | F,,3 | F,3 | C,3 | +-C,3 | F,,3 | F,3 | B,,3 | +F,,3 | F,3 | C,3 |[1 F,,3 | +-F,,3 | B,,3 | C,3 | F,3 | +F,,3 :|2 F,,3 | -F,,2 |] diff --git a/Music/Booster Music/AmazingGracePs.abc b/Music/Booster Music/AmazingGracePs.abc new file mode 100644 index 0000000..3fe4f39 --- /dev/null +++ b/Music/Booster Music/AmazingGracePs.abc @@ -0,0 +1,34 @@ +X: 1 +T: Amazing Grace +Q: "English Waltz " 87 +C: Traditional +M: 3/4 % time signature +L: 1/4 % default length +%%staves {RH LH} +V: RH clef=treble +%%MIDI channel 4 +%%MIDI program 1 4 % Klavier +%%MIDI gchordoff +% +V: LH clef=bass +%%MIDI channel 3 +%%MIDI program 1 3 % Klavier +%%MIDI gchordoff +% +K: F % key signature +% +[V: RH] z2 +1+C/+3+F/ |: "F"F2 A/F/ | A2 G | +w: A_ma-zing_ grace, how +[V: LH] z3 |: +1+F,,3 | +5+F,3 | +% +[V: RH] "Bb"F2 +2+D | "F"C2 C/+2+F/ | +1+F2 A/G/ | A2 c | "C7"(c3 | +w: sweet the sound that_ saved a_ wretch like me! +[V: LH] +3+B,,3 | +5+F,3 | +1+F,,3 | +5+F,3 | +4+(C,3 | +% +[V: RH] c2) A/c/ | "F"c2 A/F/ | "F7"+5+A2 G | "Bb"F2 +2+D | +w: _ I_ once was_ lost, but now I'm +[V: LH] C,3) | +1+F,,3 | +5+F,3 | +3+B,,3 | +% +[V: RH] "F"C2 C/+3+F/ | F2 A/F/ | "C7"A2 G |[1 "F"(F3 | F2) +1+C/+3+F/ :|2 "F"(F3 | F2) |] +w: found, Was_ blind, but_ now I see._ * * * * +[V: LH] +1+F,,3 | +5+F,3 | +3+C,3 |[1 +1+(F,,3 | F,,3) :|2 +1+(F,,3 | F,,2) |] diff --git a/Music/Booster Music/ClairDeLaLune.abc b/Music/Booster Music/ClairDeLaLune.abc new file mode 100644 index 0000000..393a997 --- /dev/null +++ b/Music/Booster Music/ClairDeLaLune.abc @@ -0,0 +1,19 @@ +X: 4 +T: Easy Clair De La Lune +M:4/4 +L:1/4 +K:Cmaj +V: RH1 clef=treble +%%MIDI channel 4 +%%MIDI program 1 4 +%%MIDI gchordoff +V: LH1 clef=bass +%%MIDI channel 3 +%%MIDI program 1 3 +%%MIDI gchordoff +% +[V: RH1] CCCD | E2D2 | CEDD | C4 | +[V: RH1] CCCD | E2D2 | CEDD | C4 | +[V: RH1] DDDD | E2E2 | EEDD | C4 | +[V: RH1] CCCD | E2D2 | CEDD | C4 | +% diff --git a/Music/Booster Music/ClairDeLaLune.mma b/Music/Booster Music/ClairDeLaLune.mma new file mode 100644 index 0000000..9b2e7d1 --- /dev/null +++ b/Music/Booster Music/ClairDeLaLune.mma @@ -0,0 +1,112 @@ +// Musical MIDI Accompaniment file for the Piano Booster project +// For more information see: www.pianobooster.sourceforge.net +// Creative Commons license + +MidiTName Easy Clair De La Lune + +SeqClear +SeqSize 1 +Time 4 +Timesig 4 4 + +Begin Plectrum-Guitar + Voice NylonGuitar + Octave 4 + Volume m +// Tuning e-- a-- d- g- b- e // A guitar +// Tuning g-- d- a- e // A four string tenor Banjo +// Capo 0 // The fret number of the capo + Sequence { + 1.0 0 5:100 2:80; // On the 1st beat pluck strings 5 + 2 + 1.5 0 3:80; // pluck string number 3 with a velocity of 80 + 2.0 0 4:90 2:80; // The 2nd beat of the bar pluck strings 4 + 2 + 2.5 0 3:80; + 3.0 0 1:80; + 3.5 0 2:80; + 4.0 0 3:80; + 4.5 0 4:80; + } +End + + +Begin Drum-HH + Tone ClosedHiHat + Sequence {1 4 80; 2 4 90; 3 4 90; 4 4 90} +End + + + +DefGroove PlectrumFingerPicking + + + + +SeqClear +SeqSize 1 +Time 4 +Timesig 4 4 + + +Begin Plectrum-Guitar + Voice NylonGuitar + Octave 4 + Volume m + Sequence { + 1.0 +5 80; + 2.0 +5 80; + 3.0 +5 80; + 4.0 +5 80; + } +End + + +Begin Drum-HH + Tone ClosedHiHat + Sequence {1 4 90; 2 4 90; 3 4 90; 4 4 90} +End + + + +DefGroove PlectrumStrum + +Begin Solo-Right + Voice Piano1 + Channel 4 +End +Begin Solo-Left + Voice Piano1 + Channel 3 +End + + +Tempo 90 +Timesig 4 4 + +Groove Metronome4 + +z +midiInc file=ClairDeLaLune.solo.mid Solo-Left=3 Solo-Right=4 Volume=100 + +Groove PlectrumFingerPicking +//Groove PlectrumStrum +C / / G +C / G7 / +Am / G7 / +C + +C / / G +C / G7 / +Am / G7 / +C + +Dm +C +Em / Dm / +C + +C / / G +C / G7 / +Am / G7 / +C + +C z! z! z! diff --git a/Music/Booster Music/FrereJacques.abc b/Music/Booster Music/FrereJacques.abc new file mode 100644 index 0000000..1c59250 --- /dev/null +++ b/Music/Booster Music/FrereJacques.abc @@ -0,0 +1,19 @@ +X:1 +T:Frere Jacques/Brother John +M:4/4 +L:1/4 +K:Cmaj +V: RH1 clef=treble +%%MIDI channel 4 +%%MIDI program 1 4 +%%MIDI gchordoff +V: LH1 clef=bass +%%MIDI channel 3 +%%MIDI program 1 3 +%%MIDI gchordoff +% +[V: RH1] |: CDEC | CDEC | EFG2 | EFG2 | +[V: LH1] |: E,4 | E,4 | C,4 | C,4 | +[V: RH1] G/2A/2G/2F/2 EC | G/2A/2G/2F/2 EC | Cz C2 | Cz C2 :| +[V: LH1] E,4 | E,4 | zG,z2 | zG,z2 :| +% diff --git a/Music/Booster Music/FrereJacques.mma b/Music/Booster Music/FrereJacques.mma new file mode 100644 index 0000000..a5e6a3f --- /dev/null +++ b/Music/Booster Music/FrereJacques.mma @@ -0,0 +1,110 @@ +// Musical MIDI Accompaniment file for the Piano Booster project +// For more information see: www.pianobooster.sourceforge.net +// Creative Commons license + +MidiTName Frere Jacques/Brother John +SeqClear +SeqSize 1 +Time 4 +Timesig 4 4 + +Begin Plectrum-Guitar + Voice NylonGuitar + Octave 4 + Volume m +// Tuning e-- a-- d- g- b- e // A guitar +// Tuning g-- d- a- e // A four string tenor Banjo +// Capo 0 // The fret number of the capo + Sequence { + 1.0 0 5:100 2:80; // On the 1st beat pluck strings 5 + 2 + 1.5 0 3:80; // pluck string number 3 with a velocity of 80 + 2.0 0 4:90 2:80; // The 2nd beat of the bar pluck strings 4 + 2 + 2.5 0 3:80; + 3.0 0 1:80; + 3.5 0 2:80; + 4.0 0 3:80; + 4.5 0 4:80; + } +End + + +Begin Drum-HH + Tone ClosedHiHat + Sequence {1 4 80; 2 4 90; 3 4 90; 4 4 90} +End + + + +DefGroove PlectrumFingerPicking + + + + +SeqClear +SeqSize 1 +Time 4 +Timesig 4 4 + + +Begin Plectrum-Guitar + Voice NylonGuitar + Octave 4 + Volume m + Sequence { \ + 1.0 +5 80 80 80 80 80 80; \ + 2.0 +5 80 80 80 80 80 80; \ + 3.0 +5 80 80 80 80 80 80; \ + 4.0 +5 80 80 80 80 80 80; \ + } +End + + +Begin Drum-HH + Tone ClosedHiHat + Sequence {1 4 90; 2 4 90; 3 4 90; 4 4 90} +End + + + +DefGroove PlectrumStrum + +Begin Solo-Right + Voice Piano1 + Channel 4 +End +Begin Solo-Left + Voice Piano1 + Channel 3 +End + + +Tempo 90 +Timesig 4 4 + +Groove Metronome4 + +z +midiInc file=FrereJacques.solo.mid Solo-Left=3 Solo-Right=4 Volume=100 + +Groove PlectrumFingerPicking +C +C +C +C +C +C +Groove PlectrumStrum +C G C z +C G C z +Groove PlectrumFingerPicking +C +C +C +C +C +C +Groove PlectrumStrum +C G C z +C G C z + + diff --git a/Music/Booster Music/Greensleeves.abc b/Music/Booster Music/Greensleeves.abc new file mode 100755 index 0000000..fa10398 --- /dev/null +++ b/Music/Booster Music/Greensleeves.abc @@ -0,0 +1,37 @@ + +X:1 +T:Greensleeves +M:3/4 +L:1/4 +Q: "Allegro" 1/4 = 130 % tempo +K:G +%%staves {RH1 LH1} +V: RH1 clef=treble name="Piano" +%%MIDI channel 4 +%%MIDI program 1 4 +%%MIDI gchordoff +V: LH1 clef=bass +%%MIDI channel 3 +%%MIDI program 1 3 +%%MIDI gchordoff +% +[V: RH1] z2E |: "Em"G2A | BcB | "D"A2F | DEF | +w: A las, my love, _ you do me wrong _ To +[V: LH1] z3 |: E,3 | D,3 | D,3 | F,3 | +[V: RH1] "Em"G2E | E^DE | "B"F2^D | B,2E | "Em"G2A | B c B | +w: cast me off _ dis-court-eous-ly, For I have loved_ you +[V: LH1] E,3 | B,,3 | B,,3 | ^D,3 | B,,3 | B,,3 | +[V: RH1] "D"A2F | DEF | "Em"GFE | "B7"^D^CD | "Em"E2E | E2z | +w: so_ long,_ De-light_ing in_your com-pa-ny. +[V: LH1] D,3 | B,,3| B,,3 | B,,3 | B,,3 | E,3 | +[V: RH1] "G"d3 | d^cB | "D"A2F | DEF | "Em"G2E | E^DE | +w: Green-sleeves* was all my joy,__ Green*-sleeves was +[V: LH1] G,3 | D,3 | D,3 | F,3 | E,3 | B,,3 | +[V: RH1] "B"F2^D | B,2z | "G"d3 | d^cB | "D"A2F | DEF | +w: my de-light, Green-sleeves, was my heart of gold,_ And +[V: LH1] B,,3 | ^D,3 | G,3 | D,3 | D,3 | F,3 | +[V: RH1] "Em"GFE | "B7"^D^CD | "Em"E3 |[1 E2 E :|2 E3 |] +w: who but my la_dy Green-sleeves. +[V: LH1] E,3 | F,3 | E,3 |[1 B,,3 :|2 B,,3|] +% + diff --git a/Music/Booster Music/Greensleeves.mma b/Music/Booster Music/Greensleeves.mma new file mode 100755 index 0000000..a50af47 --- /dev/null +++ b/Music/Booster Music/Greensleeves.mma @@ -0,0 +1,128 @@ +// Musical MIDI Accompaniment file for the Piano Booster project +// For more information see: www.pianobooster.sourceforge.net +// Creative Commons license +MidiTName Greensleeves + +//KeySig E Minor +KeySig G Major +TimeSig 3 4 +Tempo 115 + +Groove Metronome3 +z! +z + +//Solo Channel 4 // the Right hand piano sound +//Melody Channel 3 // the Left hand piano track + +// create 2 tracks for the left/right piano in the greensleeves midi track +// Note: this is changing the voicing!! Example only!!! + +Begin Solo-right + Voice Piano1 + Channel 4 +End + +Begin Solo-Left + Voice Piano1 + Channel 3 +End + +Begin Solo-RightDoubleUp + Voice JazzGuitar + Channel 5 +End + +Begin Solo-LeftDoubleUp + Voice JazzGuitar + Channel 6 +End + + +/// The include file has several tracks. We're interested in 3 and 4 ... the left/right +/// hands. These are read and assigned to the solo-left/right MMA tracks. Because of the +/// MMA strips off the two beats of silence at the start in the included file +/// we adjust the MMA internal pointer to get it in the +/// the correct position. +Beatadjust 2 +midiInc file=Greensleeves.solo.mid Solo-Right=4 Solo-Left=3 Volume=80 +//midiInc file=Greensleeves.solo.mid Solo-Right=4 Solo-Left=3 Volume=80 stripsilence=off +BeatAdjust -2 // reset beat pointer. Important! + +Groove CountryWaltz +0 z z Em + +1 Em +2 G +3 D +4 Bm +5 Em +6 / +7 B +8 / +9 Em +10 G +11 D +12 Bm +13 Em +14 B7 +15 Em +16 / +Groove CountryWaltzSus +17 G +18 / +19 D +20 Bm +21 Em +22 / +23 B +24 / +25 G +26 / +27 D +28 Bm +29 Em +30 B7 +31 Em +32 / +Groove CountryWaltz1 +Arpeggio Volume 25 +1 Em +2 / +3 D +4 / +5 Em +6 / +7 B +8 / +9 Em +10 / +11 D +12 / +13 Em +14 B7 +15 Em +16 / +Groove CountryWaltz1Sus +Arpeggio Volume 25 +17 G +18 / +19 D +20 / +21 Em +22 / +23 B +24 / +25 G +26 / +27 D +28 / +29 Em +30 B7 +31 Em +Arpeggio Volume pppp +32 Em EmzA EmzA +Groove CountryWaltzEnd +33 / +Groove CountryWaltzEnd +33 -EmzD z! z! diff --git a/Music/Booster Music/LavendersBlue.abc b/Music/Booster Music/LavendersBlue.abc new file mode 100644 index 0000000..2c65817 --- /dev/null +++ b/Music/Booster Music/LavendersBlue.abc @@ -0,0 +1,18 @@ + +X:77 +T:Lavender's Blue +M:3/4 +L:1/4 +K:Cmaj +V: RH1 clef=treble +%%MIDI channel 4 +%%MIDI program 1 4 +%%MIDI gchordoff +V: LH1 clef=bass +%%MIDI channel 3 +%%MIDI program 1 3 +%%MIDI gchordoff +% +[V: RH1] |: C G G | G F/E/D/C/ | C A A | A3 | +[V: RH1] C G G | G F/E/D/C/ | F E D | C3 :| +% diff --git a/Music/Booster Music/LavendersBlue.mma b/Music/Booster Music/LavendersBlue.mma new file mode 100644 index 0000000..9276e0e --- /dev/null +++ b/Music/Booster Music/LavendersBlue.mma @@ -0,0 +1,158 @@ +// Musical MIDI Accompaniment file for the Piano Booster project +// For more information see: www.pianobooster.sourceforge.net +// Creative Commons license + +MidiTName Lavender's Blue + +Begin Plectrum-Guitar + Voice NylonGuitar + Octave 4 + Volume m +// Tuning e-- a-- d- g- b- e // A guitar +// Tuning g-- d- a- e // A four string tenor Banjo +// Capo 0 // The fret number of the capo + Sequence { + 1.0 0 5:100 2:80; // On the 1st beat pluck strings 5 + 2 + 1.5 0 3:80; // pluck string number 3 with a velocity of 80 + 2.0 0 4:90 2:80; // The 2nd beat of the bar pluck strings 4 + 2 + 2.5 0 3:80; + 3.0 0 1:80; + 3.5 0 2:80; + } +End + + + + +Begin Plectrum-Pattern1 + Voice NylonGuitar + Octave 4 + Volume m + Sequence { 1.0 0 6:110; 1.5 0 3:80; 2.0 0 2:90; 2.5 0 1:80; 3.0 0 4:80; 3.5 0 3:80; } +End + +Begin Plectrum-Pattern2 + Voice NylonGuitar + Octave 4 + Volume m + Sequence { 1.0 0 6:110; 1.5 0 3:80; 2.0 0 2:90; 2.5 0 1:80; 3.0 0 2:80; 3.5 0 3:80; } +End + +Begin Plectrum-Pattern3 + Voice NylonGuitar + Octave 4 + Volume m + Sequence { 1.0 0 6:110; 1.5 0 3:80; 2.0 0 2-1:90; 2.5 0 3:80; 3.0 0 5:80; 3.5 0 3:80; } +End + +Begin Plectrum-Pattern4 + Voice NylonGuitar + Octave 4 + Volume m + Sequence { 1.0 0 6:110; 2.0 0 3-1:90; 3.0 0 3-1:80; } { 1.0 0 5:110; 2.0 0 3-1:90; 3.0 0 3-1:80; } +End + +Begin Plectrum-Pattern5 + Voice NylonGuitar + Octave 4 + Volume m + Sequence { 1.0 0 6:110; 2.0 0 3:90; 3.0 0 2-1:80; } { 1.0 0 5:110; 2.0 0 3:90; 3.0 0 2-1:80; } +End + + + + + +SeqClear +SeqSize 2 +Time 3 +Timesig 3 4 + + +Begin Plectrum-Pattern5 + Voice NylonGuitar + Octave 4 + Volume m + Sequence { 1.0 0 6:100; 2.0 0 3:90; 3.0 0 2-1:80; } { 1.0 0 5:100; 2.0 0 3:90; 3.0 0 2-1:80; } +End + + +Begin Drum-HH + Tone ClosedHiHat + Sequence {1 4 80; 2 4 90; 3 4 90} +End + + + +DefGroove PlectrumFingerPicking1 + +Begin Bass-Simple + Voice SlowStrings + Volume m + Octave 5 + Sequence {1 2 1 100 ; 3 8 1 90 } +End + +SeqClear +SeqSize 2 +Time 3 +Timesig 3 4 + + + +Begin Plectrum-Pattern2 + Voice NylonGuitar + Octave 4 + Volume m + Sequence { 1.0 0 6:100; 1.5 0 3:80; 2.0 0 2:90; 2.5 0 1:80; 3.0 0 2:80; 3.5 0 3:80; } +End + +Begin Drum-HH + Tone ClosedHiHat + Sequence {1 4 80; 2 4 90; 3 4 90} +End + + +DefGroove PlectrumFingerPicking2 + + + +Begin Solo-Right + Voice Piano1 + Channel 4 +End +Begin Solo-Left + Voice Piano1 + Channel 3 +End + + +Tempo 90 +Timesig 3 4 + +Groove Metronome3 + +z +midiInc file=LavendersBlue.solo.mid Solo-Left=3 Solo-Right=4 Volume=100 + +Groove PlectrumFingerPicking1 +C +C +F +F +C +C +G7 +C + +Groove PlectrumFingerPicking2 + +C +C +F +F +C +C +G7 +C + diff --git a/Music/Booster Music/ScarboroughFair.abc b/Music/Booster Music/ScarboroughFair.abc new file mode 100755 index 0000000..76f2496 --- /dev/null +++ b/Music/Booster Music/ScarboroughFair.abc @@ -0,0 +1,25 @@ +X: 1 +T: Scarborough Fair +M: 3/4 +L: 1/4 +Q:1/4=30 +K:C +V:1 +V: RH1 clef=treble +%%MIDI channel 4 +%%MIDI program 1 4 +%%MIDI gchordoff +V: LH1 clef=bass +%%MIDI channel 3 +%%MIDI program 1 3 +%%MIDI gchordoff +% +[V: RH1] |: D2D | A2A | E3/2F/E | D3 | zAc | +[V: LH1] |: z3 | z3 | z3 | z3 | z3 | +[V: RH1] d2c | ABG | A3- | Azd | d2d | +[V: LH1] z3 | z3 | z3 | z3 | z3 | +[V: RH1] c2A | AGF | E/C/-C2 |-C3 | +[V: LH1] z3 | z3 | z3 | z3 | +[V: RH1] D2A | G2F | EDC | D3- | D3 :| +[V: LH1] z3 | z3 | z3 | z3 | z3 :| +% diff --git a/Music/Booster Music/ScarboroughFair.mma b/Music/Booster Music/ScarboroughFair.mma new file mode 100755 index 0000000..c582b2c --- /dev/null +++ b/Music/Booster Music/ScarboroughFair.mma @@ -0,0 +1,154 @@ +// Musical MIDI Accompaniment file for the Piano Booster project +// For more information see: www.pianobooster.sourceforge.net +// Creative Commons license + +MidiTName Scarborough Fair +SeqClear +SeqSize 4 +Time 3 +Timesig 3 4 + + +DefGroove GuitarStrum3 + + +SeqClear +SeqSize 4 +Time 3 +Timesig 3 4 + +Begin Plectrum-GuitarStrum + Voice NylonGuitar + Capo 8 + Volume p + Sequence { + 1.0 +7 6-4:90 3-1:100; + 2.0 +5 6-1:80; + 2.5 -5 4-1:50; + 3.0 +5 6-1:80; + 3.5 -5 4-1:50; + } + +End + +Begin Bass + Sequence {1 2. 1 100; 3 4. 1 90; } {1 2. 5 100; 3 4. 5 90; } + //Voice PickedBass + Voice AcousticBass + Octave 3 + Articulate 90 + Volume f +End + + +Begin Drum Define + D1 1 8 90 ; 2.5 8 90 ; 3 8 90 + S1 2 8 90 ; 3 8 90 + CH1 1 8 90 + C1 CH1 * 6 +End + + +//Begin Drum-Kick + // Tone KickDrum1 +// Sequence D1 +//End + +//Begin Drum-Snare +// Tone SnareDrum1 +// Sequence S1 +//End + +Begin Drum + Sequence {1 4 100 ; 2 4 80 ; 3 4 80} + Tone ClosedHiHat + Rtime 10 + Rvolume 10 + Volume mp +End + + + +//Begin Plectrum +// Voice NylonGuitar +// instrument Guitar +// Tuning e a d g b e +// capo 2 // on the second fret +// Strumming /Position strum strings volume mute 1::6 80::80:80:80: + +//plectrum 1 +5 6 ; 2 +5 6; 2.5 -5 4; +DefGroove GuitarStrum2 + + + +Begin Solo-Right + Voice Piano1 + Channel 4 +End + +Begin Solo-Left + Voice Piano1 + Channel 3 +End + +KeySig C +TimeSig 3 2 +Tempo 110 + + +Groove Metronome3 +z! +z + +midiInc file=ScarboroughFair.solo.mid Solo-Right=4 Solo-Left=3 Volume=100 +// midiInc file="scarborough Fair.mid" Solo=1 Volume=70 octave=-1 + + + +Groove GuitarStrum2 +//Groove CountryWaltz + +1 Dm +2 / +3 C +4 Dm +5 F +6 Dm +7 F +8 A +9 / +10 Dm +11 F +12 / +13 C +14 / +15 Dm +16 C +17 Am +18 Dm +19 / + +Groove CountryWaltz1Sus + +1 Dm +2 / +3 C +4 Dm +5 F +6 Dm +7 F +8 A +9 / +10 Dm +11 F +12 / +13 C +14 / +15 Dm +16 C +17 Am +18 Dm +Groove CountryWaltzEnd +33 / +Groove CountryWaltzEnd +33 -DmzD z! z! diff --git a/Music/Booster Music/SkipToMyLoo.abc b/Music/Booster Music/SkipToMyLoo.abc new file mode 100755 index 0000000..5477dcd --- /dev/null +++ b/Music/Booster Music/SkipToMyLoo.abc @@ -0,0 +1,21 @@ + +X: 1 +T:Skip to My Lou +M:4/4 +L:1/4 +K:Cmaj +V:RH1 clef=treble +%%MIDI channel 4 +%%MIDI program 1 4 +%%MIDI gchordoff +% +V: LH1 clef=bass +%%MIDI channel 3 +%%MIDI program 1 3 +%%MIDI gchordoff +[V:RH1]|: EEz2 | EEG2 | DD z2 | DDF2 | EEz2 | EEG2 | DE/2F/2ED | z4 | +[V:LH1]|: z2CC | z4 | z2 B,B, | z4 | z2CC | z4 | z4 | C2C2 | +[V:RH1] E2z2 | EEG2 | D2z2 | DDF2 | E2z2 | EEG2 | DE/2F/2ED | z4 :| +[V:LH1] z2C2 | z4 | z2B,2 | z4 | z2C2 | z4 | z4 | C2C2:| +% + diff --git a/Music/Booster Music/SkipToMyLoo.mma b/Music/Booster Music/SkipToMyLoo.mma new file mode 100755 index 0000000..69f77ef --- /dev/null +++ b/Music/Booster Music/SkipToMyLoo.mma @@ -0,0 +1,82 @@ +// Musical MIDI Accompaniment file for the Piano Booster project +// For more information see: www.pianobooster.sourceforge.net +// Creative Commons license + +MidiTName Skip to My Lou + + + +Bass Channel 8 + +KeySig C +//TimeSig 2 4 +//Time 2 + +Tempo 110 + +Begin Solo-Right + Voice Piano1 + Channel 4 +End + +Begin Solo-Left + Voice Piano1 + Channel 3 +End + +Groove Metronome4 +SwingMode Off + +z! +z + +//Groove Folk +Groove GuitarBallad +//Groove FolkArticulated +//Groove Ballad +//Groove twi.mma +//Groove Main-A + + +MIDIinc file=SkipToMyLoo.solo.mid Solo-Right=4 Solo-Left=3 Volume=120 +Groove GuitarBallad +1 C +2 C +3 G +4 G +5 C +6 C +7 G +8 C +Groove GuitarBallad1 +Groove FolkArticulated +9 C +10 C +11 G +12 G +13 C +14 C +15 G +16 C +Groove GuitarBalladSus +1 C +2 C +3 G +4 G +5 C +6 C +7 G +8 C +Groove GuitarBallad1Sus +//Groove FolkArticulatedSus +9 C +10 C +11 G +12 G +13 C +14 C +15 G +Groove GuitarBalladEnd +16 C + +/ z! z! diff --git a/Music/Booster Music/info/SkipToMyLoo_en.html b/Music/Booster Music/info/SkipToMyLoo_en.html new file mode 100644 index 0000000..854ad01 --- /dev/null +++ b/Music/Booster Music/info/SkipToMyLoo_en.html @@ -0,0 +1,8 @@ + +

For Skip To My Loo start with both thumbs on middle C and then use one finger for each white note on the piano. + + So for the first two notes which are E of the piece you would use the middle finger of your right hand

+

This piece introucdes the use of two hands as the melody goes across middle C

+ +

Note: If you are a complete beiginner try the pieces from the beginner book first

+ diff --git a/Music/Booster Music/info/SkipToMyLoo_ja.html b/Music/Booster Music/info/SkipToMyLoo_ja.html new file mode 100644 index 0000000..7c27787 --- /dev/null +++ b/Music/Booster Music/info/SkipToMyLoo_ja.html @@ -0,0 +1 @@ +Hello from Skip to my looooooooo ja diff --git a/Music/makemusic b/Music/makemusic index 3cdaed1..3eb94ba 100755 --- a/Music/makemusic +++ b/Music/makemusic @@ -97,7 +97,7 @@ class songDetails: os.remove("{0}001.eps".format(tempName )) - os.system("cp \"{0}.abc\" {1}.abc".format(srcName, webName)) + os.system("cp \"{0}.abc\" {1}.abc".format(abcMidiName, webName)) os.system("cp \"{0}.mma\" {1}.mma".format(srcName, webName)) os.system("cp \"{0}.pdf\" {1}.pdf".format(outputName, webName)) os.system("cp \"{0}.mid\" {1}.mid".format(outputName, webName)) @@ -141,62 +141,64 @@ def addSong(songs, directory, index, name): def runMain(argv): - if len(argv) > 1: - outputRootDir = "Output" - zipFileName = "BoosterMusicBooks" - MUSIC_RELEASE = "1" - outputDir = outputRootDir + '/' + zipFileName + MUSIC_RELEASE - webDir = outputRootDir + '/' + "MusicWeb" - tempDir = outputRootDir + '/' + "Temp" + if len(argv) > 3: + print "usage: makescore args" + return - if not os.path.isdir("Output"): - os.mkdir("Output") - if not os.path.isdir(outputDir): - os.mkdir(outputDir) - if not os.path.isdir(webDir): - os.mkdir(webDir) - if not os.path.isdir(tempDir): - os.mkdir(tempDir) + outputRootDir = "Output" + zipFileName = "BoosterMusicBooks" + MUSIC_RELEASE = "1" + outputDir = outputRootDir + '/' + zipFileName + MUSIC_RELEASE + webDir = outputRootDir + '/' + "MusicWeb" + tempDir = outputRootDir + '/' + "Temp" - musicHtmlPage = webDir + "/music.html" - #musicHtmlPage = "music.html" - if os.path.isfile(musicHtmlPage): - os.remove(musicHtmlPage) - os.system("cp music.html.start {0}".format(webDir + "/" + "Beginner" + ".html")) - os.system("cp music.html.start {0}".format(webDir + "/" + "Booster" + ".html")) + if not os.path.isdir("Output"): + os.mkdir("Output") + if not os.path.isdir(outputDir): + os.mkdir(outputDir) + if not os.path.isdir(webDir): + os.mkdir(webDir) + if not os.path.isdir(tempDir): + os.mkdir(tempDir) + + musicHtmlPage = webDir + "/music.html" + #musicHtmlPage = "music.html" + if os.path.isfile(musicHtmlPage): + os.remove(musicHtmlPage) + os.system("cp music.html.start {0}".format(webDir + "/" + "Beginner" + ".html")) + os.system("cp music.html.start {0}".format(webDir + "/" + "Booster" + ".html")) - songs=[] - addSong(songs, "Beginner", 1, "ChordOfCMajor") - addSong(songs, "Booster", 1, "ClairDeLaLune") - addSong(songs, "Booster", 2, "LavendersBlue") - addSong(songs, "Booster", 3, "SkipToMyLoo") - addSong(songs, "Booster", 4, "FrereJacques") - addSong(songs, "Booster", 5, "ScarboroughFair") - addSong(songs, "Booster", 6, "Greensleeves") - addSong(songs, "Booster", 7, "AmazingGrace") + songs=[] + addSong(songs, "Beginner Course", 1, "ChordOfCMajor") + addSong(songs, "Booster Music", 1, "ClairDeLaLune") + addSong(songs, "Booster Music", 2, "LavendersBlue") + addSong(songs, "Booster Music", 3, "SkipToMyLoo") + addSong(songs, "Booster Music", 4, "FrereJacques") + addSong(songs, "Booster Music", 5, "ScarboroughFair") + addSong(songs, "Booster Music", 6, "Greensleeves") + addSong(songs, "Booster Music", 7, "AmazingGrace") - result = False - for n,song in enumerate(songs): - result = song.createMusic(outputDir, webDir, tempDir) - if not result: - break + result = False + for n,song in enumerate(songs): + result = song.createMusic(outputDir, webDir, tempDir) + if not result: + break - if result: - os.system("cat music.html.end >>{0}".format(webDir + "/" + "Beginner" + ".html")) - os.system("cat music.html.end >>{0}".format(webDir + "/" + "Booster" + ".html")) + if result: + os.system("cat music.html.end >>{0}".format(webDir + "/" + "Beginner" + ".html")) + os.system("cat music.html.end >>{0}".format(webDir + "/" + "Booster" + ".html")) - #cmd = "gzip \"{0}\" >\"{1}.zip\"" .format(outputDir, outputDir ) + if os.path.isfile("{0}/{1}.zip".format(outputRootDir, zipFileName )): os.remove("{0}/{1}.zip".format(outputRootDir, zipFileName )) - cmd = "cd {0};zip -r {1}.zip \"{2}\" " .format(outputRootDir, zipFileName, zipFileName + MUSIC_RELEASE ) - print cmd - if os.system(cmd) != 0: - return False + #cmd = "gzip \"{0}\" >\"{1}.zip\"" .format(outputDir, outputDir ) + cmd = "cd {0};zip -r {1}.zip \"{2}\" " .format(outputRootDir, zipFileName, zipFileName + MUSIC_RELEASE ) + print cmd + if os.system(cmd) != 0: + return False - else: - print "usage: makescore args" if __name__ == "__main__": runMain(sys.argv) diff --git a/PianoBooster/music/BoosterMusicBooks.zip b/PianoBooster/music/BoosterMusicBooks.zip index c752b0f..4b6e5dc 100644 Binary files a/PianoBooster/music/BoosterMusicBooks.zip and b/PianoBooster/music/BoosterMusicBooks.zip differ diff --git a/PianoBooster/src/QtWindow.cpp b/PianoBooster/src/QtWindow.cpp index 4a53f95..80192b1 100644 --- a/PianoBooster/src/QtWindow.cpp +++ b/PianoBooster/src/QtWindow.cpp @@ -106,9 +106,6 @@ QtWindow::QtWindow() m_sidePanel->init(m_song, m_song->getTrackList(), m_topBar); m_topBar->init(m_song, m_song->getTrackList()); - createActions(); - createMenus(); - readSettings(); QWidget *centralWin = new QWidget(); centralWin->setLayout(mainLayout); @@ -148,6 +145,10 @@ QtWindow::QtWindow() m_settings->loadSettings(); + createActions(); + createMenus(); + readSettings(); + show(); } @@ -311,9 +312,17 @@ void QtWindow::createActions() m_setupKeyboardAct->setStatusTip(tr("Change the piano keybaord settings")); connect(m_setupKeyboardAct, SIGNAL(triggered()), this, SLOT(showKeyboardSetup())); - m_toggleSidePanelAct = new QAction(tr("&Show/Hide the Side Panel"), this); - m_toggleSidePanelAct->setShortcut(tr("F11")); - connect(m_toggleSidePanelAct, SIGNAL(triggered()), this, SLOT(toggleSidePanel())); + m_fullScreenStateAct = new QAction(tr("&Fullscreen"), this); + m_fullScreenStateAct->setShortcut(tr("F11")); + m_fullScreenStateAct->setCheckable(true); + connect(m_fullScreenStateAct, SIGNAL(triggered()), this, SLOT(onFullScreenStateAct())); + + m_sidePanelStateAct = new QAction(tr("&Show the Side Panel"), this); + m_sidePanelStateAct->setShortcut(tr("F12")); + m_sidePanelStateAct->setCheckable(true); + m_sidePanelStateAct->setChecked(true); + connect(m_sidePanelStateAct, SIGNAL(triggered()), this, SLOT(toggleSidePanel())); + m_setupPreferencesAct = new QAction(tr("&Preferences ..."), this); m_setupPreferencesAct->setShortcut(tr("Ctrl+P")); @@ -352,7 +361,8 @@ void QtWindow::createMenus() m_fileMenu->addAction(m_exitAct); m_viewMenu = menuBar()->addMenu(tr("&View")); - m_viewMenu->addAction(m_toggleSidePanelAct); + m_viewMenu->addAction(m_sidePanelStateAct); + m_viewMenu->addAction(m_fullScreenStateAct); m_songMenu = menuBar()->addMenu(tr("&Song")); m_songMenu->addAction(m_songDetailsAct); diff --git a/PianoBooster/src/QtWindow.h b/PianoBooster/src/QtWindow.h index 7bc49db..1d089bb 100644 --- a/PianoBooster/src/QtWindow.h +++ b/PianoBooster/src/QtWindow.h @@ -103,7 +103,14 @@ private slots: void toggleSidePanel() { - m_sidePanel->setVisible(!m_sidePanel->isVisible()); + m_sidePanel->setVisible(m_sidePanelStateAct->isChecked()); + } + + void onFullScreenStateAct () { + if (m_fullScreenStateAct->isChecked()) + showFullScreen(); + else + showNormal(); } void enableFollowTempo() @@ -175,7 +182,8 @@ private: QAction *m_songPlayAct; QAction *m_setupMidiAct; QAction *m_setupKeyboardAct; - QAction *m_toggleSidePanelAct; + QAction *m_sidePanelStateAct; + QAction *m_fullScreenStateAct; QAction *m_setupPreferencesAct; QAction *m_songDetailsAct; diff --git a/PianoBooster/src/Settings.cpp b/PianoBooster/src/Settings.cpp index a1f960c..a6cae4a 100755 --- a/PianoBooster/src/Settings.cpp +++ b/PianoBooster/src/Settings.cpp @@ -363,102 +363,11 @@ void CSettings::writeSettings() saveXmlFile(); } + void CSettings::loadSettings() { + unzipBootserMusicBooks(); // Set default values - - const int MUSIC_RELEASE = 1; - - - if (value("PianoBooster/MusicRelease", 0).toInt() < MUSIC_RELEASE) - { - QDir destMusicDir; - QString resourceDir; - resourceDir = QApplication::applicationDirPath() + "/music/"; - - destMusicDir.setPath(QDir::homePath() ); - - if (!QFile::exists(resourceDir)) - { -#ifdef Q_OS_LINUX - resourceDir = QApplication::applicationDirPath() + "/../share/" + QSTR_APPNAME + "/music/"; -#endif -#ifdef Q_OS_DARWIN - resourceDir = QApplication::applicationDirPath() + "/../Resources/music"; -#endif - } - - - QFileInfo zipFile(resourceDir + "BoosterMusicBooks.zip"); - const QString MUSIC_DIR_NAME("Music"); - ppLogTrace("xx %s", qPrintable(zipFile.filePath())); - - if (zipFile.exists() ) - { - ppLogTrace("xx2"); - if (!QDir(destMusicDir.path() + "/" + MUSIC_DIR_NAME).exists()) - { - destMusicDir.mkdir(MUSIC_DIR_NAME); - } - destMusicDir.setPath(destMusicDir.path() + "/" + MUSIC_DIR_NAME); - - - QProcess unzip; - unzip.start("unzip", QStringList() << "-o" << zipFile.filePath() << "-d" << destMusicDir.path() ); - ppLogInfo(qPrintable("running unzip -o " + zipFile.filePath() + " -d " + destMusicDir.path()) ); - char buf[1024]; - while (true) - { - qint64 lineLength = unzip.readLine(buf, sizeof(buf)); - if (lineLength <= 0) - break; - ppLogInfo(buf); - // the line is available in buf - } - - - if (unzip.waitForFinished()) - { - setCurrentSongName(destMusicDir.path() + "/BoosterMusicBooks" + QString::number(MUSIC_RELEASE) + "/Booster/01-ClairDeLaLune.mid"); - setValue("PianoBooster/MusicRelease", MUSIC_RELEASE); - } - else - { - ppLogError("unzip failed"); - } - - } - - /* - srcMusicDir.setPath(resourceDir); // FIXME - srcMusicDir.setFilter(QDir::Files); - QFileInfoList fileNames = srcMusicDir.entryInfoList(); - const QString MUSIC_DIR_NAME("PianoBoosterBooks"); - - QDir des(QDir::homePath() + "/" + MUSIC_DIR_NAME); - if (!QDir(destMusicDir.path() + "/" + MUSIC_DIR_NAME).exists()) - { - destMusicDir.mkdir(MUSIC_DIR_NAME); - } - destMusicDir.setPath(destMusicDir.path() + "/" + MUSIC_DIR_NAME); - - - for (int i = 0; i < fileNames.size(); i++) - { - if ( fileNames.at(i).fileName().endsWith(".mid", Qt::CaseInsensitive ) ) - { - //QFileInfo destFile(destMusicDir, QFileInfo(fileNames.at(i)).fileName()); - - QFile::copy(fileNames.at(i).filePath(), destMusicDir.path() + "/" + fileNames.at(i).fileName()); - if (i==2) - openSongFile( destMusicDir.path() + "/" + fileNames.at(i).fileName() ); - - } - } - */ - } - - setValue("PianoBooster/Version",PB_VERSION); setDefaultValue("ShortCuts/LeftHand", "F2"); setDefaultValue("ShortCuts/BothHands","F3"); @@ -477,6 +386,83 @@ void CSettings::loadSettings() } +void CSettings::unzipBootserMusicBooks() +{ + // Set default values + + const int MUSIC_RELEASE = 1; + const QString ZIPFILENAME("BoosterMusicBooks.zip"); + + + if (value("PianoBooster/MusicRelease", 0).toInt() < MUSIC_RELEASE) + { + QString resourceDir = QApplication::applicationDirPath() + "/../music/"; + + ppLogTrace("resourceDir1 %s", qPrintable(resourceDir)); + + if (!QFile::exists(resourceDir + ZIPFILENAME)) + resourceDir = QApplication::applicationDirPath() + "/../../music/"; + ppLogTrace("resourceDir2 %s", qPrintable(resourceDir)); + + if (!QFile::exists(resourceDir + ZIPFILENAME)) + { +#ifdef Q_OS_LINUX + resourceDir = QApplication::applicationDirPath() + "/../share/" + QSTR_APPNAME + "/music/"; +#endif +#ifdef Q_OS_DARWIN + resourceDir = QApplication::applicationDirPath() + "/../Resources/music/"; +#endif + } + + ppLogInfo(qPrintable("applicationDirPath=" + QApplication::applicationDirPath())); + ppLogTrace("resourceDir3 %s", qPrintable(resourceDir)); + + + QFileInfo zipFile(resourceDir + ZIPFILENAME); + ppLogTrace("xx %s", qPrintable(zipFile.filePath())); + + const QString MUSIC_DIR_NAME("Music"); + QDir destMusicDir; + destMusicDir.setPath(QDir::homePath() ); + + if (!zipFile.exists() ) + { + ppLogError(qPrintable("Cannot find " + ZIPFILENAME)); + return; + } + + if (!QDir(destMusicDir.path() + "/" + MUSIC_DIR_NAME).exists()) + { + destMusicDir.mkdir(MUSIC_DIR_NAME); + } + destMusicDir.setPath(destMusicDir.path() + "/" + MUSIC_DIR_NAME); + + + QProcess unzip; + unzip.start("unzip", QStringList() << "-o" << zipFile.filePath() << "-d" << destMusicDir.path() ); + ppLogInfo(qPrintable("running unzip -o " + zipFile.filePath() + " -d " + destMusicDir.path()) ); + char buf[1024]; + while (true) + { + qint64 lineLength = unzip.readLine(buf, sizeof(buf)); + if (lineLength <= 0) + break; + ppLogInfo(buf); + // the line is available in buf + } + + + if (unzip.waitForFinished()) + { + setCurrentSongName(destMusicDir.path() + "/BoosterMusicBooks" + QString::number(MUSIC_RELEASE) + "/Booster Music/01-ClairDeLaLune.mid"); + setValue("PianoBooster/MusicRelease", MUSIC_RELEASE); + } + else + { + ppLogError("unzip failed"); + } + } +} void CSettings::setCurrentSongName(const QString & name) { diff --git a/PianoBooster/src/Settings.h b/PianoBooster/src/Settings.h index 7731159..1665f7c 100755 --- a/PianoBooster/src/Settings.h +++ b/PianoBooster/src/Settings.h @@ -72,6 +72,7 @@ public: QStringList getSongList(); void writeSettings(); void loadSettings(); + void unzipBootserMusicBooks(); QString getCurrentSongLongFileName() { if (getCurrentSongName().isEmpty())