Warning, /education/gcompris/src/activities/piano_composition/PianoOctaveKeyboard.qml is written in an unsupported language. File is not indexed.

0001 /* GCompris - PianoOctaveKeyboard.qml
0002 *
0003 * SPDX-FileCopyrightText: 2016 Johnny Jazeix <jazeix@gmail.com>
0004 * SPDX-FileCopyrightText: 2018 Aman Kumar Gupta <gupta2140@gmail.com>
0005 *
0006 * Authors:
0007 *   Beth Hadley <bethmhadley@gmail.com> (GTK+ version)
0008 *   Johnny Jazeix <jazeix@gmail.com> (Qt Quick port)
0009 *   Aman Kumar Gupta <gupta2140@gmail.com> (Qt Quick port)
0010 *
0011 *   SPDX-License-Identifier: GPL-3.0-or-later
0012 */
0013 import QtQuick 2.12
0014 import GCompris 1.0
0015 
0016 import "../../core"
0017 
0018 Item {
0019     id: piano
0020     z: 3
0021 
0022     property alias keyRepeater: keyRepeater
0023 
0024     property int numberOfWhite: 7
0025     property int currentOctaveNb: 0
0026     readonly property int maxNbOctaves: whiteKeyNoteLabels.length
0027 
0028     property real whiteWidth: width / numberOfWhite // 23
0029     property real whiteHeight: height // 120
0030     property real blackWidth: (whiteWidth + 1) / 2 // 13
0031     property real blackHeight: 2 * height / 3 // 80
0032 
0033     property bool leftOctaveVisible: false
0034     property bool playPianoActivity: false //set to true to specify the offset used for keyboard controls for this activity...
0035 
0036     property var coloredKeyLabels: ['C', 'D', 'E', 'F', 'G', 'A', 'B']
0037     // When the labelsColor is inbuilt, the default color mapping will be done, else assign any color externally in the activity. Example: Reference keys in note_names are red colored and all other are white.
0038     property string labelsColor: "inbuilt"
0039 
0040     //: Translators, C, D, E, F, G, A and B are the note notations in English musical notation system. The numbers in the arguments represents the octave number of the note. For instance, C4 is a C note in the 4th octave.
0041     readonly property var whiteKeyNoteLabelsArray: [
0042         ["F1", qsTr("F%1").arg(1)],
0043         ["G1", qsTr("G%1").arg(1)],
0044         ["A1", qsTr("A%1").arg(1)],
0045         ["B1", qsTr("B%1").arg(1)],
0046         ["C2", qsTr("C%1").arg(2)],
0047         ["D2", qsTr("D%1").arg(2)],
0048         ["E2", qsTr("E%1").arg(2)],
0049         ["F2", qsTr("F%1").arg(2)],
0050         ["G2", qsTr("G%1").arg(2)],
0051         ["A2", qsTr("A%1").arg(2)],
0052         ["B2", qsTr("B%1").arg(2)],
0053         ["C3", qsTr("C%1").arg(3)],
0054         ["D3", qsTr("D%1").arg(3)],
0055         ["E3", qsTr("E%1").arg(3)],
0056         ["F3", qsTr("F%1").arg(3)],
0057         ["G3", qsTr("G%1").arg(3)],
0058         ["A3", qsTr("A%1").arg(3)],
0059         ["B3", qsTr("B%1").arg(3)],
0060         ["C4", qsTr("C%1").arg(4)],
0061         ["D4", qsTr("D%1").arg(4)],
0062         ["E4", qsTr("E%1").arg(4)],
0063         ["F4", qsTr("F%1").arg(4)],
0064         ["G4", qsTr("G%1").arg(4)],
0065         ["A4", qsTr("A%1").arg(4)],
0066         ["B4", qsTr("B%1").arg(4)],
0067         ["C5", qsTr("C%1").arg(5)],
0068         ["D5", qsTr("D%1").arg(5)],
0069         ["E5", qsTr("E%1").arg(5)],
0070         ["F5", qsTr("F%1").arg(5)],
0071         ["G5", qsTr("G%1").arg(5)],
0072         ["A5", qsTr("A%1").arg(5)],
0073         ["B5", qsTr("B%1").arg(5)],
0074         ["C6", qsTr("C%1").arg(6)],
0075         ["D6", qsTr("D%1").arg(6)],
0076         ["E6", qsTr("E%1").arg(6)],
0077         ["F6", qsTr("F%1").arg(6)]
0078     ]
0079 
0080     //: Translators, C♯, D♯, F♯, G♯, and A♯ are the note notations in English musical notation system. The numbers in the arguments represents the octave number of the note. For instance, C♯4 is a C♯ note in the 4th octave.
0081     readonly property var blackKeySharpNoteLabelsArray: [
0082         ["C#3", qsTr("C♯%1").arg(3)],
0083         ["D#3", qsTr("D♯%1").arg(3)],
0084         ["F#3", qsTr("F♯%1").arg(3)],
0085         ["G#3", qsTr("G♯%1").arg(3)],
0086         ["A#3", qsTr("A♯%1").arg(3)],
0087         ["C#4", qsTr("C♯%1").arg(4)],
0088         ["D#4", qsTr("D♯%1").arg(4)],
0089         ["F#4", qsTr("F♯%1").arg(4)],
0090         ["G#4", qsTr("G♯%1").arg(4)],
0091         ["A#4", qsTr("A♯%1").arg(4)],
0092         ["C#5", qsTr("C♯%1").arg(5)],
0093         ["D#5", qsTr("D♯%1").arg(5)],
0094         ["F#5", qsTr("F♯%1").arg(5)],
0095         ["G#5", qsTr("G♯%1").arg(5)],
0096         ["A#5", qsTr("A♯%1").arg(5)],
0097         ["C#6", qsTr("C♯%1").arg(6)],
0098         ["D#6", qsTr("D♯%1").arg(6)]
0099     ]
0100 
0101     //: Translators, D♭, E♭, G♭, A♭, B♭ are the note notations in English musical notation system. The numbers in the arguments represents the octave number of the note. For instance, D♭4 is a D♭ note in the 4th octave.
0102     readonly property var blackKeyFlatNoteLabelsArray: [
0103         ["Db3", qsTr("D♭%1").arg(3)],
0104         ["Eb3", qsTr("E♭%1").arg(3)],
0105         ["Gb3", qsTr("G♭%1").arg(3)],
0106         ["Ab3", qsTr("A♭%1").arg(3)],
0107         ["Bb3", qsTr("B♭%1").arg(3)],
0108         ["Db4", qsTr("D♭%1").arg(4)],
0109         ["Eb4", qsTr("E♭%1").arg(4)],
0110         ["Gb4", qsTr("G♭%1").arg(4)],
0111         ["Ab4", qsTr("A♭%1").arg(4)],
0112         ["Bb4", qsTr("B♭%1").arg(4)],
0113         ["Db5", qsTr("D♭%1").arg(5)],
0114         ["Eb5", qsTr("E♭%1").arg(5)],
0115         ["Gb5", qsTr("G♭%1").arg(5)],
0116         ["Ab5", qsTr("A♭%1").arg(5)],
0117         ["Bb5", qsTr("B♭%1").arg(5)],
0118         ["Db6", qsTr("D♭%1").arg(6)],
0119         ["Eb6", qsTr("E♭%1").arg(6)]
0120     ]
0121     readonly property var blackKeyNoteLabels: useSharpNotation ? blackKeySharpNoteLabelsArray : blackKeyFlatNoteLabelsArray
0122 
0123     readonly property var keyLabelColors: { "C": "#FF0000", "D": "#FF7F00", "E": "#FFFF00", "F": "#32CD32",
0124                                             "G": "#6495ED", "A": "#D02090", "B": "#FF1493",
0125                                             "C#": "#FF6347", "D#": "#FFD700", "F#": "#20B2AA", "G#": "#8A2BE2", "A#": "#FF00FF",
0126                                             "Db": "#FF6347", "Eb": "#FFD700", "Gb": "#20B2AA", "Ab": "#8A2BE2", "Bb": "#FF00FF"}
0127 
0128     // White key notes are from C3 to G4 when the clef is bass
0129     property var whiteKeyNoteLabelsBass: [
0130         whiteKeyNoteLabelsArray.slice(11, 18),
0131         whiteKeyNoteLabelsArray.slice(18, 22)
0132     ]
0133     // White key notes are from G3 to C6 when the clef is treble
0134     property var whiteKeyNoteLabelsTreble: [
0135         whiteKeyNoteLabelsArray.slice(13, 18),
0136         whiteKeyNoteLabelsArray.slice(18, 25),
0137         whiteKeyNoteLabelsArray.slice(25, 32),
0138         whiteKeyNoteLabelsArray.slice(32, 36)
0139     ]
0140     readonly property var whiteKeyNoteLabels: background.clefType === "Treble" ? whiteKeyNoteLabelsTreble : whiteKeyNoteLabelsBass
0141 
0142     signal noteClicked(string note)
0143 
0144     property bool blackLabelsVisible: true
0145     property bool whiteLabelsVisible: true
0146     property bool blackKeysEnabled: true
0147     property bool whiteKeysEnabled: true
0148     property bool useSharpNotation: true
0149     property int labelSquareSize: whiteWidth - 5
0150 
0151     Repeater {
0152         id: keyRepeater
0153         model: whiteKeyNoteLabels.length ? whiteKeyNoteLabels[currentOctaveNb % whiteKeyNoteLabels.length].length : 0
0154 
0155         property int keyboardOffset: piano.numberOfWhite - whiteKeyNoteLabels[0].length
0156 
0157         function playKey(keyboardKey, color) {
0158             var keyToPress;
0159             if(currentOctaveNb === 0 && !piano.playPianoActivity)
0160                 keyToPress = keyboardKey - keyRepeater.keyboardOffset;
0161             else
0162                 keyToPress = keyboardKey;
0163             if(itemAt(keyToPress) === null)
0164                 return
0165             if(color === "white")
0166                 itemAt(keyToPress).whiteKey.keyPressed();
0167             else if(itemAt(keyToPress).blackKey.visible)
0168                 itemAt(keyToPress).blackKey.keyPressed();
0169         }
0170 
0171         Item {
0172             width: whiteWidth
0173             height: whiteHeight
0174             x: ((currentOctaveNb === 0) ? (keyRepeater.keyboardOffset + index) : index) * whiteWidth
0175 
0176             property alias whiteKey: whiteKey
0177             property alias blackKey: blackKey
0178 
0179             PianoKey {
0180                 id: whiteKey
0181                 color: "white"
0182                 width: whiteWidth
0183                 height: whiteHeight
0184                 labelSquareSize: piano.labelSquareSize
0185                 noteColor: keyLabelColors[keyName[0][0]]
0186                 keyName: whiteKeyNoteLabels[currentOctaveNb % whiteKeyNoteLabels.length][index]
0187                 labelsVisible: whiteLabelsVisible
0188                 isKeyEnabled: piano.whiteKeysEnabled
0189                 onKeyPressed: noteClicked(keyName[0])
0190             }
0191 
0192             PianoKey {
0193                 id: blackKey
0194                 color: "black"
0195                 width: blackWidth
0196                 height: Math.min(blackHeight, whiteHeight - labelSquareSize - 10)
0197                 x: -width / 2
0198                 visible: {
0199                     if(index || leftOctaveVisible)
0200                         return (["D", "E", "G", "A", "B"].indexOf(whiteKeyNoteLabels[currentOctaveNb % whiteKeyNoteLabels.length][index][0][0]) != -1)
0201                     return false
0202                 }
0203                 labelSquareSize: piano.labelSquareSize - 2
0204                 noteColor: keyName ? keyLabelColors[keyName[0].substr(0, 2)] : "black"
0205                 keyName: {
0206                     for(var i = 0; i < blackKeyFlatNoteLabelsArray.length; i++) {
0207                         if((blackKeyFlatNoteLabelsArray[i][0][0] === whiteKey.keyName[0][0])
0208                            && (blackKeyFlatNoteLabelsArray[i][0][2] === whiteKey.keyName[0][1]))
0209                             return blackKeyNoteLabels[i]
0210                     }
0211                     return ""
0212                 }
0213                 labelsVisible: blackLabelsVisible
0214                 isKeyEnabled: piano.blackKeysEnabled
0215                 onKeyPressed: noteClicked(keyName[0])
0216             }
0217         }
0218     }
0219 }