Browse Source

feat: 增加高音陶笛

TIANYONG 11 months ago
parent
commit
7d3402034f
45 changed files with 2369 additions and 11 deletions
  1. 1 1
      osmd-extended
  2. BIN
      public/soundfonts/whistling/A4.mp3
  3. BIN
      public/soundfonts/whistling/A5.mp3
  4. BIN
      public/soundfonts/whistling/Ab5.mp3
  5. BIN
      public/soundfonts/whistling/B4.mp3
  6. BIN
      public/soundfonts/whistling/B5.mp3
  7. BIN
      public/soundfonts/whistling/Bb4.mp3
  8. BIN
      public/soundfonts/whistling/Bb5.mp3
  9. BIN
      public/soundfonts/whistling/C5.mp3
  10. BIN
      public/soundfonts/whistling/C6.mp3
  11. BIN
      public/soundfonts/whistling/D5.mp3
  12. BIN
      public/soundfonts/whistling/D6.mp3
  13. BIN
      public/soundfonts/whistling/Db5.mp3
  14. BIN
      public/soundfonts/whistling/Db6.mp3
  15. BIN
      public/soundfonts/whistling/E5.mp3
  16. BIN
      public/soundfonts/whistling/E6.mp3
  17. BIN
      public/soundfonts/whistling/Eb5.mp3
  18. BIN
      public/soundfonts/whistling/Eb6.mp3
  19. BIN
      public/soundfonts/whistling/F5.mp3
  20. BIN
      public/soundfonts/whistling/F6.mp3
  21. BIN
      public/soundfonts/whistling/G5.mp3
  22. BIN
      public/soundfonts/whistling/Gb5.mp3
  23. 4 1
      src/helpers/formateMusic.ts
  24. 9 7
      src/page-instrument/view-figner/index.tsx
  25. 2305 0
      src/view/figner-preview/index.ts
  26. 47 2
      src/view/fingering/fingering-config.ts
  27. 0 0
      src/view/fingering/fingering-img/ocarina/index.json
  28. 0 0
      src/view/fingering/fingering-img/ocarina1/index.json
  29. 0 0
      src/view/fingering/fingering-img/ocarina2/index.json
  30. BIN
      src/view/fingering/fingering-img/whistling/1.png
  31. BIN
      src/view/fingering/fingering-img/whistling/10.png
  32. BIN
      src/view/fingering/fingering-img/whistling/11.png
  33. BIN
      src/view/fingering/fingering-img/whistling/12.png
  34. BIN
      src/view/fingering/fingering-img/whistling/2.png
  35. BIN
      src/view/fingering/fingering-img/whistling/3.png
  36. BIN
      src/view/fingering/fingering-img/whistling/4.png
  37. BIN
      src/view/fingering/fingering-img/whistling/5.png
  38. BIN
      src/view/fingering/fingering-img/whistling/6.png
  39. BIN
      src/view/fingering/fingering-img/whistling/7.png
  40. BIN
      src/view/fingering/fingering-img/whistling/8.png
  41. BIN
      src/view/fingering/fingering-img/whistling/9.png
  42. BIN
      src/view/fingering/fingering-img/whistling/full.png
  43. 1 0
      src/view/fingering/fingering-img/whistling/index.json
  44. 1 0
      src/view/fingering/fingering-img/whistling1/index.json
  45. 1 0
      src/view/fingering/fingering-img/whistling2/index.json

+ 1 - 1
osmd-extended

@@ -1 +1 @@
-Subproject commit 6967750d4de04e03f3abb9753b4bca0cbaae83a9
+Subproject commit fdab2658e275867c896672d96148199cd282b759

BIN
public/soundfonts/whistling/A4.mp3


BIN
public/soundfonts/whistling/A5.mp3


BIN
public/soundfonts/whistling/Ab5.mp3


BIN
public/soundfonts/whistling/B4.mp3


BIN
public/soundfonts/whistling/B5.mp3


BIN
public/soundfonts/whistling/Bb4.mp3


BIN
public/soundfonts/whistling/Bb5.mp3


BIN
public/soundfonts/whistling/C5.mp3


BIN
public/soundfonts/whistling/C6.mp3


BIN
public/soundfonts/whistling/D5.mp3


BIN
public/soundfonts/whistling/D6.mp3


BIN
public/soundfonts/whistling/Db5.mp3


BIN
public/soundfonts/whistling/Db6.mp3


BIN
public/soundfonts/whistling/E5.mp3


BIN
public/soundfonts/whistling/E6.mp3


BIN
public/soundfonts/whistling/Eb5.mp3


BIN
public/soundfonts/whistling/Eb6.mp3


BIN
public/soundfonts/whistling/F5.mp3


BIN
public/soundfonts/whistling/F6.mp3


BIN
public/soundfonts/whistling/G5.mp3


BIN
public/soundfonts/whistling/Gb5.mp3


+ 4 - 1
src/helpers/formateMusic.ts

@@ -1244,7 +1244,10 @@ export const compatibleXmlPitchVoice = (xmlParse: any) => {
 				break;
 			case 35:
 				xmlNeedAdjustVoice = !instrumentName || instrumentName.includes('solo') || instrumentName.includes('woodwind') ? true : false
-				break;				
+				break;		
+			case 39:
+				xmlNeedAdjustVoice = !instrumentName || instrumentName.includes('solo') || instrumentName.includes('whistling') ? true : false
+				break;						
 			default:
 				xmlNeedAdjustVoice = !instrumentName || instrumentName.includes('solo') ? true : false
 				break;

+ 9 - 7
src/page-instrument/view-figner/index.tsx

@@ -165,7 +165,7 @@ export default defineComponent({
     };
     const getFingeringData = async () => {
       const subject: any = data.subject + (data.viewIndex === 0 ? "" : data.viewIndex);
-      console.log("🚀 ~ subject:", subject);
+      console.log("🚀 ~ subject:模式", subject, data.viewIndex, data.fingeringMode);
       fingerData.subject = await getFingeringConfig(subject);
     };
     const createAudio = (url: string) => {
@@ -223,7 +223,7 @@ export default defineComponent({
       if (playAction.showAnswerLoading) return;
       data.loadingImg = true;
       if (data.fingeringMode === "scaleMode") {
-        if (["pan-flute", "ocarina"].includes(data.subject)) {
+        if (["pan-flute", "ocarina", "whistling"].includes(data.subject)) {
           data.viewIndex = 1;
         } else {
           data.viewIndex = 0;
@@ -231,6 +231,7 @@ export default defineComponent({
         const o: any = {
           "pan-flute": 2,
           ocarina: 2,
+          whistling: 2,
           piccolo: 2,
           "hulusi-flute": 2,
           "baroque-recorder": 2,
@@ -259,11 +260,11 @@ export default defineComponent({
       if (data.fingeringMode === "fingeringMode") {
         if (data.subject === "pan-flute") {
           data.viewIndex = 3;
-        } else if (["pan-flute", "ocarina", "melodica"].includes(data.subject)) {
+        } else if (["pan-flute", "ocarina", "melodica", "whistling"].includes(data.subject)) {
           data.viewIndex = 1;
         }
       } else {
-        if (["pan-flute", "ocarina"].includes(data.subject)) {
+        if (["pan-flute", "ocarina", "whistling"].includes(data.subject)) {
           data.viewIndex = 1;
         }
       }
@@ -348,6 +349,7 @@ export default defineComponent({
       if (showNote) {
         data.realKey = item.realKey;
       }
+      console.log('key:', item.realKey, data.soundFonts)
       data.noteAudio = data.soundFonts[item.realKey];
       if (data.noteAudio) {
         data.noteAudio.play();
@@ -797,7 +799,7 @@ export default defineComponent({
             paddingTop: "1.3rem",
             paddingBottom: "0",
           };
-        } else if (data.subject === "ocarina") {
+        } else if (data.subject === "ocarina" || data.subject === "whistling") {
           return {
             paddingTop: "1.3rem",
             paddingBottom: "0",
@@ -829,7 +831,7 @@ export default defineComponent({
             paddingTop: "1.3rem",
             paddingBottom: "0",
           };
-        } else if (data.subject === "ocarina") {
+        } else if (data.subject === "ocarina" || data.subject === "whistling") {
           return {
             paddingTop: "1.3rem",
             paddingBottom: "0",
@@ -1217,7 +1219,7 @@ export default defineComponent({
                   onClick={() => {
                     data.viewIndex++;
                     if (data.viewIndex > data.viewTotal) {
-                      if (["pan-flute", "ocarina"].includes(data.subject)) {
+                      if (["pan-flute", "ocarina", "whistling"].includes(data.subject)) {
                         data.viewIndex = 1;
                       } else {
                         data.viewIndex = 0;

+ 2305 - 0
src/view/figner-preview/index.ts

@@ -4682,6 +4682,2311 @@ export const FIGNER_INSTRUMENT_DATA: { [_: string]: IFIGNER_INSTRUMENT_DATA } =
 			},
 		],
 	},
+	whistling: {
+		tips: [
+			{
+				key: 0,
+				name: "嘴型",
+				octave: 0,
+				step: 0,
+				realKey: 0,
+				realName:
+					"以嘴唇轻轻含住吹口,不可含太深,以免盖住出气孔。\n吹气方式宜以丹田之力(腹腔)稳定送出,一可避免太多口水,二可产生振音效果,让笛韵更为悦耳。",
+			},
+			{
+				key: 0,
+				name: "长音",
+				octave: 0,
+				step: 0,
+				realKey: 0,
+				realName:
+					"长音的吹奏,要求音量平稳,不可忽大忽小,音与音之间,要流畅的连接,不可断断续续。\n短音与重音需运用“踢舌”的技巧,将舌尖抵住上腭牙齿与牙龈的相接处,于吹气时瞬间将舌头缩回,这样的声音干净有力,听起来有活泼欢乐的感觉。",
+			},
+			{
+				key: 0,
+				name: "滑音",
+				octave: 0,
+				step: 0,
+				realKey: 0,
+				realName:
+					"开合气孔的方式,一般是直接提高手指,音阶瞬间转换,另一种方式是将手指向陶笛外侧慢慢滑开,如此可以产生优美的滑音。",
+			},
+			{
+				key: 0,
+				name: "圆滑音",
+				octave: 0,
+				step: 0,
+				realKey: 0,
+				realName:
+					"在两个以上不同高的音符之间加上“”记号,此记号成为圆滑线,它的吹法是用一口气连接的吹完整串音符,中间气不间断,注意第一个音仍要踢舌!",
+			},
+			{
+				key: 0,
+				name: "气震音",
+				octave: 0,
+				step: 0,
+				realKey: 0,
+				realName:
+					"气震音是指在吹奏中用气流的变化来让发出的音发生波动,产生颤抖的感觉,所以又称气颤音,靠腹部控制,又叫腹震音。",
+			},
+			{
+				key: 0,
+				name: "呼吸方法",
+				octave: 0,
+				step: 0,
+				realKey: 0,
+				realName:
+					"使用胸腹式呼吸法是一种比较科学的呼吸方法,大致分为两个步骤,吸气速度要快,胸腹要做到联合动作,让胸腹快速吸到更多的气,也可以用口协助吸气。",
+			},
+		],
+		tones: [
+			{
+				key: 1,
+				name: "C",
+				octave: 5,
+				step: 0,
+				realKey: 0,
+				realName: "",
+			},
+			{
+				key: 1,
+				name: "C",
+				octave: 5,
+				step: 0,
+				mark: "rise",
+				realKey: 0,
+				realName: "Db5",
+			},
+			{
+				key: 2,
+				name: "D",
+				octave: 5,
+				step: 0,
+				realKey: 0,
+				realName: "D5",
+			},
+			{
+				key: 2,
+				name: "D",
+				octave: 5,
+				step: 0,
+				mark: "rise",
+				realKey: 0,
+				realName: "Eb5",
+			},
+			{
+				key: 3,
+				name: "E",
+				octave: 5,
+				step: 0,
+				realKey: 0,
+				realName: "E5",
+			},
+			{
+				key: 4,
+				name: "F",
+				octave: 5,
+				step: 0,
+				realKey: 0,
+				realName: "F5",
+			},
+			{
+				key: 4,
+				name: "F",
+				octave: 5,
+				step: 0,
+				mark: "rise",
+				realKey: 0,
+				realName: "Gb5",
+			},
+			{
+				key: 5,
+				name: "G",
+				octave: 5,
+				step: 0,
+				realKey: 0,
+				realName: "G5",
+			},
+			{
+				key: 5,
+				name: "G",
+				octave: 5,
+				step: 0,
+				mark: "rise",
+				realKey: 0,
+				realName: "Ab5",
+			},
+			{
+				key: 6,
+				name: "A",
+				octave: 5,
+				step: 0,
+				realKey: 0,
+				realName: "A5",
+			},
+			{
+				key: 6,
+				name: "A",
+				octave: 5,
+				step: 0,
+				mark: "rise",
+				realKey: 0,
+				realName: "Bb5",
+			},
+			{
+				key: 7,
+				name: "B",
+				octave: 5,
+				step: 0,
+				realKey: 0,
+				realName: "B5",
+			},
+		],
+		list: [
+			{
+				key: 6,
+				name: "A",
+				octave: 4,
+				step: -1,
+				realKey: 57,
+				realName: "A4",
+			},
+			{
+				key: 7,
+				name: "B",
+				octave: 4,
+				step: -1,
+				realKey: 58,
+				mark: "fall",
+				realName: "Bb4",
+			},
+			{
+				key: 7,
+				name: "B",
+				octave: 4,
+				step: -1,
+				realKey: 59,
+				realName: "B4",
+			},
+			{
+				key: 1,
+				name: "C",
+				octave: 5,
+				step: 0,
+				realKey: 60,
+				realName: "C5",
+			},
+			{
+				key: 2,
+				name: "D",
+				octave: 5,
+				step: 0,
+				realKey: 61,
+				mark: "fall",
+				realName: "Db5",
+			},
+			{
+				key: 2,
+				name: "D",
+				octave: 5,
+				step: 0,
+				realKey: 62,
+				realName: "D5",
+			},
+			{
+				key: 3,
+				name: "E",
+				octave: 5,
+				step: 0,
+				realKey: 63,
+				mark: "fall",
+				realName: "Eb5",
+			},
+			{
+				key: 3,
+				name: "E",
+				octave: 5,
+				step: 0,
+				realKey: 64,
+				realName: "E5",
+			},
+			{
+				key: 4,
+				name: "F",
+				octave: 5,
+				step: 0,
+				realKey: 65,
+				realName: "F5",
+			},
+			{
+				key: 5,
+				name: "G",
+				octave: 5,
+				step: 0,
+				realKey: 66,
+				mark: "fall",
+				realName: "Gb5",
+			},
+			{
+				key: 5,
+				name: "G",
+				octave: 5,
+				step: 0,
+				realKey: 67,
+				realName: "G5",
+			},
+			{
+				key: 6,
+				name: "A",
+				octave: 5,
+				step: 0,
+				realKey: 68,
+				mark: "fall",
+				realName: "Ab5",
+			},
+			{
+				key: 6,
+				name: "A",
+				octave: 5,
+				step: 0,
+				realKey: 69,
+				realName: "A5",
+			},
+			{
+				key: 7,
+				name: "B",
+				octave: 5,
+				step: 0,
+				realKey: 70,
+				mark: "fall",
+				realName: "Bb5",
+			},
+			{
+				key: 7,
+				name: "B",
+				octave: 5,
+				step: 0,
+				realKey: 71,
+				realName: "B5",
+			},
+			{
+				key: 1,
+				name: "C",
+				octave: 6,
+				step: 1,
+				realKey: 72,
+				realName: "C6",
+			},
+			{
+				key: 2,
+				name: "D",
+				octave: 6,
+				step: 1,
+				realKey: 73,
+				mark: "fall",
+				realName: "Db6",
+			},
+			{
+				key: 2,
+				name: "D",
+				octave: 6,
+				step: 1,
+				realKey: 74,
+				realName: "D6",
+			},
+			{
+				key: 3,
+				name: "E",
+				octave: 6,
+				step: 1,
+				realKey: 75,
+				mark: "fall",
+				realName: "Eb6",
+			},
+			{
+				key: 3,
+				name: "E",
+				octave: 6,
+				step: 1,
+				realKey: 76,
+				realName: "E6",
+			},
+			{
+				key: 4,
+				name: "F",
+				octave: 6,
+				step: 1,
+				realKey: 77,
+				realName: "F6",
+			},
+		],
+		listDb5: [
+			{
+				key: 5,
+				step: -1,
+				mark: "rise",
+				name: "A",
+				octave: 4,
+				realKey: 57,
+				realName: "A4",
+			},
+			{
+				key: 6,
+				step: -1,
+				name: "B",
+				octave: 4,
+				realKey: 58,
+				realName: "Bb4",
+			},
+			{
+				key: 6,
+				step: -1,
+				mark: "rise",
+				name: "B",
+				octave: 4,
+				realKey: 59,
+				realName: "B4",
+			},
+			{
+				key: 7,
+				step: -1,
+				name: "C",
+				octave: 5,
+				realKey: 60,
+				realName: "C5",
+			},
+			{
+				key: 1,
+				step: 0,
+				name: "D",
+				octave: 5,
+				realKey: 61,
+				realName: "Db5",
+			},
+			{
+				key: 1,
+				step: 0,
+				mark: "rise",
+				name: "D",
+				octave: 5,
+				realKey: 62,
+				realName: "D5",
+			},
+			{
+				key: 2,
+				step: 0,
+				name: "E",
+				octave: 5,
+				realKey: 63,
+				realName: "Eb5",
+			},
+			{
+				key: 2,
+				step: 0,
+				mark: "rise",
+				name: "E",
+				octave: 5,
+				realKey: 64,
+				realName: "E5",
+			},
+			{
+				key: 3,
+				step: 0,
+				name: "F",
+				octave: 5,
+				realKey: 65,
+				realName: "F5",
+			},
+			{
+				key: 4,
+				step: 0,
+				name: "G",
+				octave: 5,
+				realKey: 66,
+				realName: "Gb5",
+			},
+			{
+				key: 4,
+				step: 0,
+				mark: "rise",
+				name: "G",
+				octave: 5,
+				realKey: 67,
+				realName: "G5",
+			},
+			{
+				key: 5,
+				step: 0,
+				name: "A",
+				octave: 5,
+				realKey: 68,
+				realName: "Ab5",
+			},
+			{
+				key: 5,
+				step: 0,
+				mark: "rise",
+				name: "A",
+				octave: 5,
+				realKey: 69,
+				realName: "A5",
+			},
+			{
+				key: 6,
+				step: 0,
+				name: "B",
+				octave: 5,
+				realKey: 70,
+				realName: "Bb5",
+			},
+			{
+				key: 6,
+				step: 0,
+				mark: "rise",
+				name: "B",
+				octave: 5,
+				realKey: 71,
+				realName: "B5",
+			},
+			{
+				key: 7,
+				step: 0,
+				name: "C",
+				octave: 6,
+				realKey: 72,
+				realName: "C6",
+			},
+			{
+				key: 1,
+				step: 1,
+				name: "D",
+				octave: 6,
+				realKey: 73,
+				realName: "Db6",
+			},
+			{
+				key: 1,
+				step: 1,
+				mark: "rise",
+				name: "D",
+				octave: 6,
+				realKey: 74,
+				realName: "D6",
+			},
+			{
+				key: 2,
+				step: 1,
+				name: "E",
+				octave: 6,
+				realKey: 75,
+				realName: "Eb6",
+			},
+			{
+				key: 2,
+				step: 1,
+				mark: "rise",
+				name: "E",
+				octave: 6,
+				realKey: 76,
+				realName: "E6",
+			},
+			{
+				key: 3,
+				step: 1,
+				name: "F",
+				octave: 6,
+				realKey: 77,
+				realName: "F6",
+			},
+		],
+		listD5: [
+			{
+				key: 5,
+				step: -1,
+				name: "A",
+				octave: 4,
+				realKey: 57,
+				realName: "A4",
+			},
+			{
+				key: 5,
+				step: -1,
+				mark: "rise",
+				name: "B",
+				octave: 4,
+				realKey: 58,
+				realName: "Bb4",
+			},
+			{
+				key: 6,
+				step: -1,
+				name: "B",
+				octave: 4,
+				realKey: 59,
+				realName: "B4",
+			},
+			{
+				key: 6,
+				step: -1,
+				mark: "rise",
+				name: "C",
+				octave: 5,
+				realKey: 60,
+				realName: "C5",
+			},
+			{
+				key: 7,
+				step: -1,
+				name: "D",
+				octave: 5,
+				realKey: 61,
+				realName: "Db5",
+			},
+			{
+				key: 1,
+				step: 0,
+				name: "D",
+				octave: 5,
+				realKey: 62,
+				realName: "D5",
+			},
+			{
+				key: 1,
+				step: 0,
+				mark: "rise",
+				name: "E",
+				octave: 5,
+				realKey: 63,
+				realName: "Eb5",
+			},
+			{
+				key: 2,
+				step: 0,
+				name: "E",
+				octave: 5,
+				realKey: 64,
+				realName: "E5",
+			},
+			{
+				key: 2,
+				step: 0,
+				mark: "rise",
+				name: "F",
+				octave: 5,
+				realKey: 65,
+				realName: "F5",
+			},
+			{
+				key: 3,
+				step: 0,
+				name: "G",
+				octave: 5,
+				realKey: 66,
+				realName: "Gb5",
+			},
+			{
+				key: 4,
+				step: 0,
+				name: "G",
+				octave: 5,
+				realKey: 67,
+				realName: "G5",
+			},
+			{
+				key: 4,
+				step: 0,
+				mark: "rise",
+				name: "A",
+				octave: 5,
+				realKey: 68,
+				realName: "Ab5",
+			},
+			{
+				key: 5,
+				step: 0,
+				name: "A",
+				octave: 5,
+				realKey: 69,
+				realName: "A5",
+			},
+			{
+				key: 5,
+				step: 0,
+				mark: "rise",
+				name: "B",
+				octave: 5,
+				realKey: 70,
+				realName: "Bb5",
+			},
+			{
+				key: 6,
+				step: 0,
+				name: "B",
+				octave: 5,
+				realKey: 71,
+				realName: "B5",
+			},
+			{
+				key: 6,
+				step: 0,
+				mark: "rise",
+				name: "C",
+				octave: 6,
+				realKey: 72,
+				realName: "C6",
+			},
+			{
+				key: 7,
+				step: 0,
+				name: "D",
+				octave: 6,
+				realKey: 73,
+				realName: "Db6",
+			},
+			{
+				key: 1,
+				step: 1,
+				name: "D",
+				octave: 6,
+				realKey: 74,
+				realName: "D6",
+			},
+			{
+				key: 1,
+				step: 1,
+				mark: "rise",
+				name: "E",
+				octave: 6,
+				realKey: 75,
+				realName: "Eb6",
+			},
+			{
+				key: 2,
+				step: 1,
+				name: "E",
+				octave: 6,
+				realKey: 76,
+				realName: "E6",
+			},
+			{
+				key: 2,
+				step: 1,
+				mark: "rise",
+				name: "F",
+				octave: 6,
+				realKey: 77,
+				realName: "F6",
+			},
+		],
+		listEb5: [
+			{
+				key: 4,
+				step: -1,
+				mark: "rise",
+				name: "A",
+				octave: 4,
+				realKey: 57,
+				realName: "A4",
+			},
+			{
+				key: 5,
+				step: -1,
+				name: "B",
+				octave: 4,
+				realKey: 58,
+				realName: "Bb4",
+			},
+			{
+				key: 5,
+				step: -1,
+				mark: "rise",
+				name: "B",
+				octave: 4,
+				realKey: 59,
+				realName: "B4",
+			},
+			{
+				key: 6,
+				step: -1,
+				name: "C",
+				octave: 5,
+				realKey: 60,
+				realName: "C5",
+			},
+			{
+				key: 6,
+				step: -1,
+				mark: "rise",
+				name: "D",
+				octave: 5,
+				realKey: 61,
+				realName: "Db5",
+			},
+			{
+				key: 7,
+				step: -1,
+				name: "D",
+				octave: 5,
+				realKey: 62,
+				realName: "D5",
+			},
+			{
+				key: 1,
+				step: 0,
+				name: "E",
+				octave: 5,
+				realKey: 63,
+				realName: "Eb5",
+			},
+			{
+				key: 1,
+				step: 0,
+				mark: "rise",
+				name: "E",
+				octave: 5,
+				realKey: 64,
+				realName: "E5",
+			},
+			{
+				key: 2,
+				step: 0,
+				name: "F",
+				octave: 5,
+				realKey: 65,
+				realName: "F5",
+			},
+			{
+				key: 2,
+				step: 0,
+				mark: "rise",
+				name: "G",
+				octave: 5,
+				realKey: 66,
+				realName: "Gb5",
+			},
+			{
+				key: 3,
+				step: 0,
+				name: "G",
+				octave: 5,
+				realKey: 67,
+				realName: "G5",
+			},
+			{
+				key: 4,
+				step: 0,
+				name: "A",
+				octave: 5,
+				realKey: 68,
+				realName: "Ab5",
+			},
+			{
+				key: 4,
+				step: 0,
+				mark: "rise",
+				name: "A",
+				octave: 5,
+				realKey: 69,
+				realName: "A5",
+			},
+			{
+				key: 5,
+				step: 0,
+				name: "B",
+				octave: 5,
+				realKey: 70,
+				realName: "Bb5",
+			},
+			{
+				key: 5,
+				step: 0,
+				mark: "rise",
+				name: "B",
+				octave: 5,
+				realKey: 71,
+				realName: "B5",
+			},
+			{
+				key: 6,
+				step: 0,
+				name: "C",
+				octave: 6,
+				realKey: 72,
+				realName: "C6",
+			},
+			{
+				key: 6,
+				step: 0,
+				mark: "rise",
+				name: "D",
+				octave: 6,
+				realKey: 73,
+				realName: "Db6",
+			},
+			{
+				key: 7,
+				step: 0,
+				name: "D",
+				octave: 6,
+				realKey: 74,
+				realName: "D6",
+			},
+			{
+				key: 1,
+				step: 1,
+				name: "E",
+				octave: 6,
+				realKey: 75,
+				realName: "Eb6",
+			},
+			{
+				key: 1,
+				step: 1,
+				mark: "rise",
+				name: "E",
+				octave: 6,
+				realKey: 76,
+				realName: "E6",
+			},
+			{
+				key: 2,
+				step: 1,
+				name: "F",
+				octave: 6,
+				realKey: 77,
+				realName: "F6",
+			},
+		],
+		listE5: [
+			{
+				key: 4,
+				step: -1,
+				name: "A",
+				octave: 4,
+				realKey: 57,
+				realName: "A4",
+			},
+			{
+				key: 4,
+				step: -1,
+				mark: "rise",
+				name: "B",
+				octave: 4,
+				realKey: 58,
+				realName: "Bb4",
+			},
+			{
+				key: 5,
+				step: -1,
+				name: "B",
+				octave: 4,
+				realKey: 59,
+				realName: "B4",
+			},
+			{
+				key: 5,
+				step: -1,
+				mark: "rise",
+				name: "C",
+				octave: 5,
+				realKey: 60,
+				realName: "C5",
+			},
+			{
+				key: 6,
+				step: -1,
+				name: "D",
+				octave: 5,
+				realKey: 61,
+				realName: "Db5",
+			},
+			{
+				key: 6,
+				step: -1,
+				mark: "rise",
+				name: "D",
+				octave: 5,
+				realKey: 62,
+				realName: "D5",
+			},
+			{
+				key: 7,
+				step: -1,
+				name: "E",
+				octave: 5,
+				realKey: 63,
+				realName: "Eb5",
+			},
+			{
+				key: 1,
+				step: 0,
+				name: "E",
+				octave: 5,
+				realKey: 64,
+				realName: "E5",
+			},
+			{
+				key: 1,
+				step: 0,
+				mark: "rise",
+				name: "F",
+				octave: 5,
+				realKey: 65,
+				realName: "F5",
+			},
+			{
+				key: 2,
+				step: 0,
+				name: "G",
+				octave: 5,
+				realKey: 66,
+				realName: "Gb5",
+			},
+			{
+				key: 2,
+				step: 0,
+				mark: "rise",
+				name: "G",
+				octave: 5,
+				realKey: 67,
+				realName: "G5",
+			},
+			{
+				key: 3,
+				step: 0,
+				name: "A",
+				octave: 5,
+				realKey: 68,
+				realName: "Ab5",
+			},
+			{
+				key: 4,
+				step: 0,
+				name: "A",
+				octave: 5,
+				realKey: 69,
+				realName: "A5",
+			},
+			{
+				key: 4,
+				step: 0,
+				mark: "rise",
+				name: "B",
+				octave: 5,
+				realKey: 70,
+				realName: "Bb5",
+			},
+			{
+				key: 5,
+				step: 0,
+				name: "B",
+				octave: 5,
+				realKey: 71,
+				realName: "B5",
+			},
+			{
+				key: 5,
+				step: 0,
+				mark: "rise",
+				name: "C",
+				octave: 6,
+				realKey: 72,
+				realName: "C6",
+			},
+			{
+				key: 6,
+				step: 0,
+				name: "D",
+				octave: 6,
+				realKey: 73,
+				realName: "Db6",
+			},
+			{
+				key: 6,
+				step: 0,
+				mark: "rise",
+				name: "D",
+				octave: 6,
+				realKey: 74,
+				realName: "D6",
+			},
+			{
+				key: 7,
+				step: 0,
+				name: "E",
+				octave: 6,
+				realKey: 75,
+				realName: "Eb6",
+			},
+			{
+				key: 1,
+				step: 1,
+				name: "E",
+				octave: 6,
+				realKey: 76,
+				realName: "E6",
+			},
+			{
+				key: 1,
+				step: 1,
+				mark: "rise",
+				name: "F",
+				octave: 6,
+				realKey: 77,
+				realName: "F6",
+			},
+		],
+		listF5: [
+			{
+				key: 3,
+				step: -1,
+				name: "A",
+				octave: 4,
+				realKey: 57,
+				realName: "A4",
+			},
+			{
+				key: 4,
+				step: -1,
+				name: "B",
+				octave: 4,
+				realKey: 58,
+				realName: "Bb4",
+			},
+			{
+				key: 4,
+				step: -1,
+				mark: "rise",
+				name: "B",
+				octave: 4,
+				realKey: 59,
+				realName: "B4",
+			},
+			{
+				key: 5,
+				step: -1,
+				name: "C",
+				octave: 5,
+				realKey: 60,
+				realName: "C5",
+			},
+			{
+				key: 5,
+				step: -1,
+				mark: "rise",
+				name: "D",
+				octave: 5,
+				realKey: 61,
+				realName: "Db5",
+			},
+			{
+				key: 6,
+				step: -1,
+				name: "D",
+				octave: 5,
+				realKey: 62,
+				realName: "D5",
+			},
+			{
+				key: 6,
+				step: -1,
+				mark: "rise",
+				name: "E",
+				octave: 5,
+				realKey: 63,
+				realName: "Eb5",
+			},
+			{
+				key: 7,
+				step: -1,
+				name: "E",
+				octave: 5,
+				realKey: 64,
+				realName: "E5",
+			},
+			{
+				key: 1,
+				step: 0,
+				name: "F",
+				octave: 5,
+				realKey: 65,
+				realName: "F5",
+			},
+			{
+				key: 1,
+				step: 0,
+				mark: "rise",
+				name: "G",
+				octave: 5,
+				realKey: 66,
+				realName: "Gb5",
+			},
+			{
+				key: 2,
+				step: 0,
+				name: "G",
+				octave: 5,
+				realKey: 67,
+				realName: "G5",
+			},
+			{
+				key: 2,
+				step: 0,
+				mark: "rise",
+				name: "A",
+				octave: 5,
+				realKey: 68,
+				realName: "Ab5",
+			},
+			{
+				key: 3,
+				step: 0,
+				name: "A",
+				octave: 5,
+				realKey: 69,
+				realName: "A5",
+			},
+			{
+				key: 4,
+				step: 0,
+				name: "B",
+				octave: 5,
+				realKey: 70,
+				realName: "Bb5",
+			},
+			{
+				key: 4,
+				step: 0,
+				mark: "rise",
+				name: "B",
+				octave: 5,
+				realKey: 71,
+				realName: "B5",
+			},
+			{
+				key: 5,
+				step: 0,
+				name: "C",
+				octave: 6,
+				realKey: 72,
+				realName: "C6",
+			},
+			{
+				key: 5,
+				step: 0,
+				mark: "rise",
+				name: "D",
+				octave: 6,
+				realKey: 73,
+				realName: "Db6",
+			},
+			{
+				key: 6,
+				step: 0,
+				name: "D",
+				octave: 6,
+				realKey: 74,
+				realName: "D6",
+			},
+			{
+				key: 6,
+				step: 0,
+				mark: "rise",
+				name: "E",
+				octave: 6,
+				realKey: 75,
+				realName: "Eb6",
+			},
+			{
+				key: 7,
+				step: 0,
+				name: "E",
+				octave: 6,
+				realKey: 76,
+				realName: "E6",
+			},
+			{
+				key: 1,
+				step: 1,
+				name: "F",
+				octave: 6,
+				realKey: 77,
+				realName: "F6",
+			},
+		],
+		listGb5: [
+			{
+				key: 2,
+				step: -1,
+				mark: "rise",
+				name: "A",
+				octave: 4,
+				realKey: 57,
+				realName: "A4",
+			},
+			{
+				key: 3,
+				step: -1,
+				name: "B",
+				octave: 4,
+				realKey: 58,
+				realName: "Bb4",
+			},
+			{
+				key: 4,
+				step: -1,
+				name: "B",
+				octave: 4,
+				realKey: 59,
+				realName: "B4",
+			},
+			{
+				key: 4,
+				step: -1,
+				mark: "rise",
+				name: "C",
+				octave: 5,
+				realKey: 60,
+				realName: "C5",
+			},
+			{
+				key: 5,
+				step: -1,
+				name: "D",
+				octave: 5,
+				realKey: 61,
+				realName: "Db5",
+			},
+			{
+				key: 5,
+				step: -1,
+				mark: "rise",
+				name: "D",
+				octave: 5,
+				realKey: 62,
+				realName: "D5",
+			},
+			{
+				key: 6,
+				step: -1,
+				name: "E",
+				octave: 5,
+				realKey: 63,
+				realName: "Eb5",
+			},
+			{
+				key: 6,
+				step: -1,
+				mark: "rise",
+				name: "E",
+				octave: 5,
+				realKey: 64,
+				realName: "E5",
+			},
+			{
+				key: 7,
+				step: -1,
+				name: "F",
+				octave: 5,
+				realKey: 65,
+				realName: "F5",
+			},
+			{
+				key: 1,
+				step: 0,
+				name: "G",
+				octave: 5,
+				realKey: 66,
+				realName: "Gb5",
+			},
+			{
+				key: 1,
+				step: 0,
+				mark: "rise",
+				name: "G",
+				octave: 5,
+				realKey: 67,
+				realName: "G5",
+			},
+			{
+				key: 2,
+				step: 0,
+				name: "A",
+				octave: 5,
+				realKey: 68,
+				realName: "Ab5",
+			},
+			{
+				key: 2,
+				step: 0,
+				mark: "rise",
+				name: "A",
+				octave: 5,
+				realKey: 69,
+				realName: "A5",
+			},
+			{
+				key: 3,
+				step: 0,
+				name: "B",
+				octave: 5,
+				realKey: 70,
+				realName: "Bb5",
+			},
+			{
+				key: 4,
+				step: 0,
+				name: "B",
+				octave: 5,
+				realKey: 71,
+				realName: "B5",
+			},
+			{
+				key: 4,
+				step: 0,
+				mark: "rise",
+				name: "C",
+				octave: 6,
+				realKey: 72,
+				realName: "C6",
+			},
+			{
+				key: 5,
+				step: 0,
+				name: "D",
+				octave: 6,
+				realKey: 73,
+				realName: "Db6",
+			},
+			{
+				key: 5,
+				step: 0,
+				mark: "rise",
+				name: "D",
+				octave: 6,
+				realKey: 74,
+				realName: "D6",
+			},
+			{
+				key: 6,
+				step: 0,
+				name: "E",
+				octave: 6,
+				realKey: 75,
+				realName: "Eb6",
+			},
+			{
+				key: 6,
+				step: 0,
+				mark: "rise",
+				name: "E",
+				octave: 6,
+				realKey: 76,
+				realName: "E6",
+			},
+			{
+				key: 7,
+				step: 0,
+				name: "F",
+				octave: 6,
+				realKey: 77,
+				realName: "F6",
+			},
+		],
+		listG5: [
+			{
+				key: 2,
+				step: -1,
+				name: "A",
+				octave: 4,
+				realKey: 57,
+				realName: "A4",
+			},
+			{
+				key: 2,
+				step: -1,
+				mark: "rise",
+				name: "B",
+				octave: 4,
+				realKey: 58,
+				realName: "Bb4",
+			},
+			{
+				key: 3,
+				step: -1,
+				name: "B",
+				octave: 4,
+				realKey: 59,
+				realName: "B4",
+			},
+			{
+				key: 4,
+				step: -1,
+				name: "C",
+				octave: 5,
+				realKey: 60,
+				realName: "C5",
+			},
+			{
+				key: 4,
+				step: -1,
+				mark: "rise",
+				name: "D",
+				octave: 5,
+				realKey: 61,
+				realName: "Db5",
+			},
+			{
+				key: 5,
+				step: -1,
+				name: "D",
+				octave: 5,
+				realKey: 62,
+				realName: "D5",
+			},
+			{
+				key: 5,
+				step: -1,
+				mark: "rise",
+				name: "E",
+				octave: 5,
+				realKey: 63,
+				realName: "Eb5",
+			},
+			{
+				key: 6,
+				step: -1,
+				name: "E",
+				octave: 5,
+				realKey: 64,
+				realName: "E5",
+			},
+			{
+				key: 6,
+				step: -1,
+				mark: "rise",
+				name: "F",
+				octave: 5,
+				realKey: 65,
+				realName: "F5",
+			},
+			{
+				key: 7,
+				step: -1,
+				name: "G",
+				octave: 5,
+				realKey: 66,
+				realName: "Gb5",
+			},
+			{
+				key: 1,
+				step: 0,
+				name: "G",
+				octave: 5,
+				realKey: 67,
+				realName: "G5",
+			},
+			{
+				key: 1,
+				step: 0,
+				mark: "rise",
+				name: "A",
+				octave: 5,
+				realKey: 68,
+				realName: "Ab5",
+			},
+			{
+				key: 2,
+				step: 0,
+				name: "A",
+				octave: 5,
+				realKey: 69,
+				realName: "A5",
+			},
+			{
+				key: 2,
+				step: 0,
+				mark: "rise",
+				name: "B",
+				octave: 5,
+				realKey: 70,
+				realName: "Bb5",
+			},
+			{
+				key: 3,
+				step: 0,
+				name: "B",
+				octave: 5,
+				realKey: 71,
+				realName: "B5",
+			},
+			{
+				key: 4,
+				step: 0,
+				name: "C",
+				octave: 6,
+				realKey: 72,
+				realName: "C6",
+			},
+			{
+				key: 4,
+				step: 0,
+				mark: "rise",
+				name: "D",
+				octave: 6,
+				realKey: 73,
+				realName: "Db6",
+			},
+			{
+				key: 5,
+				step: 0,
+				name: "D",
+				octave: 6,
+				realKey: 74,
+				realName: "D6",
+			},
+			{
+				key: 5,
+				step: 0,
+				mark: "rise",
+				name: "E",
+				octave: 6,
+				realKey: 75,
+				realName: "Eb6",
+			},
+			{
+				key: 6,
+				step: 0,
+				name: "E",
+				octave: 6,
+				realKey: 76,
+				realName: "E6",
+			},
+			{
+				key: 6,
+				step: 0,
+				mark: "rise",
+				name: "F",
+				octave: 6,
+				realKey: 77,
+				realName: "F6",
+			},
+		],
+		listAb5: [
+			{
+				key: 1,
+				step: -1,
+				mark: "rise",
+				name: "A",
+				octave: 4,
+				realKey: 57,
+				realName: "A4",
+			},
+			{
+				key: 2,
+				step: -1,
+				name: "B",
+				octave: 4,
+				realKey: 58,
+				realName: "Bb4",
+			},
+			{
+				key: 2,
+				step: -1,
+				mark: "rise",
+				name: "B",
+				octave: 4,
+				realKey: 59,
+				realName: "B4",
+			},
+			{
+				key: 3,
+				step: -1,
+				name: "C",
+				octave: 5,
+				realKey: 60,
+				realName: "C5",
+			},
+			{
+				key: 4,
+				step: -1,
+				name: "D",
+				octave: 5,
+				realKey: 61,
+				realName: "Db5",
+			},
+			{
+				key: 4,
+				step: -1,
+				mark: "rise",
+				name: "D",
+				octave: 5,
+				realKey: 62,
+				realName: "D5",
+			},
+			{
+				key: 5,
+				step: -1,
+				name: "E",
+				octave: 5,
+				realKey: 63,
+				realName: "Eb5",
+			},
+			{
+				key: 5,
+				step: -1,
+				mark: "rise",
+				name: "E",
+				octave: 5,
+				realKey: 64,
+				realName: "E5",
+			},
+			{
+				key: 6,
+				step: -1,
+				name: "F",
+				octave: 5,
+				realKey: 65,
+				realName: "F5",
+			},
+			{
+				key: 6,
+				step: -1,
+				mark: "rise",
+				name: "G",
+				octave: 5,
+				realKey: 66,
+				realName: "Gb5",
+			},
+			{
+				key: 7,
+				step: -1,
+				name: "G",
+				octave: 5,
+				realKey: 67,
+				realName: "G5",
+			},
+			{
+				key: 1,
+				step: 0,
+				name: "A",
+				octave: 5,
+				realKey: 68,
+				realName: "Ab5",
+			},
+			{
+				key: 1,
+				step: 0,
+				mark: "rise",
+				name: "A",
+				octave: 5,
+				realKey: 69,
+				realName: "A5",
+			},
+			{
+				key: 2,
+				step: 0,
+				name: "B",
+				octave: 5,
+				realKey: 70,
+				realName: "Bb5",
+			},
+			{
+				key: 2,
+				step: 0,
+				mark: "rise",
+				name: "B",
+				octave: 5,
+				realKey: 71,
+				realName: "B5",
+			},
+			{
+				key: 3,
+				step: 0,
+				name: "C",
+				octave: 6,
+				realKey: 72,
+				realName: "C6",
+			},
+			{
+				key: 4,
+				step: 0,
+				name: "D",
+				octave: 6,
+				realKey: 73,
+				realName: "Db6",
+			},
+			{
+				key: 4,
+				step: 0,
+				mark: "rise",
+				name: "D",
+				octave: 6,
+				realKey: 74,
+				realName: "D6",
+			},
+			{
+				key: 5,
+				step: 0,
+				name: "E",
+				octave: 6,
+				realKey: 75,
+				realName: "Eb6",
+			},
+			{
+				key: 5,
+				step: 0,
+				mark: "rise",
+				name: "E",
+				octave: 6,
+				realKey: 76,
+				realName: "E6",
+			},
+			{
+				key: 6,
+				step: 0,
+				name: "F",
+				octave: 6,
+				realKey: 77,
+				realName: "F6",
+			},
+		],
+		listA5: [
+			{
+				key: 1,
+				step: 0,
+				name: "A",
+				octave: 4,
+				realKey: 57,
+				realName: "A4",
+			},
+			{
+				key: 1,
+				step: 0,
+				mark: "rise",
+				name: "B",
+				octave: 4,
+				realKey: 58,
+				realName: "Bb4",
+			},
+			{
+				key: 2,
+				step: 0,
+				name: "B",
+				octave: 4,
+				realKey: 59,
+				realName: "B4",
+			},
+			{
+				key: 2,
+				step: 0,
+				mark: "rise",
+				name: "C",
+				octave: 5,
+				realKey: 60,
+				realName: "C5",
+			},
+			{
+				key: 3,
+				step: 0,
+				name: "D",
+				octave: 5,
+				realKey: 61,
+				realName: "Db5",
+			},
+			{
+				key: 4,
+				step: 0,
+				name: "D",
+				octave: 5,
+				realKey: 62,
+				realName: "D5",
+			},
+			{
+				key: 4,
+				step: 0,
+				mark: "rise",
+				name: "E",
+				octave: 5,
+				realKey: 63,
+				realName: "Eb5",
+			},
+			{
+				key: 5,
+				step: 0,
+				name: "E",
+				octave: 5,
+				realKey: 64,
+				realName: "E5",
+			},
+			{
+				key: 5,
+				step: 0,
+				mark: "rise",
+				name: "F",
+				octave: 5,
+				realKey: 65,
+				realName: "F5",
+			},
+			{
+				key: 6,
+				step: 0,
+				name: "G",
+				octave: 5,
+				realKey: 66,
+				realName: "Gb5",
+			},
+			{
+				key: 6,
+				step: 0,
+				mark: "rise",
+				name: "G",
+				octave: 5,
+				realKey: 67,
+				realName: "G5",
+			},
+			{
+				key: 7,
+				step: 0,
+				name: "A",
+				octave: 5,
+				realKey: 68,
+				realName: "Ab5",
+			},
+			{
+				key: 1,
+				step: 1,
+				name: "A",
+				octave: 5,
+				realKey: 69,
+				realName: "A5",
+			},
+			{
+				key: 1,
+				step: 1,
+				mark: "rise",
+				name: "B",
+				octave: 5,
+				realKey: 70,
+				realName: "Bb5",
+			},
+			{
+				key: 2,
+				step: 1,
+				name: "B",
+				octave: 5,
+				realKey: 71,
+				realName: "B5",
+			},
+			{
+				key: 2,
+				step: 1,
+				mark: "rise",
+				name: "C",
+				octave: 6,
+				realKey: 72,
+				realName: "C6",
+			},
+			{
+				key: 3,
+				step: 1,
+				name: "D",
+				octave: 6,
+				realKey: 73,
+				realName: "Db6",
+			},
+			{
+				key: 4,
+				step: 1,
+				name: "D",
+				octave: 6,
+				realKey: 74,
+				realName: "D6",
+			},
+			{
+				key: 4,
+				step: 1,
+				mark: "rise",
+				name: "E",
+				octave: 6,
+				realKey: 75,
+				realName: "Eb6",
+			},
+			{
+				key: 5,
+				step: 1,
+				name: "E",
+				octave: 6,
+				realKey: 76,
+				realName: "E6",
+			},
+			{
+				key: 5,
+				step: 1,
+				mark: "rise",
+				name: "F",
+				octave: 6,
+				realKey: 77,
+				realName: "F6",
+			},
+		],
+		listBb5: [
+			{
+				key: 7,
+				step: -1,
+				name: "A",
+				octave: 4,
+				realKey: 57,
+				realName: "A4",
+			},
+			{
+				key: 1,
+				step: 0,
+				name: "B",
+				octave: 4,
+				realKey: 58,
+				realName: "Bb4",
+			},
+			{
+				key: 1,
+				step: 0,
+				mark: "rise",
+				name: "B",
+				octave: 4,
+				realKey: 59,
+				realName: "B4",
+			},
+			{
+				key: 2,
+				step: 0,
+				name: "C",
+				octave: 5,
+				realKey: 60,
+				realName: "C5",
+			},
+			{
+				key: 2,
+				step: 0,
+				mark: "rise",
+				name: "D",
+				octave: 5,
+				realKey: 61,
+				realName: "Db5",
+			},
+			{
+				key: 3,
+				step: 0,
+				name: "D",
+				octave: 5,
+				realKey: 62,
+				realName: "D5",
+			},
+			{
+				key: 4,
+				step: 0,
+				name: "E",
+				octave: 5,
+				realKey: 63,
+				realName: "Eb5",
+			},
+			{
+				key: 4,
+				step: 0,
+				mark: "rise",
+				name: "E",
+				octave: 5,
+				realKey: 64,
+				realName: "E5",
+			},
+			{
+				key: 5,
+				step: 0,
+				name: "F",
+				octave: 5,
+				realKey: 65,
+				realName: "F5",
+			},
+			{
+				key: 5,
+				step: 0,
+				mark: "rise",
+				name: "G",
+				octave: 5,
+				realKey: 66,
+				realName: "Gb5",
+			},
+			{
+				key: 6,
+				step: 0,
+				name: "G",
+				octave: 5,
+				realKey: 67,
+				realName: "G5",
+			},
+			{
+				key: 6,
+				step: 0,
+				mark: "rise",
+				name: "A",
+				octave: 5,
+				realKey: 68,
+				realName: "Ab5",
+			},
+			{
+				key: 7,
+				step: 0,
+				name: "A",
+				octave: 5,
+				realKey: 69,
+				realName: "A5",
+			},
+			{
+				key: 1,
+				step: 1,
+				name: "B",
+				octave: 5,
+				realKey: 70,
+				realName: "Bb5",
+			},
+			{
+				key: 1,
+				step: 1,
+				mark: "rise",
+				name: "B",
+				octave: 5,
+				realKey: 71,
+				realName: "B5",
+			},
+			{
+				key: 2,
+				step: 1,
+				name: "C",
+				octave: 6,
+				realKey: 72,
+				realName: "C6",
+			},
+			{
+				key: 2,
+				step: 1,
+				mark: "rise",
+				name: "D",
+				octave: 6,
+				realKey: 73,
+				realName: "Db6",
+			},
+			{
+				key: 3,
+				step: 1,
+				name: "D",
+				octave: 6,
+				realKey: 74,
+				realName: "D6",
+			},
+			{
+				key: 4,
+				step: 1,
+				name: "E",
+				octave: 6,
+				realKey: 75,
+				realName: "Eb6",
+			},
+			{
+				key: 4,
+				step: 1,
+				mark: "rise",
+				name: "E",
+				octave: 6,
+				realKey: 76,
+				realName: "E6",
+			},
+			{
+				key: 5,
+				step: 1,
+				name: "F",
+				octave: 6,
+				realKey: 77,
+				realName: "F6",
+			},
+		],
+		listB5: [
+			{
+				key: 6,
+				step: -1,
+				mark: "rise",
+				name: "A",
+				octave: 4,
+				realKey: 57,
+				realName: "A4",
+			},
+			{
+				key: 7,
+				step: -1,
+				name: "B",
+				octave: 4,
+				realKey: 58,
+				realName: "Bb4",
+			},
+			{
+				key: 1,
+				step: 0,
+				name: "B",
+				octave: 4,
+				realKey: 59,
+				realName: "B4",
+			},
+			{
+				key: 1,
+				step: 0,
+				mark: "rise",
+				name: "C",
+				octave: 5,
+				realKey: 60,
+				realName: "C5",
+			},
+			{
+				key: 2,
+				step: 0,
+				name: "D",
+				octave: 5,
+				realKey: 61,
+				realName: "Db5",
+			},
+			{
+				key: 2,
+				step: 0,
+				mark: "rise",
+				name: "D",
+				octave: 5,
+				realKey: 62,
+				realName: "D5",
+			},
+			{
+				key: 3,
+				step: 0,
+				name: "E",
+				octave: 5,
+				realKey: 63,
+				realName: "Eb5",
+			},
+			{
+				key: 4,
+				step: 0,
+				name: "E",
+				octave: 5,
+				realKey: 64,
+				realName: "E5",
+			},
+			{
+				key: 4,
+				step: 0,
+				mark: "rise",
+				name: "F",
+				octave: 5,
+				realKey: 65,
+				realName: "F5",
+			},
+			{
+				key: 5,
+				step: 0,
+				name: "G",
+				octave: 5,
+				realKey: 66,
+				realName: "Gb5",
+			},
+			{
+				key: 5,
+				step: 0,
+				mark: "rise",
+				name: "G",
+				octave: 5,
+				realKey: 67,
+				realName: "G5",
+			},
+			{
+				key: 6,
+				step: 0,
+				name: "A",
+				octave: 5,
+				realKey: 68,
+				realName: "Ab5",
+			},
+			{
+				key: 6,
+				step: 0,
+				name: "A",
+				octave: 5,
+				realKey: 69,
+				realName: "A5",
+			},
+			{
+				key: 6,
+				step: 0,
+				mark: "rise",
+				name: "B",
+				octave: 5,
+				realKey: 70,
+				realName: "Bb5",
+			},
+			{
+				key: 7,
+				step: 0,
+				name: "B",
+				octave: 5,
+				realKey: 71,
+				realName: "B5",
+			},
+			{
+				key: 1,
+				step: 1,
+				name: "C",
+				octave: 6,
+				realKey: 72,
+				realName: "C6",
+			},
+			{
+				key: 1,
+				step: 1,
+				mark: "rise",
+				name: "D",
+				octave: 6,
+				realKey: 73,
+				realName: "Db6",
+			},
+			{
+				key: 2,
+				step: 1,
+				name: "D",
+				octave: 6,
+				realKey: 74,
+				realName: "D6",
+			},
+			{
+				key: 2,
+				step: 1,
+				mark: "rise",
+				name: "E",
+				octave: 6,
+				realKey: 75,
+				realName: "Eb6",
+			},
+			{
+				key: 3,
+				step: 1,
+				name: "E",
+				octave: 6,
+				realKey: 76,
+				realName: "E6",
+			},
+			{
+				key: 4,
+				step: 1,
+				name: "F",
+				octave: 6,
+				realKey: 77,
+				realName: "F6",
+			},
+		],
+	},	
 	melodica: {
 		tips: [
 			{

+ 47 - 2
src/view/fingering/fingering-config.ts

@@ -57,7 +57,10 @@ export type IVocals =
   | "melodica1"
   | "baroque-recorder"
   | "baroque-recorder1"
-  | "baroque-recorder2";
+  | "baroque-recorder2"
+  | "whistling"
+  | "whistling1"
+  | "whistling2";
 
 /** 映射声部ID */
 export const mappingVoicePart = (id: number | string, soruce: "GYM" | "COLEXIU" | "ORCHESTRA" | "INSTRUMENT" | "ENSEMBLE"): number => {
@@ -138,7 +141,8 @@ export const mappingVoicePart = (id: number | string, soruce: "GYM" | "COLEXIU"
       tenorrecorder: "piccolo",
       woodwind: "hulusi-flute",
       panpipes: "pan-flute",
-      ocarina: "ocarina",
+      ocarina: "ocarina", // 陶笛
+      whistling: "whistling", // 高音陶笛
       nai: "melodica",
       15: "baroque-recorder",
       16: "baroque-recorder",
@@ -458,6 +462,17 @@ export const subjectFingering = (subjectId: number | string): IFingering => {
         hasTizhi: false,
         id: 34,
       };
+    case "whistling": // 高音陶笛
+      return {
+        name: "whistling",
+        direction: "vertical",
+        width: "3rem",
+        disabledFinger: true,
+        orientation: 0,
+        code: "陶笛",
+        hasTizhi: false,
+        id: 39,
+      };      
     case "melodica": // 口风琴
       return {
         name: "melodica",
@@ -658,6 +673,36 @@ export const getFingeringConfig = async (type: IVocals | undefined): Promise<ITy
           marginTop: "auto",
         },
       };
+    case "whistling":
+      const whistling = await import(`./fingering-img/whistling/index.json`);
+      return {
+        json: whistling.default,
+        relationship: relationships.ocarina,
+        width: "180px",
+        styles: {
+          marginTop: "auto",
+        },
+      };
+    case "whistling1":
+      const whistling1 = await import(`./fingering-img/whistling1/index.json`);
+      return {
+        json: whistling1.default,
+        relationship: relationships.ocarina,
+        width: "180px",
+        styles: {
+          marginTop: "auto",
+        },
+      };
+    case "whistling2":
+      const whistling2 = await import(`./fingering-img/whistling2/index.json`);
+      return {
+        json: whistling2.default,
+        relationship: relationships.ocarina,
+        width: "180px",
+        styles: {
+          marginTop: "auto",
+        },
+      };      
     case "melodica":
       const melodica = await import(`./fingering-img/melodica/index.json`);
       return {

File diff suppressed because it is too large
+ 0 - 0
src/view/fingering/fingering-img/ocarina/index.json


File diff suppressed because it is too large
+ 0 - 0
src/view/fingering/fingering-img/ocarina1/index.json


File diff suppressed because it is too large
+ 0 - 0
src/view/fingering/fingering-img/ocarina2/index.json


BIN
src/view/fingering/fingering-img/whistling/1.png


BIN
src/view/fingering/fingering-img/whistling/10.png


BIN
src/view/fingering/fingering-img/whistling/11.png


BIN
src/view/fingering/fingering-img/whistling/12.png


BIN
src/view/fingering/fingering-img/whistling/2.png


BIN
src/view/fingering/fingering-img/whistling/3.png


BIN
src/view/fingering/fingering-img/whistling/4.png


BIN
src/view/fingering/fingering-img/whistling/5.png


BIN
src/view/fingering/fingering-img/whistling/6.png


BIN
src/view/fingering/fingering-img/whistling/7.png


BIN
src/view/fingering/fingering-img/whistling/8.png


BIN
src/view/fingering/fingering-img/whistling/9.png


BIN
src/view/fingering/fingering-img/whistling/full.png


File diff suppressed because it is too large
+ 1 - 0
src/view/fingering/fingering-img/whistling/index.json


File diff suppressed because it is too large
+ 1 - 0
src/view/fingering/fingering-img/whistling1/index.json


File diff suppressed because it is too large
+ 1 - 0
src/view/fingering/fingering-img/whistling2/index.json


Some files were not shown because too many files changed in this diff