diff --git a/Apps/Divertissement/guitar_accord.desktop b/Apps/Divertissement/guitar_accord.desktop deleted file mode 100644 index bacc158..0000000 --- a/Apps/Divertissement/guitar_accord.desktop +++ /dev/null @@ -1,8 +0,0 @@ -[Desktop Entry] -Name=ShowGuitarAccord -Type=Application -Comment=Display the guitar chord you choose -Exec=Apps_example/GuitarAccord/show5 -TryExec=Apps_example/GuitarAccord/show5 -Icon=Apps_example/GuitarAccord/show_guitar_accord.png -Keywords=guitar; python3; diff --git a/Apps/ExampleTab/empty1.desktop b/Apps/ExampleTab/empty1.desktop deleted file mode 100755 index 986cbd5..0000000 --- a/Apps/ExampleTab/empty1.desktop +++ /dev/null @@ -1,8 +0,0 @@ -[Desktop Entry] -Name=EmptyApp -Type=Application -Comment=this is not an app,\n this is an empty example modified -Exec=Apps_example/EmptyApp/empty -TryExec=Apps_example/EmptyApp/empty -Icon=Apps_example/EmptyApp/empty.png -Keywords=NoneA diff --git a/Apps/ExampleTab/empty2.desktop b/Apps/ExampleTab/empty2.desktop deleted file mode 100755 index d0a588e..0000000 --- a/Apps/ExampleTab/empty2.desktop +++ /dev/null @@ -1,8 +0,0 @@ -[Desktop Entry] -Name=EmptyApp2 -Type=Application -Comment=this is not an app,\n this is an empty example -Exec=Apps_example/EmptyApp/empty -TryExec=Apps_example/EmptyApp/empty -Icon=Apps_example/EmptyApp/empty.png -Keywords=None diff --git a/Apps/ExampleTab/empty3.desktop b/Apps/ExampleTab/empty3.desktop deleted file mode 100755 index a2bdc82..0000000 --- a/Apps/ExampleTab/empty3.desktop +++ /dev/null @@ -1,8 +0,0 @@ -[Desktop Entry] -Name=EmptyApp3 -Type=Application -Comment=this is not an app,\n this is an empty example -Exec=Apps_example/EmptyApp/empty -TryExec=Apps_example/EmptyApp/empty -Icon=Apps_example/EmptyApp/empty.png -Keywords=None diff --git a/Apps/ExampleTab/empty5.desktop b/Apps/ExampleTab/empty5.desktop deleted file mode 100755 index 7d0231b..0000000 --- a/Apps/ExampleTab/empty5.desktop +++ /dev/null @@ -1,8 +0,0 @@ -[Desktop Entry] -Name=EmptyApp5 -Type=Application -Comment=this is not an app,\n this is an empty example -Exec=Apps_example/EmptyApp/empty -TryExec=Apps_example/EmptyApp/empty -Icon=Apps_example/EmptyApp/empty.png -Keywords=None diff --git a/Apps/ExampleTab/empty6.desktop b/Apps/ExampleTab/empty6.desktop deleted file mode 100755 index 8e98c08..0000000 --- a/Apps/ExampleTab/empty6.desktop +++ /dev/null @@ -1,8 +0,0 @@ -[Desktop Entry] -Name=EmptyApp6 -Type=Application -Comment=this is not an app,\n this is an empty example -Exec=Apps_example/EmptyApp/empty -TryExec=Apps_example/EmptyApp/empty -Icon=Apps_example/EmptyApp/empty.png -Keywords=None diff --git a/Apps/ExampleTab/empty7.desktop b/Apps/ExampleTab/empty7.desktop deleted file mode 100755 index 47e2dc9..0000000 --- a/Apps/ExampleTab/empty7.desktop +++ /dev/null @@ -1,8 +0,0 @@ -[Desktop Entry] -Name=EmptyApp7 -Type=Application -Comment=this is not an app,\n this is an empty example -Exec=Apps_example/EmptyApp/empty -TryExec=Apps_example/EmptyApp/empty -Icon=Apps_example/EmptyApp/empty.png -Keywords=None diff --git a/Apps/ExampleTab/firefox-esr.desktop b/Apps/ExampleTab/firefox-esr.desktop deleted file mode 100644 index 1959aad..0000000 --- a/Apps/ExampleTab/firefox-esr.desktop +++ /dev/null @@ -1,104 +0,0 @@ -[Desktop Entry] -Name=Firefox ESR -Name[bg]=Firefox ESR -Name[ca]=Firefox ESR -Name[cs]=Firefox ESR -Name[el]=Firefox ESR -Name[es]=Firefox ESR -Name[fa]=Firefox ESR -Name[fi]=Firefox ESR -Name[fr]=Firefox ESR -Name[hu]=Firefox ESR -Name[it]=Firefox ESR -Name[ja]=Firefox ESR -Name[ko]=Firefox ESR -Name[nb]=Firefox ESR -Name[nl]=Firefox ESR -Name[nn]=Firefox ESR -Name[no]=Firefox ESR -Name[pl]=Firefox ESR -Name[pt]=Firefox ESR -Name[pt_BR]=Firefox ESR -Name[ru]=Firefox ESR -Name[sk]=Firefox ESR -Name[sv]=Firefox ESR -Comment=Browse the World Wide Web -Comment[bg]=Сърфиране в Мрежата -Comment[ca]=Navegueu per el web -Comment[cs]=Prohlížení stránek World Wide Webu -Comment[de]=Im Internet surfen -Comment[el]=Περιηγηθείτε στον παγκόσμιο ιστό -Comment[es]=Navegue por la web -Comment[fa]=صفحات شبکه جهانی اینترنت را مرور نمایید -Comment[fi]=Selaa Internetin WWW-sivuja -Comment[fr]=Navigue sur Internet -Comment[hu]=A világháló böngészése -Comment[it]=Esplora il web -Comment[ja]=ウェブを閲覧します -Comment[ko]=웹을 돌아 다닙니다 -Comment[nb]=Surf på nettet -Comment[nl]=Verken het internet -Comment[nn]=Surf på nettet -Comment[no]=Surf på nettet -Comment[pl]=Przeglądanie stron WWW -Comment[pt]=Navegue na Internet -Comment[pt_BR]=Navegue na Internet -Comment[ru]=Обозреватель Всемирной Паутины -Comment[sk]=Prehliadanie internetu -Comment[sv]=Surfa på webben -GenericName=Web Browser -GenericName[bg]=Интернет браузър -GenericName[ca]=Navegador web -GenericName[cs]=Webový prohlížeč -GenericName[de]=Webbrowser -GenericName[el]=Περιηγητής ιστού -GenericName[es]=Navegador web -GenericName[fa]=مرورگر اینترنتی -GenericName[fi]=WWW-selain -GenericName[fr]=Navigateur Web -GenericName[hu]=Webböngésző -GenericName[it]=Browser Web -GenericName[ja]=ウェブ・ブラウザ -GenericName[ko]=웹 브라우저 -GenericName[nb]=Nettleser -GenericName[nl]=Webbrowser -GenericName[nn]=Nettlesar -GenericName[no]=Nettleser -GenericName[pl]=Przeglądarka WWW -GenericName[pt]=Navegador Web -GenericName[pt_BR]=Navegador Web -GenericName[ru]=Интернет-браузер -GenericName[sk]=Internetový prehliadač -GenericName[sv]=Webbläsare -X-GNOME-FullName=Firefox ESR Web Browser -X-GNOME-FullName[bg]=Интернет браузър (Firefox ESR) -X-GNOME-FullName[ca]=Navegador web Firefox ESR -X-GNOME-FullName[cs]=Firefox ESR Webový prohlížeč -X-GNOME-FullName[el]=Περιηγήτης Ιστού Firefox ESR -X-GNOME-FullName[es]=Navegador web Firefox ESR -X-GNOME-FullName[fa]=مرورگر اینترنتی Firefox ESR -X-GNOME-FullName[fi]=Firefox ESR-selain -X-GNOME-FullName[fr]=Navigateur Web Firefox ESR -X-GNOME-FullName[hu]=Firefox ESR webböngésző -X-GNOME-FullName[it]=Firefox ESR Browser Web -X-GNOME-FullName[ja]=Firefox ESR ウェブ・ブラウザ -X-GNOME-FullName[ko]=Firefox ESR 웹 브라우저 -X-GNOME-FullName[nb]=Firefox ESR Nettleser -X-GNOME-FullName[nl]=Firefox ESR webbrowser -X-GNOME-FullName[nn]=Firefox ESR Nettlesar -X-GNOME-FullName[no]=Firefox ESR Nettleser -X-GNOME-FullName[pl]=Przeglądarka WWW Firefox ESR -X-GNOME-FullName[pt]=Firefox ESR Navegador Web -X-GNOME-FullName[pt_BR]=Navegador Web Firefox ESR -X-GNOME-FullName[ru]=Интернет-браузер Firefox ESR -X-GNOME-FullName[sk]=Internetový prehliadač Firefox ESR -X-GNOME-FullName[sv]=Webbläsaren Firefox ESR -Exec=/usr/lib/firefox-esr/firefox-esr %u -Terminal=false -X-MultipleArgs=false -Type=Application -Icon=firefox-esr -Categories=Network;WebBrowser; -MimeType=text/html;text/xml;application/xhtml+xml;application/xml;application/vnd.mozilla.xul+xml;application/rss+xml;application/rdf+xml;image/gif;image/jpeg;image/png;x-scheme-handler/http;x-scheme-handler/https; -StartupWMClass=Firefox-esr -StartupNotify=true diff --git a/Apps/Utilitaires/delete_metadata.desktop b/Apps/Utilitaires/delete_metadata.desktop deleted file mode 100755 index 7afe33f..0000000 --- a/Apps/Utilitaires/delete_metadata.desktop +++ /dev/null @@ -1,8 +0,0 @@ -[Desktop Entry] -Name=Exiftool -Type=Application -Comment=delete metadata or rename file with exif -Exec=Apps_example/ExifManipulation/delete_metadata -TryExec=Apps_example/ExifManipulation/delete_metadata -Icon=Apps_example/ExifManipulation/delete_metadata.png -Keywords=exiftool; rename; delete; metadata diff --git a/Apps/Utilitaires/qrcode.desktop b/Apps/Utilitaires/qrcode.desktop deleted file mode 100755 index d06b8db..0000000 --- a/Apps/Utilitaires/qrcode.desktop +++ /dev/null @@ -1,8 +0,0 @@ -[Desktop Entry] -Name=QrcoPy -Type=Application -Comment=instant grcode generation -Exec=Apps_example/QrcoPy/qrcopy -TryExec=Apps_example/QrcoPy/qrcopy -Icon=Apps_example/QrcoPy/qrcode.png -Keywords=qrcode; python3; diff --git a/Apps/Utilitaires/rofi_calculator.desktop b/Apps/Utilitaires/rofi_calculator.desktop deleted file mode 100755 index c27376f..0000000 --- a/Apps/Utilitaires/rofi_calculator.desktop +++ /dev/null @@ -1,8 +0,0 @@ -[Desktop Entry] -Name=RofiCalculator -Type=Application -Comment=one line edition calculator with all numpy fonctions support -Exec=Apps_example/RofiCalculator/rofi-python-calculator -TryExec=Apps_example/RofiCalculator/rofi-python-calculator -Icon=Apps_example/RofiCalculator/roficalculator.png -Keywords=calculator; python3; diff --git a/Apps_example/EmptyApp/requirements.txt b/Apps_example/EmptyApp/requirements.txt deleted file mode 100644 index d93d026..0000000 --- a/Apps_example/EmptyApp/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -PyQt5==5.14.2 diff --git a/Apps_example/ExifManipulation/app/delete_metadata.py b/Apps_example/ExifManipulation/app/delete_metadata.py deleted file mode 100755 index a188f45..0000000 --- a/Apps_example/ExifManipulation/app/delete_metadata.py +++ /dev/null @@ -1,116 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - - - -import os -import sys -import glob - -from PyQt5.QtWidgets import (QWidget, QLabel, QLineEdit, - QTextEdit, QGridLayout, QApplication, - QAction, QFileDialog, QPushButton, QComboBox, QScrollArea) - - - -class Example(QWidget): - - def __init__(self): - super().__init__() - - self.initUI() - - - def initUI(self): - - path = QLabel('path') - pathsearch = QPushButton("open",self) - pathsearch.clicked.connect(self.showdialog) - - extension = QLabel('extension') - pattern = QLabel('Pattern') - self.pattern_txt = QLineEdit() - self.pattern_txt.setReadOnly(True) - file_list = QLabel('files') - actualize_files = QPushButton('Actualiser',self) - actualize_files.clicked.connect(self.get_file_list) - - self.choose_action = QComboBox(self) - self.choose_action.addItem("delete metadata") - self.choose_action.addItem("rename with -Title") - run_action = QPushButton('run', self) - run_action.clicked.connect(self.run) - - self.pathEdit = QLineEdit() - self.pathEdit.textChanged.connect(self.update_pattern) - self.extensionEdit = QLineEdit() - self.extensionEdit.textChanged.connect(self.update_pattern) - self.file_list_disp = QTextEdit() - - grid = QGridLayout() - #grid.setSpacing(10) - - grid.addWidget(path, 0, 0) - grid.addWidget(self.pathEdit, 0, 1) - grid.addWidget(pathsearch, 0, 2) - - grid.addWidget(extension, 1, 0) - grid.addWidget(self.extensionEdit, 1, 1, 1, 2) - - grid.addWidget(pattern, 2, 0) - grid.addWidget(self.pattern_txt, 2, 1, 1, 2) - - grid.addWidget(file_list, 3, 0) - grid.addWidget(actualize_files, 3, 1, 1, 2) - grid.addWidget(self.file_list_disp, 4, 0, 1, 3) - - grid.addWidget(self.choose_action, 5, 0, 1, 2) - grid.addWidget(run_action, 5,2) - - self.setLayout(grid) - - self.setGeometry(300, 300, 350, 300) - self.show() - - def run(self): - action = str(self.choose_action.currentText()) - print(f'action = {action}') - path = self.path_to_proceed - if action == "delete metadata": - for file in self.files_to_proceed: - print(file) - os.system(f"exiftool -all= '{path}/{file}'") - elif action == "rename with -Title": - for file in self.files_to_proceed: - print(file) - os.system(f"exiftool '-filename<$title.%e' '{path}/{file}'") - - def showdialog(self): - dir_name = QFileDialog.getExistingDirectory(self, 'Select dir', '/home') - - self.pathEdit.setText(dir_name) - - def update_pattern(self): - path = self.pathEdit.text() - extension = self.extensionEdit.text() - - self.pattern_txt.setText(f'{path}/*.{extension}') - - def get_file_list(self): - path = self.pathEdit.text() - extension = self.extensionEdit.text() - - pattern = f'{path}/*.{extension}' - print(pattern) - self.files_to_proceed = [l.split('/')[-1] for l in glob.iglob(pattern)] - files= '\n'.join(self.files_to_proceed) - print(files) - self.path_to_proceed = path - self.file_list_disp.setText(files) - - -if __name__ == '__main__': - - app = QApplication(sys.argv) - ex = Example() - sys.exit(app.exec_()) diff --git a/Apps_example/ExifManipulation/delete_metadata.desktop b/Apps_example/ExifManipulation/delete_metadata.desktop deleted file mode 100755 index 7afe33f..0000000 --- a/Apps_example/ExifManipulation/delete_metadata.desktop +++ /dev/null @@ -1,8 +0,0 @@ -[Desktop Entry] -Name=Exiftool -Type=Application -Comment=delete metadata or rename file with exif -Exec=Apps_example/ExifManipulation/delete_metadata -TryExec=Apps_example/ExifManipulation/delete_metadata -Icon=Apps_example/ExifManipulation/delete_metadata.png -Keywords=exiftool; rename; delete; metadata diff --git a/Apps_example/ExifManipulation/delete_metadata.png b/Apps_example/ExifManipulation/delete_metadata.png deleted file mode 100644 index 538ba02..0000000 Binary files a/Apps_example/ExifManipulation/delete_metadata.png and /dev/null differ diff --git a/Apps_example/ExifManipulation/requirements.txt b/Apps_example/ExifManipulation/requirements.txt deleted file mode 100644 index d93d026..0000000 --- a/Apps_example/ExifManipulation/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -PyQt5==5.14.2 diff --git a/Apps_example/GuitarAccord/app/guitar_accord.desktop b/Apps_example/GuitarAccord/app/guitar_accord.desktop deleted file mode 100644 index bacc158..0000000 --- a/Apps_example/GuitarAccord/app/guitar_accord.desktop +++ /dev/null @@ -1,8 +0,0 @@ -[Desktop Entry] -Name=ShowGuitarAccord -Type=Application -Comment=Display the guitar chord you choose -Exec=Apps_example/GuitarAccord/show5 -TryExec=Apps_example/GuitarAccord/show5 -Icon=Apps_example/GuitarAccord/show_guitar_accord.png -Keywords=guitar; python3; diff --git a/Apps_example/GuitarAccord/app/guitare_parameter.py b/Apps_example/GuitarAccord/app/guitare_parameter.py deleted file mode 100644 index 082fe0d..0000000 --- a/Apps_example/GuitarAccord/app/guitare_parameter.py +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/python3 -# -*- coding: utf-8 -*- - -# paramètres gémotriques de la guitare -CORDES_ESPACEMENT = 20 -CORDES_OFFSET = 10 - -FRETTES_NOMBRE = 5 -FRETTES_ESPACEMENT = 40 - -# param de la fenetre affichant la guitare -GUITARE_LARGEUR = 150 -GUITARE_HAUTEUR = 200 - -# Affiche un manche en bois ou non -WOOD_BG = True # True diff --git a/Apps_example/GuitarAccord/app/listedesaccords.py b/Apps_example/GuitarAccord/app/listedesaccords.py deleted file mode 100644 index 1e09c83..0000000 --- a/Apps_example/GuitarAccord/app/listedesaccords.py +++ /dev/null @@ -1,5655 +0,0 @@ -CHORDS={'EADGBE': {'Ab': [[4, 6, 6, 5, 4, 4], - ['x', 11, 10, 8, 9, 8], - ['x', 11, 13, 13, 13, 11], - [4, 3, 1, 1, 1, 4], - ['x', 'x', 6, 8, 9, 8]], - 'Ab11': [[4, 6, 4, 6, 4, 6], - [4, 'x', 4, 3, 2, 2], - ['x', 11, 11, 11, 11, 11], - ['x', 11, 10, 11, 9, 9], - ['x', 11, 11, 11, 13, 11], - ['x', 'x', 6, 6, 7, 8]], - 'Ab13': [[4, 'x', 4, 3, 1, 1], - [4, 'x', 4, 5, 6, 6], - ['x', 11, 10, 11, 11, 13], - [4, 6, 4, 5, 6, 4]], - 'Ab5': [[4, 6, 6, 'x', 'x', 'x'], - ['x', 11, 13, 13, 'x', 'x'], - ['x', 'x', 'x', 1, 4, 4], - ['x', 'x', 6, 8, 9, 'x']], - 'Ab6': [['x', 'x', 6, 5, 6, 4], - ['x', 'x', 6, 8, 6, 8], - ['x', 11, 13, 13, 13, 13], - [4, 'x', 3, 5, 4, 'x']], - 'Ab7': [[4, 6, 4, 5, 4, 4], - [4, 'x', 4, 5, 4, 'x'], - ['x', 11, 13, 11, 13, 11], - ['x', 'x', 6, 8, 7, 8], - ['x', 11, 10, 11, 9, 'x']], - 'Ab7sus4': [[4, 6, 4, 6, 4, 4], - ['x', 11, 11, 11, 9, 9], - ['x', 11, 13, 11, 14, 11], - ['x', 'x', 6, 8, 7, 9]], - 'Ab9': [[4, 6, 4, 5, 4, 6], - [4, 'x', 4, 3, 4, 4], - ['x', 11, 'x', 10, 11, 11], - ['x', 11, 10, 11, 11, 11], - [4, 'x', 4, 3, 1, 'x'], - ['x', 'x', 6, 5, 7, 6], - [4, 3, 4, 3, 4, 'x']], - 'Abadd9': [['x', 'x', 6, 5, 4, 6], - ['x', 11, 8, 8, 9, 8], - ['x', 11, 13, 15, 13, 11], - ['x', 'x', 6, 5, 4, 6], - ['x', 11, 13, 15, 13, 11], - [4, 'x', 'x', 5, 4, 6]], - 'Abaug': [[4, 3, 2, 1, 'x', 'x'], - ['x', 'x', 6, 5, 5, 4], - ['x', 11, 10, 9, 9, 'x']], - 'Abdim7': [[4, 5, 6, 4, 'x', 'x'], - ['x', 11, 12, 13, 12, 'x'], - ['x', 11, 12, 10, 12, 'x'], - [4, 'x', 3, 4, 3, 'x'], - ['x', 'x', 6, 7, 6, 7]], - 'Abm': [[4, 6, 6, 4, 4, 4], - ['x', 'x', 6, 8, 9, 7], - ['x', 11, 13, 13, 12, 11], - ['x', 'x', 6, 4, 4, 4]], - 'Abm6': [[4, 6, 6, 4, 6, 4], - ['x', 'x', 6, 8, 6, 7], - ['x', 11, 9, 10, 9, 'x'], - ['x', 11, 13, 10, 12, 'x'], - ['x', 11, 9, 10, 9, 11], - [4, 'x', 3, 4, 4, 'x'], - ['x', 11, 'x', 10, 12, 11]], - 'Abm7': [[4, 6, 4, 4, 4, 4], - [4, 'x', 4, 4, 4, 'x'], - ['x', 11, 13, 11, 12, 11], - [4, 6, 6, 4, 7, 4], - ['x', 11, 9, 11, 12, 'x'], - ['x', 11, 9, 11, 9, 'x'], - ['x', 'x', 6, 8, 7, 7]], - 'Abm7b5': [['x', 'x', 6, 7, 7, 7], - [4, 'x', 4, 4, 3, 'x'], - [4, 5, 6, 7, 7, 7], - ['x', 11, 12, 11, 12, 'x'], - ['x', 11, 'x', 11, 12, 10], - [4, 5, 4, 4, 7, 4]], - 'Abm9': [[4, 6, 4, 4, 4, 6], - ['x', 11, 9, 11, 11, 'x'], - ['x', 11, 9, 11, 11, 11], - ['x', 'x', 6, 4, 7, 6], - [4, 'x', 4, 4, 4, 6]], - 'AbMaj7': [['x', 'x', 6, 5, 4, 3], - ['x', 'x', 6, 8, 8, 8], - ['x', 11, 13, 12, 13, 11], - [4, 'x', 5, 5, 4, 'x'], - [4, 6, 5, 5, 4, 4]], - 'Absus2': [[4, 1, 1, 1, 4, 4], - ['x', 11, 13, 13, 11, 11], - ['x', 11, 13, 15, 'x', 'x'], - ['x', 'x', 6, 3, 4, 6], - ['x', 'x', 6, 8, 9, 6]], - 'Absus4': [[4, 6, 6, 6, 4, 4], - ['x', 11, 11, 8, 9, 'x'], - ['x', 11, 13, 13, 14, 11], - ['x', 'x', 6, 8, 9, 9], - ['x', 'x', 6, 6, 4, 4]], - 'Ab+': [['x', 11, 10, 9, 9, 'x'], - ['x', 'x', 6, 5, 5, 4], - [4, 3, 2, 1, 'x', 'x'], - [4, 7, 6, 5, 'x', 'x'], - ['x', 11, 'x', 13, 13, 12]], - 'Ab+7': [['x', 11, 14, 11, 13, 12], - [4, 'x', 4, 5, 5, 'x'], - ['x', 'x', 6, 9, 7, 8], - ['x', 11, 'x', 11, 13, 12]], - 'Ab+7b9': [['x', 11, 10, 11, 10, 12], - [4, 'x', 4, 5, 5, 5]], - 'Ab+7#9': [['x', 11, 10, 11, 12, 12], - [4, 'x', 4, 5, 5, 7]], - 'Ab+9': [['x', 11, 10, 11, 11, 12], - [4, 'x', 4, 5, 5, 6]], - 'Ab7b5#9': [['x', 11, 10, 11, 12, 10]], - 'Ab7b9': [['x', 11, 10, 11, 10, 'x'], - [4, 6, 4, 5, 4, 5], - ['x', 11, 10, 11, 10, 11], - ['x', 'x', 6, 5, 7, 5]], - 'Ab7#11': [[4, 5, 4, 5, 4, 4]], - 'Ab7#9': [['x', 11, 10, 11, 12, 'x'], - [4, 6, 4, 5, 4, 7], - ['x', 'x', 6, 5, 7, 7]], - 'Ab9sus4': [['x', 11, 11, 11, 11, 11], - [4, 'x', 4, 3, 2, 'x'], - [4, 'x', 4, 3, 2, 2]], - 'Ab9b5': [['x', 11, 10, 11, 11, 10], - [4, 3, 4, 3, 3, 'x']], - 'Ab13sus4': [['x', 11, 11, 11, 11, 13], - [4, 'x', 4, 6, 6, 6]], - 'Ab7sus2': [[4, 'x', 4, 3, 4, 4]], - 'Ab7b5': [['x', 11, 12, 11, 13, 'x'], - [4, 'x', 4, 5, 3, 'x'], - ['x', 'x', 6, 7, 7, 8], - ['x', 11, 12, 11, 13, 14]], - 'Abmadd9': [['x', 'x', 6, 4, 4, 6]], - 'AbMaj13': [['x', 11, 'x', 12, 13, 13], - [4, 3, 3, 3, 4, 3], - [4, 'x', 5, 5, 6, 6]], - 'AbMaj7#11': [['x', 11, 12, 12, 13, 11], - [4, 'x', 5, 5, 3, 'x'], - ['x', 'x', 6, 7, 8, 8]], - 'Abm11': [['x', 11, 9, 11, 9, 9], - ['x', 11, 11, 11, 12, 11], - [4, 'x', 4, 4, 2, 'x'], - ['x', 'x', 6, 6, 7, 7], - ['x', 11, 'x', 11, 12, 9]], - 'Abm13': [['x', 11, 'x', 11, 12, 13], - [4, 6, 4, 4, 6, 4], - [4, 'x', 4, 4, 6, 6], - ['x', 11, 13, 11, 12, 13], - ['x', 11, 9, 11, 11, 13]], - 'Abm9b5': [[4, 5, 4, 4, 7, 6]], - 'AbMaj9': [['x', 11, 10, 12, 11, 'x'], - ['x', 'x', 6, 5, 8, 6], - ['x', 11, 8, 8, 8, 8], - [4, 3, 5, 3, 4, 3], - [4, 'x', 5, 3, 4, 'x']], - 'AbmMaj7': [['x', 11, 13, 12, 12, 11], - [4, 'x', 5, 4, 4, 'x'], - [4, 6, 5, 4, 4, 4], - ['x', 'x', 6, 8, 8, 7], - ['x', 'x', 6, 4, 4, 3]], - 'AbmMaj9': [['x', 11, 9, 12, 11, 'x'], - [4, 6, 5, 4, 4, 6]], - 'Abmb6': [['x', 11, 9, 9, 9, 11], - [4, 'x', 2, 4, 4, 'x']], - 'Abdim': [['x', 11, 12, 13, 12, 'x'], - [4, 'x', 6, 4, 3, 'x'], - [4, 5, 6, 4, 'x', 'x']], - 'A': [[5, 7, 7, 6, 5, 5], - ['x', 0, 7, 6, 5, 5], - ['x', 12, 11, 9, 10, 9], - ['x', 12, 14, 14, 14, 12], - ['x', 0, 2, 2, 2, 0], - [5, 4, 2, 2, 2, 5], - ['x', 'x', 7, 9, 10, 9]], - 'A11': [['x', 0, 0, 0, 0, 0], - [5, 7, 5, 7, 5, 7], - ['x', 0, 5, 4, 3, 3], - ['x', 12, 12, 12, 12, 12], - ['x', 12, 11, 12, 10, 10], - ['x', 12, 12, 12, 14, 12], - ['x', 'x', 7, 7, 8, 9]], - 'A13': [['x', 0, 5, 4, 2, 2], - [5, 'x', 5, 6, 7, 7], - ['x', 12, 11, 12, 12, 14], - [5, 'x', 5, 4, 2, 2], - [5, 7, 5, 6, 7, 5]], - 'A5': [['x', 0, 2, 2, 'x', 'x'], - [5, 7, 7, 'x', 'x', 'x'], - ['x', 12, 14, 14, 'x', 'x'], - ['x', 'x', 'x', 2, 5, 5], - ['x', 'x', 7, 9, 10, 'x']], - 'A6': [['x', 0, 2, 2, 2, 2], - ['x', 0, 7, 9, 7, 9], - ['x', 'x', 7, 6, 7, 5], - ['x', 0, 4, 2, 2, 0], - ['x', 0, 11, 11, 10, 0], - ['x', 12, 14, 14, 14, 14], - ['x', 'x', 7, 9, 7, 9], - [5, 'x', 4, 6, 5, 'x']], - 'A7': [['x', 0, 2, 0, 2, 0], - ['x', 0, 2, 2, 2, 3], - [5, 7, 5, 6, 5, 5], - [5, 'x', 5, 6, 5, 'x'], - ['x', 0, 7, 9, 8, 9], - ['x', 12, 14, 12, 14, 12], - ['x', 'x', 7, 9, 8, 9], - ['x', 12, 11, 12, 10, 'x']], - 'A7sus4': [['x', 0, 2, 0, 3, 0], - ['x', 0, 2, 0, 3, 3], - [5, 7, 5, 7, 5, 5], - ['x', 12, 12, 12, 10, 10], - ['x', 12, 14, 12, 15, 12], - ['x', 'x', 7, 9, 8, 10]], - 'A9': [['x', 0, 2, 4, 2, 3], - ['x', 0, 5, 4, 5, 5], - ['x', 0, 5, 6, 5, 7], - [5, 7, 5, 6, 5, 7], - ['x', 12, 11, 12, 12, 'x'], - ['x', 12, 11, 12, 12, 12], - [5, 'x', 5, 4, 2, 'x'], - ['x', 'x', 7, 6, 8, 7], - [5, 4, 5, 4, 5, 'x']], - 'Aadd9': [['x', 0, 2, 4, 2, 0], - ['x', 0, 7, 6, 0, 0], - ['x', 'x', 7, 6, 5, 7], - ['x', 12, 14, 16, 14, 12], - [5, 'x', 'x', 6, 5, 7]], - 'Aaug': [['x', 0, 3, 2, 2, 1], - ['x', 'x', 7, 6, 6, 5], - [5, 4, 3, 2, 'x', 'x'], - [5, 8, 7, 6, 'x', 'x']], - 'Adim7': [['x', 'x', 7, 8, 7, 8], - [5, 'x', 4, 5, 4, 'x'], - ['x', 12, 13, 11, 13, 'x'], - ['x', 0, 1, 2, 1, 2]], - 'Am': [['x', 0, 2, 2, 1, 0], - [5, 7, 7, 5, 5, 5], - ['x', 0, 2, 5, 5, 5], - ['x', 'x', 7, 9, 10, 8], - ['x', 12, 14, 14, 13, 12], - ['x', 'x', 7, 5, 5, 5]], - 'Am6': [['x', 0, 2, 2, 1, 2], - [5, 7, 7, 5, 7, 0], - ['x', 'x', 7, 9, 7, 8], - ['x', 12, 10, 11, 10, 'x'], - [5, 'x', 4, 5, 5, 'x'], - [5, 7, 7, 5, 7, 5], - ['x', 12, 14, 11, 13, 'x'], - ['x', 12, 10, 11, 10, 12], - ['x', 12, 'x', 11, 13, 12]], - 'Am7': [['x', 0, 2, 0, 1, 0], - ['x', 0, 2, 2, 1, 3], - [5, 7, 5, 5, 5, 5], - [5, 0, 5, 5, 5, 0], - ['x', 12, 14, 12, 'x', 12], - ['x', 12, 14, 12, 13, 12], - [5, 7, 7, 5, 8, 5], - [5, 'x', 5, 5, 5, 'x'], - ['x', 12, 10, 12, 13, 'x'], - ['x', 12, 10, 12, 10, 'x'], - ['x', 'x', 7, 9, 8, 8]], - 'Am7b5': [[5, 'x', 5, 5, 4, 'x'], - ['x', 0, 1, 0, 1, 'x'], - [5, 6, 7, 8, 8, 8], - ['x', 'x', 7, 8, 8, 8], - ['x', 12, 13, 12, 13, 'x'], - ['x', 12, 'x', 12, 13, 11], - [5, 6, 5, 5, 8, 5]], - 'Am9': [[5, 3, 5, 4, 'x', 'x'], - ['x', 'x', 7, 9, 8, 7], - [5, 7, 5, 5, 5, 7], - ['x', 12, 10, 12, 12, 'x'], - ['x', 12, 10, 12, 12, 12], - ['x', 'x', 7, 5, 8, 7], - [5, 'x', 5, 5, 5, 7]], - 'AMaj7': [['x', 0, 2, 1, 2, 0], - ['x', 'x', 7, 6, 5, 4], - ['x', 'x', 7, 9, 9, 9], - [5, 'x', 6, 6, 5, 'x'], - ['x', 12, 14, 13, 14, 12], - [5, 7, 6, 6, 5, 5]], - 'Asus2': [['x', 0, 2, 2, 0, 0], - ['x', 12, 14, 14, 12, 12], - ['x', 12, 14, 16, 'x', 'x'], - ['x', 'x', 7, 4, 5, 7], - ['x', 'x', 7, 9, 10, 7]], - 'Asus4': [['x', 0, 2, 2, 3, 0], - [5, 7, 7, 7, 5, 5], - ['x', 12, 12, 9, 10, 'x'], - ['x', 12, 14, 14, 15, 12], - ['x', 'x', 7, 9, 10, 10], - ['x', 'x', 7, 7, 5, 5]], - 'A+': [['x', 12, 11, 10, 10, 'x'], - ['x', 'x', 7, 6, 6, 5], - [5, 4, 3, 2, 'x', 'x'], - [5, 8, 7, 6, 'x', 'x'], - ['x', 12, 'x', 14, 14, 13]], - 'A+7': [['x', 12, 15, 12, 14, 13], - [5, 'x', 5, 6, 6, 'x'], - ['x', 'x', 7, 10, 8, 9], - ['x', 12, 'x', 12, 14, 13]], - 'A+7b9': [['x', 12, 11, 12, 11, 13], - [5, 'x', 5, 6, 6, 6]], - 'A+7#9': [['x', 12, 11, 12, 13, 13], - [5, 'x', 5, 6, 6, 8]], - 'A+9': [['x', 12, 11, 12, 12, 13], - [5, 'x', 5, 6, 6, 7]], - 'A7b5#9': [['x', 12, 11, 12, 13, 11]], - 'A7b9': [['x', 12, 11, 12, 11, 'x'], - [5, 7, 5, 6, 5, 6], - ['x', 12, 11, 12, 11, 12], - ['x', 'x', 7, 6, 8, 6]], - 'A7#11': [[5, 6, 5, 6, 5, 5]], - 'A7#9': [['x', 12, 11, 12, 13, 'x'], - [5, 7, 5, 6, 5, 8], - ['x', 'x', 7, 6, 8, 8]], - 'A9sus4': [['x', 12, 12, 12, 12, 12], - [5, 'x', 5, 4, 3, 'x'], - [5, 'x', 5, 4, 3, 3]], - 'A9b5': [['x', 12, 11, 12, 12, 11], - [5, 4, 5, 4, 4, 'x']], - 'A13sus4': [['x', 12, 12, 12, 12, 14], - [5, 'x', 5, 7, 7, 7]], - 'A7sus2': [[5, 'x', 5, 4, 5, 5]], - 'A7b5': [['x', 12, 13, 12, 14, 'x'], - [5, 'x', 5, 6, 4, 'x'], - ['x', 'x', 7, 8, 8, 9], - ['x', 12, 13, 12, 14, 15]], - 'Amadd9': [['x', 'x', 7, 5, 5, 7]], - 'AMaj13': [['x', 12, 'x', 13, 14, 14], - [5, 4, 4, 4, 5, 4], - [5, 'x', 6, 6, 7, 7]], - 'AMaj7#11': [['x', 12, 13, 13, 14, 12], - [5, 'x', 6, 6, 4, 'x'], - ['x', 'x', 7, 8, 9, 9]], - 'Am11': [['x', 12, 10, 12, 10, 10], - ['x', 12, 12, 12, 13, 12], - [5, 'x', 5, 5, 3, 'x'], - ['x', 'x', 7, 7, 8, 8], - ['x', 12, 'x', 12, 13, 10]], - 'Am13': [['x', 12, 'x', 12, 13, 14], - [5, 7, 5, 5, 7, 5], - [5, 'x', 5, 5, 7, 7], - ['x', 12, 14, 12, 13, 14], - ['x', 12, 10, 12, 12, 14]], - 'Am9b5': [[5, 6, 5, 5, 8, 7]], - 'AMaj9': [['x', 12, 11, 13, 12, 'x'], - ['x', 'x', 7, 6, 9, 7], - ['x', 12, 9, 9, 9, 9], - [5, 4, 6, 4, 5, 4], - [5, 'x', 6, 4, 5, 'x']], - 'AmMaj7': [['x', 12, 14, 13, 13, 12], - [5, 'x', 6, 5, 5, 'x'], - [5, 7, 6, 5, 5, 5], - ['x', 'x', 7, 9, 9, 8], - ['x', 'x', 7, 5, 5, 4]], - 'AmMaj9': [['x', 12, 10, 13, 12, 'x'], - [5, 7, 6, 5, 5, 7]], - 'Amb6': [['x', 12, 10, 10, 10, 12], - [5, 'x', 3, 5, 5, 'x']], - 'Adim': [['x', 12, 13, 14, 13, 'x'], - [5, 'x', 7, 5, 4, 'x'], - [5, 6, 7, 5, 'x', 'x']], - 'A#': [['x', 1, 3, 3, 3, 1], - [6, 8, 8, 7, 6, 6], - ['x', 'x', 8, 10, 11, 10], - ['x', 13, 15, 15, 15, 13], - ['x', 13, 12, 10, 11, 10], - [6, 5, 3, 3, 3, 6]], - 'A#11': [['x', 1, 1, 1, 1, 1], - [6, 8, 6, 8, 6, 8], - [6, 'x', 6, 5, 4, 4], - ['x', 13, 12, 13, 11, 11], - ['x', 1, 1, 1, 3, 1], - ['x', 'x', 8, 8, 9, 10]], - 'A#13': [[6, 'x', 6, 5, 3, 3], - [6, 'x', 6, 7, 8, 8], - ['x', 13, 12, 13, 13, 15], - [6, 8, 6, 7, 8, 6]], - 'A#5': [['x', 1, 3, 3, 'x', 'x'], - [6, 8, 8, 'x', 'x', 'x'], - ['x', 'x', 'x', 3, 6, 6], - ['x', 'x', 8, 10, 11, 'x']], - 'A#6': [['x', 1, 3, 3, 3, 3], - ['x', 'x', 8, 10, 8, 10], - ['x', 'x', 8, 7, 8, 6], - ['x', 1, 3, 0, 3, 'x'], - [6, 'x', 5, 7, 6, 'x']], - 'A#7': [['x', 1, 3, 1, 3, 1], - [6, 8, 6, 7, 6, 6], - [6, 'x', 6, 7, 6, 'x'], - ['x', 'x', 8, 10, 9, 10], - ['x', 13, 12, 13, 11, 'x']], - 'A#7sus4': [['x', 1, 3, 1, 4, 1], - [6, 8, 6, 8, 6, 6], - ['x', 13, 13, 13, 11, 11], - ['x', 'x', 8, 10, 9, 11]], - 'A#9': [['x', 1, 0, 1, 1, 'x'], - [6, 8, 6, 7, 6, 8], - [6, 'x', 6, 5, 6, 6], - ['x', 13, 12, 13, 13, 13], - [6, 'x', 6, 5, 3, 'x'], - ['x', 'x', 8, 7, 9, 8], - [6, 5, 6, 5, 6, 'x']], - 'A#add9': [['x', 'x', 8, 7, 6, 8], - ['x', 1, 3, 5, 3, 1], - [6, 'x', 'x', 7, 6, 8]], - 'A#aug': [[6, 5, 4, 3, 'x', 'x'], - ['x', 'x', 8, 7, 7, 6]], - 'A#dim7': [[6, 'x', 5, 6, 5, 'x'], - ['x', 1, 2, 0, 2, 'x'], - [6, 7, 5, 6, 'x', 'x'], - ['x', 'x', 8, 9, 8, 9], - ['x', 13, 14, 12, 14, 'x']], - 'A#m': [['x', 1, 3, 3, 2, 1], - [6, 8, 8, 6, 6, 6], - ['x', 'x', 8, 10, 11, 9], - ['x', 13, 15, 15, 14, 13], - ['x', 'x', 8, 6, 6, 6]], - 'A#m6': [[6, 8, 8, 6, 8, 6], - ['x', 'x', 8, 10, 8, 9], - ['x', 1, 3, 0, 2, 'x'], - [6, 'x', 5, 6, 6, 'x'], - ['x', 13, 11, 12, 11, 'x'], - ['x', 13, 15, 12, 14, 'x'], - ['x', 13, 11, 12, 11, 13], - ['x', 13, 'x', 12, 14, 13]], - 'A#m7': [['x', 1, 3, 1, 2, 1], - [6, 8, 6, 6, 6, 6], - [6, 'x', 6, 6, 6, 'x'], - ['x', 13, 15, 13, 14, 13], - [6, 8, 8, 6, 9, 6], - ['x', 13, 11, 13, 14, 'x'], - ['x', 13, 11, 13, 11, 'x'], - ['x', 'x', 8, 10, 9, 9]], - 'A#m7b5': [[6, 'x', 6, 6, 5, 'x'], - ['x', 1, 2, 1, 2, 'x'], - ['x', 'x', 8, 9, 9, 9], - [6, 7, 8, 9, 9, 9], - ['x', 13, 'x', 13, 14, 12], - [6, 7, 6, 6, 9, 6]], - 'A#m9': [[6, 8, 6, 6, 6, 8], - ['x', 13, 11, 13, 13, 'x'], - ['x', 13, 11, 13, 13, 13], - ['x', 'x', 8, 6, 9, 8], - [6, 'x', 6, 6, 6, 8]], - 'A#Maj7': [['x', 1, 3, 2, 3, 1], - ['x', 'x', 8, 7, 6, 5], - ['x', 'x', 8, 10, 10, 10], - [6, 'x', 7, 7, 6, 'x'], - [6, 8, 7, 7, 6, 6]], - 'A#sus2': [['x', 1, 3, 3, 1, 1], - [6, 8, 8, 5, 'x', 'x'], - ['x', 13, 15, 15, 13, 13], - ['x', 1, 3, 5, 'x', 'x'], - ['x', 'x', 8, 5, 6, 8], - ['x', 'x', 8, 10, 11, 8]], - 'A#sus4': [['x', 1, 3, 3, 4, 1], - [6, 8, 8, 8, 6, 6], - ['x', 'x', 8, 10, 11, 11], - ['x', 'x', 8, 8, 6, 6]], - 'A#+': [['x', 13, 12, 11, 11, 'x'], - ['x', 'x', 8, 7, 7, 6], - [6, 5, 4, 3, 'x', 'x'], - [6, 9, 8, 7, 'x', 'x'], - ['x', 1, 'x', 3, 3, 2]], - 'A#+7': [['x', 1, 4, 1, 3, 2], - [6, 'x', 6, 7, 7, 'x'], - ['x', 'x', 8, 11, 9, 10], - ['x', 1, 'x', 1, 3, 2]], - 'A#+7b9': [['x', 13, 12, 13, 12, 14], - [6, 'x', 6, 7, 7, 7]], - 'A#+7#9': [['x', 13, 12, 13, 14, 14], - [6, 'x', 6, 7, 7, 9]], - 'A#+9': [['x', 13, 12, 13, 13, 14], - [6, 'x', 6, 7, 7, 8]], - 'A#7b5#9': [['x', 13, 12, 13, 14, 12]], - 'A#7b9': [['x', 13, 12, 13, 12, 'x'], - [6, 8, 6, 7, 6, 7], - ['x', 13, 12, 13, 12, 13], - ['x', 'x', 8, 7, 9, 7]], - 'A#7#11': [[6, 7, 6, 7, 6, 6]], - 'A#7#9': [['x', 13, 12, 13, 14, 'x'], - [6, 8, 6, 7, 6, 9], - ['x', 'x', 8, 7, 9, 9]], - 'A#9sus4': [['x', 1, 1, 1, 1, 1], - [6, 'x', 6, 5, 4, 'x'], - [6, 'x', 6, 5, 4, 4]], - 'A#9b5': [['x', 13, 12, 13, 13, 12], - [6, 5, 6, 5, 5, 'x']], - 'A#13sus4': [['x', 1, 1, 1, 1, 3], - [6, 'x', 6, 8, 8, 8]], - 'A#7sus2': [[6, 'x', 6, 5, 6, 6]], - 'A#7b5': [['x', 1, 2, 1, 3, 'x'], - [6, 'x', 6, 7, 5, 'x'], - ['x', 'x', 8, 9, 9, 10], - ['x', 1, 2, 1, 3, 4]], - 'A#madd9': [['x', 'x', 8, 6, 6, 8]], - 'A#Maj13': [['x', 1, 'x', 2, 3, 3], - [6, 5, 5, 5, 6, 5], - [6, 'x', 7, 7, 8, 8]], - 'A#Maj7#11': [['x', 1, 2, 2, 3, 1], - [6, 'x', 7, 7, 5, 'x'], - ['x', 'x', 8, 9, 10, 10]], - 'A#m11': [['x', 13, 11, 13, 11, 11], - ['x', 1, 1, 1, 2, 1], - [6, 'x', 6, 6, 4, 'x'], - ['x', 'x', 8, 8, 9, 9], - ['x', 13, 'x', 13, 14, 11]], - 'A#m13': [['x', 1, 'x', 1, 2, 3], - [6, 8, 6, 6, 8, 6], - [6, 'x', 6, 6, 8, 8], - ['x', 1, 3, 1, 2, 3], - ['x', 13, 11, 13, 13, 15]], - 'A#m9b5': [[6, 7, 6, 6, 9, 8]], - 'A#Maj9': [['x', 13, 12, 14, 13, 'x'], - ['x', 'x', 8, 7, 10, 8], - ['x', 13, 10, 10, 10, 10], - [6, 5, 7, 5, 6, 5], - [6, 'x', 7, 5, 6, 'x']], - 'A#mMaj7': [['x', 1, 3, 2, 2, 1], - [6, 'x', 7, 6, 6, 'x'], - [6, 8, 7, 6, 6, 6], - ['x', 'x', 8, 10, 10, 9], - ['x', 'x', 8, 6, 6, 5]], - 'A#mMaj9': [['x', 13, 11, 14, 13, 'x'], - [6, 8, 7, 6, 6, 8]], - 'A#mb6': [['x', 13, 11, 11, 11, 13], - [6, 'x', 4, 6, 6, 'x']], - 'A#dim': [['x', 1, 2, 3, 2, 'x'], - [6, 'x', 8, 6, 5, 'x'], - [6, 7, 8, 6, 'x', 'x']], - 'Bb': [['x', 1, 3, 3, 3, 1], - [6, 8, 8, 7, 6, 6], - ['x', 'x', 8, 10, 11, 10], - ['x', 13, 15, 15, 15, 13], - ['x', 13, 12, 10, 11, 10], - [6, 5, 3, 3, 3, 6]], - 'Bb11': [['x', 1, 1, 1, 1, 1], - [6, 8, 6, 8, 6, 8], - [6, 'x', 6, 5, 4, 4], - ['x', 13, 12, 13, 11, 11], - ['x', 1, 1, 1, 3, 1], - ['x', 'x', 8, 8, 9, 10]], - 'Bb13': [[6, 'x', 6, 5, 3, 3], - [6, 'x', 6, 7, 8, 8], - ['x', 13, 12, 13, 13, 15], - [6, 8, 6, 7, 8, 6]], - 'Bb5': [['w', 1, 3, 3, 'x', 'x'], - [6, 8, 8, 'x', 'x', 'x'], - ['x', 1, 3, 3, 'x', 'x'], - ['x', 'x', 'x', 3, 6, 6], - ['x', 'x', 8, 10, 11, 'x']], - 'Bb6': [['x', 1, 3, 3, 3, 3], - ['x', 'x', 8, 10, 8, 10], - ['x', 'x', 8, 7, 8, 6], - ['x', 1, 3, 0, 3, 'x'], - [6, 'x', 5, 7, 6, 'x']], - 'Bb7': [['x', 1, 3, 1, 3, 1], - [6, 8, 6, 7, 6, 6], - [6, 'x', 6, 7, 6, 'x'], - ['x', 'x', 8, 10, 9, 10], - ['x', 13, 12, 13, 11, 'x']], - 'Bb7sus4': [['x', 1, 3, 1, 4, 1], - [6, 8, 6, 8, 6, 6], - ['x', 13, 13, 13, 11, 11], - ['x', 'x', 8, 10, 9, 11]], - 'Bb9': [['x', 1, 0, 1, 1, 'x'], - [6, 8, 6, 7, 6, 8], - [6, 'x', 6, 5, 6, 6], - ['x', 13, 12, 13, 13, 13], - [6, 'x', 6, 5, 3, 'x'], - ['x', 'x', 8, 7, 9, 8], - [6, 5, 6, 5, 6, 'x']], - 'Bbadd9': [['x', 1, 3, 3, 1, 1], - ['x', 'x', 8, 7, 6, 8], - ['x', 1, 3, 5, 3, 1], - [6, 'x', 'x', 7, 6, 8]], - 'Bbaug': [[6, 5, 4, 3, 'x', 'x'], - ['x', 'x', 8, 7, 7, 6], - [6, 9, 8, 7, 'x', 'x']], - 'Bbdim7': [['x', 1, 2, 0, 2, 'x'], - [6, 7, 5, 6, 'x', 'x'], - ['x', 13, 14, 12, 14, 'x'], - ['x', 'x', 8, 9, 8, 9], - [6, 'x', 5, 6, 5, 'x']], - 'Bbm': [['x', 1, 3, 3, 2, 1], - [6, 8, 8, 6, 6, 6], - ['x', 'x', 8, 10, 11, 9], - ['x', 13, 15, 15, 14, 13], - ['x', 'x', 8, 6, 6, 6]], - 'Bbm6': [[6, 8, 8, 6, 8, 6], - ['x', 'x', 8, 10, 8, 9], - ['x', 1, 3, 0, 2, 'x'], - [6, 'x', 5, 6, 6, 'x'], - ['x', 13, 11, 12, 11, 'x'], - ['x', 13, 15, 12, 14, 'x'], - ['x', 13, 11, 12, 11, 13], - ['x', 13, 'x', 12, 14, 13]], - 'Bbm7': [['x', 1, 3, 1, 2, 1], - [6, 8, 6, 6, 6, 6], - [6, 'x', 6, 6, 6, 'x'], - ['x', 13, 15, 13, 14, 13], - [6, 8, 8, 6, 9, 6], - ['x', 13, 11, 13, 14, 'x'], - ['x', 13, 11, 13, 11, 'x'], - ['x', 'x', 8, 10, 9, 9]], - 'Bbm7b5': [['x', 'x', 8, 9, 9, 9], - [6, 'x', 6, 6, 5, 'x'], - ['x', 1, 2, 1, 2, 'x'], - [6, 7, 8, 9, 9, 9], - ['x', 13, 'x', 13, 14, 12], - [6, 7, 6, 6, 9, 6]], - 'BbMaj7': [['x', 1, 3, 2, 3, 1], - ['x', 'x', 8, 7, 6, 5], - ['x', 'x', 8, 10, 10, 10], - [6, 'x', 7, 7, 6, 'x'], - [6, 8, 7, 7, 6, 6]], - 'Bbsus2': [['x', 1, 3, 3, 1, 1], - [6, 8, 8, 5, 'x', 'x'], - ['x', 13, 15, 15, 13, 13], - ['x', 1, 3, 5, 'x', 'x'], - ['x', 'x', 8, 5, 6, 8], - ['x', 'x', 8, 10, 11, 8]], - 'Bbsus4': [['x', 1, 3, 3, 4, 1], - [6, 8, 8, 8, 6, 6], - ['x', 'x', 8, 10, 11, 11], - ['x', 'x', 8, 8, 6, 6]], - 'Bb+': [['x', 13, 12, 11, 11, 'x'], - ['x', 'x', 8, 7, 7, 6], - [6, 5, 4, 3, 'x', 'x'], - [6, 9, 8, 7, 'x', 'x'], - ['x', 1, 'x', 3, 3, 2]], - 'Bb+7': [['x', 1, 4, 1, 3, 2], - [6, 'x', 6, 7, 7, 'x'], - ['x', 'x', 8, 11, 9, 10], - ['x', 1, 'x', 1, 3, 2]], - 'Bb+7b9': [['x', 13, 12, 13, 12, 14], - [6, 'x', 6, 7, 7, 7]], - 'Bb+7#9': [['x', 13, 12, 13, 14, 14], - [6, 'x', 6, 7, 7, 9]], - 'Bb+9': [['x', 13, 12, 13, 13, 14], - [6, 'x', 6, 7, 7, 8]], - 'Bb7b5#9': [['x', 13, 12, 13, 14, 12]], - 'Bb7b9': [['x', 13, 12, 13, 12, 'x'], - [6, 8, 6, 7, 6, 7], - ['x', 13, 12, 13, 12, 13], - ['x', 'x', 8, 7, 9, 7]], - 'Bb7#11': [[6, 7, 6, 7, 6, 6]], - 'Bb7#9': [['x', 13, 12, 13, 14, 'x'], - [6, 8, 6, 7, 6, 9], - ['x', 'x', 8, 7, 9, 9]], - 'Bb9sus4': [['x', 1, 1, 1, 1, 1], - [6, 'x', 6, 5, 4, 'x'], - [6, 'x', 6, 5, 4, 4]], - 'Bb9b5': [['x', 13, 12, 13, 13, 12], - [6, 5, 6, 5, 5, 'x']], - 'Bb13sus4': [['x', 1, 1, 1, 1, 3], - [6, 'x', 6, 8, 8, 8]], - 'Bb7sus2': [[6, 'x', 6, 5, 6, 6]], - 'Bb7b5': [['x', 1, 2, 1, 3, 'x'], - [6, 'x', 6, 7, 5, 'x'], - ['x', 'x', 8, 9, 9, 10], - ['x', 1, 2, 1, 3, 4]], - 'Bbm9': [[6, 8, 6, 6, 6, 8], - ['x', 13, 11, 13, 13, 'x'], - ['x', 13, 11, 13, 13, 13], - ['x', 'x', 8, 6, 9, 8], - [6, 'x', 6, 6, 6, 8]], - 'Bbmadd9': [['x', 'x', 8, 6, 6, 8]], - 'BbMaj13': [['x', 1, 'x', 2, 3, 3], - [6, 5, 5, 5, 6, 5], - [6, 'x', 7, 7, 8, 8]], - 'BbMaj7#11': [['x', 1, 2, 2, 3, 1], - [6, 'x', 7, 7, 5, 'x'], - ['x', 'x', 8, 9, 10, 10]], - 'Bbm11': [['x', 13, 11, 13, 11, 11], - ['x', 1, 1, 1, 2, 1], - [6, 'x', 6, 6, 4, 'x'], - ['x', 'x', 8, 8, 9, 9], - ['x', 13, 'x', 13, 14, 11]], - 'Bbm13': [['x', 1, 'x', 1, 2, 3], - [6, 8, 6, 6, 8, 6], - [6, 'x', 6, 6, 8, 8], - ['x', 1, 3, 1, 2, 3], - ['x', 13, 11, 13, 13, 15]], - 'Bbm9b5': [[6, 7, 6, 6, 9, 8]], - 'BbMaj9': [['x', 13, 12, 14, 13, 'x'], - ['x', 'x', 8, 7, 10, 8], - ['x', 13, 10, 10, 10, 10], - [6, 5, 7, 5, 6, 5], - [6, 'x', 7, 5, 6, 'x']], - 'BbmMaj7': [['x', 1, 3, 2, 2, 1], - [6, 'x', 7, 6, 6, 'x'], - [6, 8, 7, 6, 6, 6], - ['x', 'x', 8, 10, 10, 9], - ['x', 'x', 8, 6, 6, 5]], - 'BbmMaj9': [['x', 13, 11, 14, 13, 'x'], - [6, 8, 7, 6, 6, 8]], - 'Bbmb6': [['x', 13, 11, 11, 11, 13], - [6, 'x', 4, 6, 6, 'x']], - 'Bbdim': [['x', 1, 2, 3, 2, 'x'], - [6, 'x', 8, 6, 5, 'x'], - [6, 7, 8, 6, 'x', 'x']], - 'B': [['x', 2, 4, 4, 4, 2], - [7, 9, 9, 8, 7, 7], - ['x', 'x', 9, 11, 12, 11], - ['x', 14, 13, 11, 12, 11], - [7, 6, 4, 4, 4, 7]], - 'B11': [['x', 2, 2, 2, 2, 2], - [7, 9, 7, 9, 7, 9], - [7, 'x', 7, 6, 5, 5], - ['x', 14, 13, 14, 12, 12], - ['x', 2, 2, 2, 4, 2], - ['x', 'x', 9, 9, 10, 11]], - 'B13': [[7, 'x', 7, 6, 4, 4], - [7, 'x', 7, 8, 9, 9], - ['x', 2, 1, 2, 2, 4], - [7, 9, 7, 8, 9, 7]], - 'B5': [['x', 2, 4, 4, 'x', 'x'], - [7, 9, 9, 'x', 'x', 'x'], - ['x', 'x', 'x', 4, 7, 7], - ['x', 'x', 9, 11, 12, 'x']], - 'B6': [['x', 2, 1, 1, 0, 2], - ['x', 2, 4, 4, 4, 4], - ['x', 'x', 9, 11, 9, 11], - ['x', 'x', 9, 8, 9, 7], - [7, 'x', 6, 8, 7, 'x']], - 'B7': [['x', 'x', 9, 11, 10, 11], - ['x', 2, 1, 2, 0, 2], - ['x', 2, 4, 2, 4, 2], - [7, 9, 7, 8, 7, 7], - [7, 'x', 7, 7, 8, 7], - ['x', 14, 13, 14, 12, 'x'], - [7, 'x', 7, 8, 7, 'x']], - 'B7sus4': [['x', 2, 2, 2, 0, 0], - ['x', 2, 4, 4, 5, 2], - [7, 9, 7, 9, 7, 7], - ['x', 14, 14, 14, 12, 12], - ['x', 2, 4, 2, 5, 2], - ['x', 'x', 9, 11, 10, 12]], - 'B9': [['x', 2, 1, 2, 2, 'x'], - [7, 9, 7, 8, 7, 9], - [7, 'x', 7, 6, 7, 7], - ['x', 2, 1, 2, 2, 2], - [7, 'x', 7, 6, 4, 'x'], - ['x', 'x', 9, 8, 10, 9], - [7, 6, 7, 6, 7, 'x']], - 'Badd9': [['x', 2, 4, 4, 2, 2], - ['x', 'x', 9, 8, 7, 9], - ['x', 2, 4, 6, 4, 2], - [7, 'x', 'x', 8, 7, 9]], - 'Baug': [[7, 6, 5, 0, 0, 'x'], - [7, 6, 5, 4, 'x', 'x'], - ['x', 'x', 9, 8, 8, 7], - [7, 10, 9, 8, 'x', 'x']], - 'Bdim7': [['x', 2, 3, 1, 3, 'x'], - [7, 8, 6, 7, 'x', 'x'], - [7, 'x', 6, 7, 6, 'x'], - ['x', 'x', 9, 10, 9, 10]], - 'Bm': [['x', 2, 4, 4, 3, 2], - [7, 9, 9, 7, 7, 7], - ['x', 'x', 9, 11, 12, 10], - ['x', 'x', 9, 7, 7, 7]], - 'Bm6': [['x', 2, 0, 1, 0, 'x'], - [7, 9, 9, 7, 9, 7], - ['x', 'x', 9, 11, 9, 10], - ['x', 2, 4, 1, 3, 'x'], - [7, 'x', 6, 7, 7, 'x'], - ['x', 14, 12, 13, 12, 'x'], - ['x', 14, 12, 13, 12, 14], - ['x', 2, 'x', 1, 3, 2]], - 'Bm7': [['x', 2, 0, 2, 0, 2], - ['x', 2, 4, 2, 3, 2], - [7, 9, 7, 7, 7, 7], - [7, 'x', 7, 7, 7, 'x'], - ['x', 2, 0, 2, 3, 'x'], - [7, 9, 9, 7, 10, 7], - ['x', 14, 12, 14, 15, 'x'], - ['x', 14, 12, 14, 12, 'x'], - ['x', 'x', 9, 11, 10, 10]], - 'Bm7b5': [['x', 'x', 9, 10, 10, 10], - [7, 'x', 7, 7, 6, 'x'], - ['x', 2, 3, 2, 3, 'x'], - [7, 8, 9, 10, 10, 10], - ['x', 2, 'x', 2, 3, 1], - [7, 8, 7, 7, 10, 7]], - 'Bm9': [['x', 2, 0, 2, 2, 'x'], - [7, 9, 7, 7, 7, 9], - ['x', 14, 12, 14, 14, 'x'], - ['x', 14, 12, 14, 14, 14], - ['x', 'x', 9, 7, 10, 9], - [7, 'x', 7, 7, 7, 9]], - 'BMaj7': [['x', 2, 4, 3, 4, 2], - ['x', 'x', 9, 8, 7, 6], - ['x', 'x', 9, 11, 11, 11], - [7, 'x', 8, 8, 7, 'x'], - [7, 9, 8, 8, 7, 7]], - 'Bsus2': [['x', 2, 4, 4, 2, 2], - [7, 4, 4, 6, 0, 'x'], - ['x', 2, 4, 6, 'x', 'x'], - ['x', 'x', 9, 6, 7, 9], - ['x', 'x', 9, 11, 12, 9]], - 'Bsus4': [['x', 2, 4, 4, 5, 2], - [7, 9, 9, 9, 7, 7], - ['x', 'x', 9, 11, 12, 12], - ['x', 'x', 9, 9, 7, 7]], - 'B+': [['x', 14, 13, 12, 12, 'x'], - ['x', 'x', 9, 8, 8, 7], - [7, 6, 5, 4, 'x', 'x'], - [7, 10, 9, 8, 'x', 'x'], - ['x', 2, 'x', 4, 4, 3]], - 'B+7': [['x', 2, 5, 2, 4, 3], - [7, 'x', 7, 8, 8, 'x'], - ['x', 'x', 9, 12, 10, 11], - ['x', 2, 'x', 2, 4, 3]], - 'B+7b9': [['x', 2, 1, 2, 1, 3], - [7, 'x', 7, 8, 8, 8]], - 'B+7#9': [['x', 2, 1, 2, 3, 3], - [7, 'x', 7, 8, 8, 10]], - 'B+9': [['x', 2, 1, 2, 2, 3], - [7, 'x', 7, 8, 8, 9]], - 'B7b5#9': [['x', 2, 1, 2, 3, 1]], - 'B7b9': [['x', 2, 1, 2, 1, 'x'], - [7, 9, 7, 8, 7, 8], - ['x', 2, 1, 2, 1, 2], - ['x', 'x', 9, 8, 10, 8]], - 'B7#11': [[7, 8, 7, 8, 7, 7]], - 'B7#9': [['x', 2, 1, 2, 3, 'x'], - [7, 9, 7, 8, 7, 10], - ['x', 'x', 9, 8, 10, 10]], - 'B9sus4': [['x', 2, 2, 2, 2, 2], - [7, 'x', 7, 6, 5, 'x'], - [7, 'x', 7, 6, 5, 5]], - 'B9b5': [['x', 2, 1, 2, 2, 1], - [7, 6, 7, 6, 6, 'x']], - 'B13sus4': [['x', 2, 2, 2, 2, 4], - [7, 'x', 7, 9, 9, 9]], - 'B7sus2': [[7, 'x', 7, 6, 7, 7]], - 'B7b5': [['x', 2, 3, 2, 4, 'x'], - [7, 'x', 7, 8, 6, 'x'], - ['x', 'x', 9, 10, 10, 11], - ['x', 2, 3, 2, 4, 5]], - 'Bmadd9': [['x', 'x', 9, 7, 7, 9]], - 'BMaj13': [['x', 2, 'x', 3, 4, 4], - [7, 6, 6, 6, 7, 6], - [7, 'x', 8, 8, 9, 9]], - 'BMaj7#11': [['x', 2, 3, 3, 4, 2], - [7, 'x', 8, 8, 6, 'x'], - ['x', 'x', 9, 10, 11, 11]], - 'Bm11': [['x', 14, 12, 14, 12, 12], - ['x', 2, 2, 2, 3, 2], - [7, 'x', 7, 7, 5, 'x'], - ['x', 'x', 9, 9, 10, 10], - ['x', 14, 'x', 14, 15, 12]], - 'Bm13': [['x', 2, 'x', 2, 3, 4], - [7, 9, 7, 7, 9, 7], - [7, 'x', 7, 7, 9, 9], - ['x', 2, 4, 2, 3, 4], - ['x', 14, 12, 14, 14, 16]], - 'Bm9b5': [[7, 8, 7, 7, 10, 9]], - 'BMaj9': [['x', 2, 1, 3, 2, 'x'], - ['x', 'x', 9, 8, 11, 9], - ['x', 14, 11, 11, 11, 11], - [7, 6, 8, 6, 7, 6], - [7, 'x', 8, 6, 7, 'x']], - 'BmMaj7': [['x', 2, 4, 3, 3, 2], - [7, 'x', 8, 7, 7, 'x'], - [7, 9, 8, 7, 7, 7], - ['x', 'x', 9, 11, 11, 10], - ['x', 'x', 9, 7, 7, 6]], - 'BmMaj9': [['x', 14, 12, 15, 14, 'x'], - [7, 9, 8, 7, 7, 9]], - 'Bmb6': [['x', 14, 12, 12, 12, 14], - [7, 'x', 5, 7, 7, 'x']], - 'Bdim': [['x', 2, 3, 4, 3, 'x'], - [7, 'x', 9, 7, 6, 'x'], - [7, 8, 9, 7, 'x', 'x']], - 'B#': [['x', 3, 5, 5, 5, 3], - [8, 10, 10, 9, 8, 8], - [8, 7, 5, 5, 5, 8], - ['x', 'x', 10, 12, 13, 12]], - 'B#+': [['x', 3, 2, 1, 1, 'x'], - ['x', 'x', 10, 9, 9, 8], - [8, 7, 6, 5, 'x', 'x'], - [8, 11, 10, 9, 'x', 'x'], - ['x', 3, 'x', 5, 5, 4]], - 'B#+7': [['x', 3, 6, 3, 5, 4], - [8, 'x', 8, 9, 9, 'x'], - ['x', 'x', 10, 13, 11, 12], - ['x', 3, 'x', 3, 5, 4]], - 'B#+7b9': [['x', 3, 2, 3, 2, 4], - [8, 'x', 8, 9, 9, 9]], - 'B#+7#9': [['x', 3, 2, 3, 4, 4], - [8, 'x', 8, 9, 9, 11]], - 'B#+9': [['x', 3, 2, 3, 3, 4], - [8, 'x', 8, 9, 9, 10]], - 'B#11': [['x', 3, 2, 3, 1, 1], - ['x', 3, 3, 3, 5, 3], - ['x', 'x', 10, 10, 11, 12]], - 'B#7b5#9': [['x', 3, 2, 3, 4, 2]], - 'B#7b9': [['x', 3, 2, 3, 2, 'x'], - [8, 10, 8, 9, 8, 9], - ['x', 3, 2, 3, 2, 3], - ['x', 'x', 10, 9, 11, 9]], - 'B#7#11': [[8, 9, 8, 9, 8, 8]], - 'B#7#9': [['x', 3, 2, 3, 4, 'x'], - [8, 10, 8, 9, 8, 11], - ['x', 'x', 10, 9, 11, 11]], - 'B#9': [[8, 10, 8, 9, 8, 10], - ['x', 3, 2, 3, 3, 3], - [8, 'x', 8, 7, 5, 'x'], - ['x', 'x', 10, 9, 11, 10], - [8, 7, 8, 7, 8, 'x']], - 'B#9sus4': [['x', 3, 3, 3, 3, 3], - [8, 'x', 8, 7, 6, 'x'], - [8, 'x', 8, 7, 6, 6]], - 'B#9b5': [['x', 3, 2, 3, 3, 2], - [8, 7, 8, 7, 7, 'x']], - 'B#add9': [['x', 'x', 10, 9, 8, 10], - ['x', 3, 5, 7, 5, 3], - [8, 'x', 'x', 9, 8, 10]], - 'B#13': [['x', 3, 2, 3, 3, 5], - [8, 'x', 8, 7, 5, 5], - [8, 'x', 8, 9, 10, 10], - [8, 10, 8, 9, 10, 8]], - 'B#13sus4': [['x', 3, 3, 3, 3, 5], - [8, 'x', 8, 10, 10, 10]], - 'B#5': [[8, 10, 10, 'x', 'x', 'x'], - ['x', 3, 5, 5, 'x', 'x'], - ['x', 'x', 'x', 5, 8, 8], - ['x', 'x', 10, 12, 13, 'x']], - 'B#6': [['x', 3, 5, 5, 5, 5], - ['x', 'x', 10, 12, 10, 12], - [8, 'x', 7, 9, 8, 'x']], - 'B#7': [['x', 3, 5, 3, 5, 3], - [8, 10, 8, 9, 8, 8], - ['x', 'x', 10, 12, 11, 12], - ['x', 3, 2, 3, 1, 'x'], - [8, 'x', 8, 9, 8, 'x']], - 'B#7sus4': [['x', 3, 3, 3, 1, 1], - ['x', 3, 5, 3, 6, 3], - [8, 10, 8, 10, 8, 8], - ['x', 'x', 10, 12, 11, 13]], - 'B#7sus2': [[8, 'x', 8, 7, 8, 8]], - 'B#7b5': [['x', 3, 4, 3, 5, 'x'], - [8, 'x', 8, 9, 7, 'x'], - ['x', 'x', 10, 11, 11, 12], - ['x', 3, 4, 3, 5, 6]], - 'B#m9': [[8, 10, 8, 8, 8, 10], - ['x', 3, 1, 3, 3, 'x'], - ['x', 3, 1, 3, 3, 3], - ['x', 'x', 10, 8, 11, 10], - [8, 'x', 8, 8, 8, 10]], - 'B#m7b5': [[8, 'x', 8, 8, 7, 'x'], - ['x', 3, 4, 3, 4, 'x'], - ['x', 'x', 10, 11, 11, 11], - [8, 9, 10, 11, 11, 11], - ['x', 3, 'x', 3, 4, 2], - [8, 9, 8, 8, 11, 8]], - 'B#madd9': [['x', 'x', 10, 8, 8, 10]], - 'B#Maj13': [['x', 3, 'x', 4, 5, 5], - [8, 7, 7, 7, 8, 7], - [8, 'x', 9, 9, 10, 10]], - 'B#Maj7': [['x', 'x', 10, 9, 8, 7], - ['x', 3, 5, 4, 5, 3], - [8, 'x', 9, 9, 8, 'x'], - ['x', 'x', 10, 12, 12, 12], - [8, 10, 9, 9, 8, 8]], - 'B#Maj7#11': [['x', 3, 4, 4, 5, 3], - [8, 'x', 9, 9, 7, 'x'], - ['x', 'x', 10, 11, 12, 12]], - 'B#dim7': [['x', 3, 4, 2, 4, 'x'], - [8, 'x', 7, 8, 7, 'x'], - ['x', 'x', 10, 11, 10, 11]], - 'B#m': [['x', 3, 5, 5, 4, 3], - [8, 10, 10, 8, 8, 8], - ['x', 'x', 10, 8, 8, 8], - ['x', 'x', 10, 12, 13, 11]], - 'B#m11': [['x', 3, 1, 3, 1, 1], - ['x', 3, 3, 3, 4, 3], - [8, 'x', 8, 8, 6, 'x'], - ['x', 'x', 10, 10, 11, 11], - ['x', 3, 'x', 3, 4, 1]], - 'B#m13': [['x', 3, 'x', 3, 4, 5], - [8, 10, 8, 8, 10, 8], - [8, 'x', 8, 8, 10, 10], - ['x', 3, 5, 3, 4, 5], - ['x', 3, 1, 3, 3, 5]], - 'B#m6': [['x', 3, 1, 2, 1, 'x'], - [8, 10, 10, 8, 10, 8], - ['x', 'x', 10, 12, 10, 11], - ['x', 3, 5, 2, 4, 'x'], - ['x', 3, 1, 2, 1, 3], - [8, 'x', 7, 8, 8, 'x'], - ['x', 3, 'x', 2, 4, 3]], - 'B#m7': [['x', 3, 5, 3, 4, 3], - [8, 10, 10, 8, 11, 8], - [8, 'x', 8, 8, 8, 'x'], - ['x', 3, 1, 3, 4, 'x'], - [8, 10, 8, 8, 8, 8], - ['x', 3, 1, 3, 1, 'x'], - ['x', 'x', 10, 12, 11, 11]], - 'B#m9b5': [[8, 9, 8, 8, 11, 10]], - 'B#Maj9': [['x', 3, 2, 4, 3, 'x'], - ['x', 'x', 10, 9, 12, 10], - ['x', 15, 12, 12, 12, 12], - [8, 7, 9, 7, 8, 7], - [8, 'x', 9, 7, 8, 'x']], - 'B#mMaj7': [['x', 3, 5, 4, 4, 3], - [8, 'x', 9, 8, 8, 'x'], - [8, 10, 9, 8, 8, 8], - ['x', 'x', 10, 12, 12, 11], - ['x', 'x', 10, 8, 8, 7]], - 'B#mMaj9': [['x', 3, 1, 4, 3, 'x'], - [8, 10, 9, 8, 8, 10]], - 'B#mb6': [['x', 3, 1, 1, 1, 3], - [8, 'x', 6, 8, 8, 'x']], - 'B#sus2': [['x', 3, 5, 5, 3, 3], - ['x', 3, 5, 7, 'x', 'x'], - ['x', 'x', 10, 7, 8, 10], - ['x', 'x', 10, 12, 13, 10]], - 'B#sus4': [['x', 3, 5, 5, 6, 3], - [8, 10, 10, 10, 8, 8], - ['x', 'x', 10, 12, 13, 13], - ['x', 'x', 10, 10, 8, 8]], - 'B#dim': [['x', 3, 4, 5, 4, 'x'], - [8, 'x', 10, 8, 7, 'x'], - [8, 9, 10, 8, 'x', 'x']], - 'Cb': [['x', 2, 4, 4, 4, 2], - [7, 9, 9, 8, 7, 7], - [7, 6, 4, 4, 4, 7], - ['x', 'x', 9, 11, 12, 11]], - 'Cb+': [['x', 14, 13, 12, 12, 'x'], - ['x', 'x', 9, 8, 8, 7], - [7, 6, 5, 4, 'x', 'x'], - [7, 10, 9, 8, 'x', 'x'], - ['x', 2, 'x', 4, 4, 3]], - 'Cb+7': [['x', 2, 5, 2, 4, 3], - [7, 'x', 7, 8, 8, 'x'], - ['x', 'x', 9, 12, 10, 11], - ['x', 2, 'x', 2, 4, 3]], - 'Cb+7b9': [['x', 2, 1, 2, 1, 3], - [7, 'x', 7, 8, 8, 8]], - 'Cb+7#9': [['x', 2, 1, 2, 3, 3], - [7, 'x', 7, 8, 8, 10]], - 'Cb+9': [['x', 2, 1, 2, 2, 3], - [7, 'x', 7, 8, 8, 9]], - 'Cb11': [['x', 14, 13, 14, 12, 12], - ['x', 2, 2, 2, 4, 2], - ['x', 'x', 9, 9, 10, 11]], - 'Cb7b5#9': [['x', 2, 1, 2, 3, 1]], - 'Cb7b9': [['x', 2, 1, 2, 1, 'x'], - [7, 9, 7, 8, 7, 8], - ['x', 2, 1, 2, 1, 2], - ['x', 'x', 9, 8, 10, 8]], - 'Cb7#11': [[7, 8, 7, 8, 7, 7]], - 'Cb7#9': [['x', 2, 1, 2, 3, 'x'], - [7, 9, 7, 8, 7, 10], - ['x', 'x', 9, 8, 10, 10]], - 'Cb9': [[7, 9, 7, 8, 7, 9], - ['x', 2, 1, 2, 2, 2], - [7, 'x', 7, 6, 4, 'x'], - ['x', 'x', 9, 8, 10, 9], - [7, 6, 7, 6, 7, 'x']], - 'Cb9sus4': [['x', 2, 2, 2, 2, 2], - [7, 'x', 7, 6, 5, 'x'], - [7, 'x', 7, 6, 5, 5]], - 'Cb9b5': [['x', 2, 1, 2, 2, 1], - [7, 6, 7, 6, 6, 'x']], - 'Cbadd9': [['x', 'x', 9, 8, 7, 9], - ['x', 2, 4, 6, 4, 2], - [7, 'x', 'x', 8, 7, 9]], - 'Cb13': [['x', 2, 1, 2, 2, 4], - [7, 'x', 7, 6, 4, 4], - [7, 'x', 7, 8, 9, 9], - [7, 9, 7, 8, 9, 7]], - 'Cb13sus4': [['x', 2, 2, 2, 2, 4], - [7, 'x', 7, 9, 9, 9]], - 'Cb5': [[7, 9, 9, 'x', 'x', 'x'], - ['x', 2, 4, 4, 'x', 'x'], - ['x', 'x', 'x', 4, 7, 7], - ['x', 'x', 9, 11, 12, 'x']], - 'Cb6': [['x', 2, 4, 4, 4, 4], - ['x', 'x', 9, 11, 9, 11], - [7, 'x', 6, 8, 7, 'x']], - 'Cb7': [['x', 2, 4, 2, 4, 2], - [7, 9, 7, 8, 7, 7], - ['x', 'x', 9, 11, 10, 11], - ['x', 14, 13, 14, 12, 'x'], - [7, 'x', 7, 8, 7, 'x']], - 'Cb7sus4': [['x', 14, 14, 14, 12, 12], - ['x', 2, 4, 2, 5, 2], - [7, 9, 7, 9, 7, 7], - ['x', 'x', 9, 11, 10, 12]], - 'Cb7sus2': [[7, 'x', 7, 6, 7, 7]], - 'Cb7b5': [['x', 2, 3, 2, 4, 'x'], - [7, 'x', 7, 8, 6, 'x'], - ['x', 'x', 9, 10, 10, 11], - ['x', 2, 3, 2, 4, 5]], - 'Cbm9': [[7, 9, 7, 7, 7, 9], - ['x', 14, 12, 14, 14, 'x'], - ['x', 14, 12, 14, 14, 14], - ['x', 'x', 9, 7, 10, 9], - [7, 'x', 7, 7, 7, 9]], - 'Cbm7b5': [[7, 'x', 7, 7, 6, 'x'], - ['x', 2, 3, 2, 3, 'x'], - ['x', 'x', 9, 10, 10, 10], - [7, 8, 9, 10, 10, 10], - ['x', 2, 'x', 2, 3, 1], - [7, 8, 7, 7, 10, 7]], - 'Cbmadd9': [['x', 'x', 9, 7, 7, 9]], - 'CbMaj13': [['x', 2, 'x', 3, 4, 4], - [7, 6, 6, 6, 7, 6], - [7, 'x', 8, 8, 9, 9]], - 'CbMaj7': [['x', 'x', 9, 8, 7, 6], - ['x', 2, 4, 3, 4, 2], - [7, 'x', 8, 8, 7, 'x'], - ['x', 'x', 9, 11, 11, 11], - [7, 9, 8, 8, 7, 7]], - 'CbMaj7#11': [['x', 2, 3, 3, 4, 2], - [7, 'x', 8, 8, 6, 'x'], - ['x', 'x', 9, 10, 11, 11]], - 'Cbdim7': [['x', 2, 3, 1, 3, 'x'], - [7, 'x', 6, 7, 6, 'x'], - ['x', 'x', 9, 10, 9, 10]], - 'Cbm': [['x', 2, 4, 4, 3, 2], - [7, 9, 9, 7, 7, 7], - ['x', 'x', 9, 7, 7, 7], - ['x', 'x', 9, 11, 12, 10]], - 'Cbm11': [['x', 14, 12, 14, 12, 12], - ['x', 2, 2, 2, 3, 2], - [7, 'x', 7, 7, 5, 'x'], - ['x', 'x', 9, 9, 10, 10], - ['x', 14, 'x', 14, 15, 12]], - 'Cbm13': [['x', 2, 'x', 2, 3, 4], - [7, 9, 7, 7, 9, 7], - [7, 'x', 7, 7, 9, 9], - ['x', 2, 4, 2, 3, 4], - ['x', 14, 12, 14, 14, 16]], - 'Cbm6': [['x', 14, 12, 13, 12, 'x'], - [7, 9, 9, 7, 9, 7], - ['x', 'x', 9, 11, 9, 10], - ['x', 2, 4, 1, 3, 'x'], - ['x', 14, 12, 13, 12, 14], - [7, 'x', 6, 7, 7, 'x'], - ['x', 2, 'x', 1, 3, 2]], - 'Cbm7': [['x', 2, 4, 2, 3, 2], - [7, 9, 9, 7, 10, 7], - [7, 'x', 7, 7, 7, 'x'], - ['x', 14, 12, 14, 15, 'x'], - [7, 9, 7, 7, 7, 7], - ['x', 14, 12, 14, 12, 'x'], - ['x', 'x', 9, 11, 10, 10]], - 'Cbm9b5': [[7, 8, 7, 7, 10, 9]], - 'CbMaj9': [['x', 2, 1, 3, 2, 'x'], - ['x', 'x', 9, 8, 11, 9], - ['x', 14, 11, 11, 11, 11], - [7, 6, 8, 6, 7, 6], - [7, 'x', 8, 6, 7, 'x']], - 'CbmMaj7': [['x', 2, 4, 3, 3, 2], - [7, 'x', 8, 7, 7, 'x'], - [7, 9, 8, 7, 7, 7], - ['x', 'x', 9, 11, 11, 10], - ['x', 'x', 9, 7, 7, 6]], - 'CbmMaj9': [['x', 14, 12, 15, 14, 'x'], - [7, 9, 8, 7, 7, 9]], - 'Cbmb6': [['x', 14, 12, 12, 12, 14], - [7, 'x', 5, 7, 7, 'x']], - 'Cbsus2': [['x', 2, 4, 4, 2, 2], - ['x', 2, 4, 6, 'x', 'x'], - ['x', 'x', 9, 6, 7, 9], - ['x', 'x', 9, 11, 12, 9]], - 'Cbsus4': [['x', 2, 4, 4, 5, 2], - [7, 9, 9, 9, 7, 7], - ['x', 'x', 9, 11, 12, 12], - ['x', 'x', 9, 9, 7, 7]], - 'Cbdim': [['x', 2, 3, 4, 3, 'x'], - [7, 'x', 9, 7, 6, 'x'], - [7, 8, 9, 7, 'x', 'x']], - 'C': [['x', 3, 2, 0, 1, 0], - ['x', 3, 5, 5, 5, 3], - [8, 10, 10, 9, 8, 8], - [8, 7, 5, 5, 5, 8], - ['x', 'x', 10, 12, 13, 12]], - 'C11': [['x', 3, 2, 3, 1, 1], - ['x', 3, 3, 3, 5, 3], - ['x', 'x', 10, 10, 11, 12]], - 'C13': [['x', 3, 2, 3, 3, 5], - [8, 'x', 8, 7, 5, 5], - [8, 'x', 8, 9, 10, 10], - [8, 10, 8, 9, 10, 8]], - 'C5': [[8, 10, 10, 'x', 'x', 'x'], - ['x', 3, 5, 5, 'x', 'x'], - ['x', 'x', 'x', 5, 8, 8], - ['x', 'x', 10, 12, 13, 'x']], - 'C6': [['x', 3, 5, 5, 5, 5], - ['x', 'x', 10, 12, 10, 12], - [8, 'x', 7, 9, 8, 'x']], - 'C7': [['x', 3, 2, 3, 1, 0], - ['x', 3, 5, 3, 5, 3], - [8, 10, 8, 9, 8, 8], - ['x', 'x', 10, 12, 11, 12], - ['x', 3, 2, 3, 1, 'x'], - [8, 'x', 8, 9, 8, 'x']], - 'C7sus4': [['x', 3, 3, 3, 1, 1], - ['x', 3, 5, 3, 6, 3], - [8, 10, 8, 10, 8, 8], - ['x', 'x', 10, 12, 11, 13]], - 'C9': [['x', 3, 2, 3, 3, 0], - [8, 10, 8, 9, 8, 10], - ['x', 3, 2, 3, 3, 3], - [8, 'x', 8, 7, 5, 'x'], - ['x', 'x', 10, 9, 11, 10], - [8, 7, 8, 7, 8, 'x']], - 'Cadd9': [['x', 3, 2, 0, 3, 0], - ['x', 'x', 10, 9, 8, 10], - ['x', 3, 2, 0, 3, 3], - ['x', 3, 5, 7, 5, 3], - [8, 'x', 'x', 9, 8, 10]], - 'Cdim7': [['x', 3, 4, 2, 4, 'x'], - [8, 'x', 7, 8, 7, 'x'], - ['x', 'x', 10, 11, 10, 11]], - 'Cm': [['x', 3, 5, 5, 4, 3], - [8, 10, 10, 8, 8, 8], - ['x', 'x', 10, 8, 8, 8], - ['x', 'x', 10, 12, 13, 11]], - 'Cm6': [['x', 3, 1, 2, 1, 'x'], - [8, 10, 10, 8, 10, 8], - ['x', 'x', 10, 12, 10, 11], - ['x', 3, 5, 2, 4, 'x'], - ['x', 3, 1, 2, 1, 3], - [8, 'x', 7, 8, 8, 'x'], - ['x', 3, 'x', 2, 4, 3]], - 'Cm7': [['x', 3, 5, 3, 4, 3], - [8, 10, 10, 8, 11, 8], - [8, 'x', 8, 8, 8, 'x'], - ['x', 3, 1, 3, 4, 'x'], - [8, 10, 8, 8, 8, 8], - ['x', 3, 1, 3, 1, 'x'], - ['x', 'x', 10, 12, 11, 11]], - 'Cm7b5': [['x', 3, 4, 3, 4, 'x'], - [8, 'x', 8, 8, 7, 'x'], - ['x', 'x', 10, 11, 11, 11], - [8, 9, 10, 11, 11, 11], - ['x', 3, 'x', 3, 4, 2], - [8, 9, 8, 8, 11, 8]], - 'Cm9': [[8, 10, 8, 8, 8, 10], - ['x', 3, 1, 3, 3, 'x'], - ['x', 3, 1, 3, 3, 3], - ['x', 'x', 10, 8, 11, 10], - [8, 'x', 8, 8, 8, 10]], - 'CMaj7': [['x', 3, 2, 0, 0, 0], - ['x', 'x', 10, 9, 8, 7], - ['x', 3, 5, 4, 5, 3], - [8, 'x', 9, 9, 8, 'x'], - ['x', 'x', 10, 12, 12, 12], - [8, 10, 9, 9, 8, 8]], - 'Csus2': [['x', 3, 0, 0, 1, 3], - ['x', 3, 5, 5, 3, 3], - ['x', 3, 5, 7, 'x', 'x'], - ['x', 'x', 10, 7, 8, 10], - ['x', 'x', 10, 12, 13, 10]], - 'Csus4': [['x', 3, 3, 0, 1, 1], - ['x', 3, 5, 5, 6, 3], - [8, 10, 10, 10, 8, 8], - ['x', 'x', 10, 12, 13, 13], - ['x', 'x', 10, 10, 8, 8]], - 'CMaj9': [['x', 3, 2, 4, 3, 'x'], - ['x', 'x', 10, 9, 12, 10], - ['x', 15, 12, 12, 12, 12], - [8, 7, 9, 7, 8, 7], - [8, 'x', 9, 7, 8, 'x']], - 'CMaj7#11': [['x', 3, 2, 0, 0, 2], - ['x', 3, 4, 4, 5, 3], - [8, 'x', 9, 9, 7, 'x'], - ['x', 'x', 10, 11, 12, 12]], - 'CMaj13': [['x', 3, 'x', 4, 5, 5], - [8, 7, 7, 7, 8, 7], - [8, 'x', 9, 9, 10, 10], - ['x', 3, 2, 2, 0, 0]], - 'Cmadd9': [['x', 3, 1, 0, 3, 3], - ['x', 'x', 10, 8, 8, 10]], - 'Cmb6': [['x', 3, 1, 1, 1, 3], - [8, 'x', 6, 8, 8, 'x']], - 'CmMaj7': [['x', 3, 1, 0, 0, 3], - ['x', 3, 5, 4, 4, 3], - [8, 'x', 9, 8, 8, 'x'], - [8, 10, 9, 8, 8, 8], - ['x', 'x', 10, 12, 12, 11], - ['x', 'x', 10, 8, 8, 7]], - 'Cm9b5': [[8, 9, 8, 8, 11, 10]], - 'CmMaj9': [['x', 3, 1, 4, 3, 'x'], - [8, 10, 9, 8, 8, 10]], - 'Cm11': [['x', 3, 1, 3, 1, 1], - ['x', 3, 3, 3, 4, 3], - [8, 'x', 8, 8, 6, 'x'], - ['x', 'x', 10, 10, 11, 11], - ['x', 3, 'x', 3, 4, 1]], - 'Cm13': [['x', 3, 'x', 3, 4, 5], - [8, 10, 8, 8, 10, 8], - [8, 'x', 8, 8, 10, 10], - ['x', 3, 1, 3, 3, 5], - ['x', 3, 5, 3, 4, 5]], - 'C7b5': [['x', 3, 4, 3, 5, 'x'], - [8, 'x', 8, 9, 7, 'x'], - ['x', 'x', 10, 11, 11, 12], - ['x', 3, 4, 3, 5, 6]], - 'C9sus4': [['x', 3, 0, 3, 3, 1], - ['x', 3, 3, 3, 3, 3], - [8, 'x', 8, 7, 6, 6], - [8, 'x', 8, 7, 6, 'x']], - 'C9b5': [['x', 3, 2, 3, 3, 2], - [8, 7, 8, 7, 7, 'x']], - 'C7b9': [['x', 3, 2, 3, 2, 'x'], - [8, 10, 8, 9, 8, 9], - ['x', 3, 2, 3, 2, 3], - ['x', 'x', 10, 9, 11, 9]], - 'C7#9': [['x', 3, 2, 3, 4, 'x'], - [8, 10, 8, 9, 8, 11], - ['x', 'x', 10, 9, 11, 11]], - 'C7b5#9': [['x', 3, 2, 3, 4, 2]], - 'C7#11': [[8, 9, 8, 9, 8, 8]], - 'C13sus4': [['x', 3, 3, 3, 3, 5], - [8, 'x', 8, 10, 10, 10]], - 'C+': [['x', 3, 2, 1, 1, 'x'], - ['x', 'x', 10, 9, 9, 8], - [8, 7, 6, 5, 'x', 'x'], - [8, 11, 10, 9, 'x', 'x'], - ['x', 3, 'x', 5, 5, 4]], - 'C+7': [['x', 3, 6, 3, 5, 4], - [8, 'x', 8, 9, 9, 'x'], - ['x', 'x', 10, 13, 11, 12], - ['x', 3, 'x', 3, 5, 4]], - 'C+9': [['x', 3, 2, 3, 3, 4], - [8, 'x', 8, 9, 9, 10]], - 'C+7b9': [['x', 3, 2, 3, 2, 4], - [8, 'x', 8, 9, 9, 9]], - 'C+7#9': [['x', 3, 2, 3, 4, 4], - [8, 'x', 8, 9, 9, 11]], - 'Cdim': [['x', 3, 4, 5, 4, 'x'], - [8, 'x', 10, 8, 7, 'x'], - [8, 9, 10, 8, 'x', 'x']], - 'C7sus2': [[8, 'x', 8, 7, 8, 8]], - 'C#': [['x', 4, 6, 6, 6, 4], - [9, 11, 11, 10, 9, 9], - ['x', 4, 3, 1, 2, 1], - ['x', 'x', 11, 13, 12, 13], - [9, 8, 6, 6, 6, 9], - ['x', 'x', 11, 13, 14, 13]], - 'C#11': [['x', 4, 4, 4, 4, 4], - [9, 'x', 9, 8, 7, 7], - ['x', 4, 3, 4, 2, 2], - ['x', 4, 4, 4, 6, 4], - ['x', 'x', 11, 11, 12, 13]], - 'C#13': [['x', 4, 3, 4, 4, 6], - [9, 'x', 9, 8, 6, 6], - [9, 'x', 9, 10, 11, 11], - [9, 11, 9, 10, 11, 9]], - 'C#5': [['x', 4, 6, 6, 'x', 'x'], - [9, 11, 11, 'x', 'x', 'x'], - ['x', 'x', 'x', 6, 9, 9], - ['x', 'x', 11, 13, 14, 'x']], - 'C#6': [['x', 4, 6, 6, 6, 6], - [0, 0, 11, 10, 11, 9], - ['x', 'x', 11, 13, 11, 13], - [9, 'x', 8, 10, 9, 'x']], - 'C#7': [['x', 4, 6, 4, 6, 4], - [9, 11, 9, 10, 9, 9], - [9, 'x', 9, 10, 9, 'x'], - ['x', 4, 3, 4, 2, 'x'], - ['x', 'x', 11, 13, 12, 13]], - 'C#7sus4': [['x', 4, 4, 4, 2, 2], - [9, 11, 9, 11, 9, 9], - ['x', 4, 6, 4, 7, 4], - ['x', 'x', 11, 13, 12, 14]], - 'C#9': [['x', 4, 3, 4, 4, 'x'], - [9, 11, 9, 10, 9, 11], - [9, 'x', 9, 8, 9, 9], - ['x', 4, 3, 4, 4, 4], - [9, 'x', 9, 8, 6, 'x'], - ['x', 'x', 11, 10, 12, 11], - [9, 8, 9, 8, 9, 'x']], - 'C#add9': [['x', 4, 6, 6, 4, 4], - ['x', 'x', 11, 10, 9, 11], - ['x', 4, 1, 1, 2, 1], - ['x', 4, 6, 8, 6, 4], - [9, 'x', 'x', 10, 9, 11]], - 'C#aug': [['x', 4, 3, 2, 2, 'x'], - ['x', 'x', 11, 10, 10, 9], - [9, 8, 7, 6, 'x', 'x']], - 'C#dim7': [['x', 4, 5, 3, 5, 'x'], - [9, 10, 8, 9, 'x', 'x'], - [9, 'x', 8, 9, 8, 'x'], - ['x', 'x', 11, 12, 11, 12]], - 'C#m': [['x', 4, 6, 6, 5, 4], - [9, 11, 11, 9, 9, 9], - ['x', 'x', 11, 9, 9, 9], - ['x', 'x', 11, 13, 14, 12]], - 'C#m6': [['x', 4, 2, 3, 2, 'x'], - [9, 11, 11, 9, 11, 9], - ['x', 'x', 11, 13, 11, 12], - ['x', 4, 6, 3, 5, 'x'], - ['x', 4, 2, 3, 2, 4], - [9, 'x', 8, 9, 9, 'x'], - ['x', 4, 'x', 3, 5, 4]], - 'C#m7': [['x', 4, 6, 4, 5, 4], - [9, 11, 11, 9, 12, 9], - [9, 'x', 9, 9, 9, 'x'], - ['x', 4, 2, 4, 5, 'x'], - [9, 11, 9, 9, 9, 9], - ['x', 4, 2, 4, 2, 'x'], - ['x', 'x', 11, 13, 12, 12]], - 'C#m7b5': [['x', 4, 5, 4, 5, 'x'], - [9, 'x', 9, 9, 8, 'x'], - [9, 10, 11, 12, 12, 12], - ['x', 'x', 11, 12, 12, 12], - ['x', 4, 'x', 4, 5, 3], - [9, 10, 9, 9, 12, 9]], - 'C#m9': [['x', 4, 2, 4, 4, 'x'], - [9, 11, 9, 9, 9, 11], - ['x', 4, 2, 4, 4, 4], - ['x', 'x', 11, 9, 12, 11], - [9, 'x', 9, 9, 9, 11]], - 'C#Maj7': [['x', 4, 6, 5, 6, 4], - ['x', 'x', 11, 10, 9, 8], - ['x', 'x', 11, 13, 13, 13], - ['x', 4, 3, 1, 1, 'x'], - [9, 'x', 10, 10, 9, 'x'], - [9, 11, 10, 10, 9, 9]], - 'C#sus2': [['x', 4, 6, 6, 4, 4], - ['x', 4, 1, 1, 2, 4], - ['x', 4, 6, 8, 'x', 'x'], - ['x', 'x', 11, 8, 9, 11], - ['x', 'x', 11, 13, 14, 11]], - 'C#sus4': [['x', 4, 6, 6, 7, 4], - [9, 11, 11, 11, 9, 9], - ['x', 4, 4, 1, 2, 'x'], - ['x', 'x', 11, 13, 14, 14], - ['x', 'x', 11, 11, 9, 9]], - 'C#+': [['x', 4, 3, 2, 2, 'x'], - ['x', 'x', 11, 10, 10, 9], - [9, 8, 7, 6, 'x', 'x'], - [9, 12, 11, 10, 'x', 'x'], - ['x', 4, 'x', 6, 6, 5]], - 'C#+7': [['x', 4, 7, 4, 6, 5], - [9, 'x', 9, 10, 10, 'x'], - ['x', 'x', 11, 14, 12, 13], - ['x', 4, 'x', 4, 6, 5]], - 'C#+7b9': [['x', 4, 3, 4, 3, 5], - [9, 'x', 9, 10, 10, 10]], - 'C#+7#9': [['x', 4, 3, 4, 5, 5], - [9, 'x', 9, 10, 10, 12]], - 'C#+9': [['x', 4, 3, 4, 4, 5], - [9, 'x', 9, 10, 10, 11]], - 'C#7b5#9': [['x', 4, 3, 4, 5, 3]], - 'C#7b9': [['x', 4, 3, 4, 3, 'x'], - [9, 11, 9, 10, 9, 10], - ['x', 4, 3, 4, 3, 4], - ['x', 'x', 11, 10, 12, 10]], - 'C#7#11': [[9, 10, 9, 10, 9, 9]], - 'C#7#9': [['x', 4, 3, 4, 5, 'x'], - [9, 11, 9, 10, 9, 12], - ['x', 'x', 11, 10, 12, 12]], - 'C#9sus4': [['x', 4, 4, 4, 4, 4], - [9, 'x', 9, 8, 7, 'x'], - [9, 'x', 9, 8, 7, 7]], - 'C#9b5': [['x', 4, 3, 4, 4, 3], - [9, 8, 9, 8, 8, 'x']], - 'C#13sus4': [['x', 4, 4, 4, 4, 6], - [9, 'x', 9, 11, 11, 11]], - 'C#7sus2': [[9, 'x', 9, 8, 9, 9]], - 'C#7b5': [['x', 4, 5, 4, 6, 'x'], - [9, 'x', 9, 10, 8, 'x'], - ['x', 'x', 11, 12, 12, 13], - ['x', 4, 5, 4, 6, 7]], - 'C#madd9': [['x', 'x', 11, 9, 9, 11]], - 'C#Maj13': [['x', 4, 'x', 5, 6, 6], - [9, 8, 8, 8, 9, 8], - [9, 'x', 10, 10, 11, 11]], - 'C#Maj7#11': [['x', 4, 5, 5, 6, 4], - [9, 'x', 10, 10, 8, 'x'], - ['x', 'x', 11, 12, 13, 13]], - 'C#m11': [['x', 4, 2, 4, 2, 2], - ['x', 4, 4, 4, 5, 4], - [9, 'x', 9, 9, 7, 'x'], - ['x', 'x', 11, 11, 12, 12], - ['x', 4, 'x', 4, 5, 2]], - 'C#m13': [['x', 4, 'x', 4, 5, 6], - [9, 11, 9, 9, 11, 9], - [9, 'x', 9, 9, 11, 11], - ['x', 4, 6, 4, 5, 6], - ['x', 4, 2, 4, 4, 6]], - 'C#m9b5': [[9, 10, 9, 9, 12, 11]], - 'C#Maj9': [['x', 4, 3, 5, 4, 'x'], - ['x', 'x', 11, 10, 13, 11], - ['x', 4, 1, 1, 1, 1], - [9, 8, 10, 8, 9, 8], - [9, 'x', 10, 8, 9, 'x']], - 'C#mMaj7': [['x', 4, 6, 5, 5, 4], - [9, 'x', 10, 9, 9, 'x'], - [9, 11, 10, 9, 9, 9], - ['x', 'x', 11, 13, 13, 12], - ['x', 'x', 11, 9, 9, 8]], - 'C#mMaj9': [['x', 4, 2, 5, 4, 'x'], - [9, 11, 10, 9, 9, 11]], - 'C#mb6': [['x', 4, 2, 2, 2, 4], - [9, 'x', 7, 9, 9, 'x']], - 'C#dim': [['x', 4, 5, 6, 5, 'x'], - [9, 'x', 11, 9, 8, 'x'], - [9, 10, 11, 9, 'x', 'x']], - 'Db': [['x', 4, 6, 6, 6, 4], - [9, 11, 11, 10, 9, 9], - ['x', 4, 3, 1, 2, 1], - [9, 8, 6, 6, 6, 9], - ['x', 'x', 11, 13, 14, 13]], - 'Db11': [['x', 4, 'x', 4, 4, 3], - ['x', 4, 4, 4, 4, 4], - [9, 'x', 9, 8, 7, 7], - ['x', 4, 3, 4, 2, 2], - ['x', 4, 4, 4, 6, 4], - ['x', 'x', 11, 11, 12, 13]], - 'Db13': [['x', 4, 3, 4, 4, 6], - [9, 'x', 9, 8, 6, 6], - [9, 'x', 9, 10, 11, 11], - [9, 11, 9, 10, 11, 9]], - 'Db5': [['x', 4, 6, 6, 'x', 'x'], - [9, 11, 11, 'x', 'x', 'x'], - ['x', 'x', 'x', 6, 9, 9], - ['x', 'x', 11, 13, 14, 'x']], - 'Db6': [['x', 4, 6, 6, 6, 6], - [0, 0, 11, 10, 11, 9], - ['x', 'x', 11, 13, 11, 13], - [9, 'x', 8, 10, 9, 'x']], - 'Db7': [['x', 4, 6, 4, 6, 4], - [9, 11, 9, 10, 9, 9], - [9, 'x', 9, 10, 9, 'x'], - ['x', 'x', 11, 13, 12, 13], - ['x', 4, 3, 4, 2, 'x']], - 'Db7sus4': [['x', 4, 4, 4, 2, 2], - [9, 11, 9, 11, 9, 9], - ['x', 4, 6, 4, 7, 4], - ['x', 'x', 11, 13, 12, 14]], - 'Db9': [['x', 4, 3, 4, 4, 'x'], - [9, 11, 9, 10, 9, 11], - [9, 'x', 9, 8, 9, 9], - ['x', 4, 3, 4, 4, 4], - [9, 'x', 9, 8, 6, 'x'], - ['x', 'x', 11, 10, 12, 11], - [9, 8, 9, 8, 9, 'x']], - 'Dbadd9': [['x', 4, 6, 6, 4, 4], - ['x', 'x', 11, 10, 9, 11], - ['x', 4, 1, 1, 2, 1], - ['x', 4, 6, 8, 6, 4], - [9, 'x', 'x', 10, 9, 11]], - 'Dbaug': [['x', 4, 3, 2, 2, 'x'], - ['x', 'x', 11, 10, 10, 9], - [9, 8, 7, 6, 'x', 'x']], - 'Dbdim7': [['x', 4, 5, 3, 5, 'x'], - [9, 10, 8, 9, 'x', 'x'], - [9, 'x', 8, 9, 8, 'x'], - ['x', 'x', 11, 12, 11, 12]], - 'Dbm': [['x', 4, 6, 6, 5, 4], - [9, 11, 11, 9, 9, 9], - ['x', 'x', 11, 9, 9, 9], - ['x', 'x', 11, 13, 14, 12]], - 'Dbm6': [['x', 4, 2, 3, 2, 'x'], - [9, 11, 11, 9, 11, 9], - ['x', 'x', 11, 13, 11, 12], - ['x', 4, 6, 3, 5, 'x'], - ['x', 4, 2, 3, 2, 4], - [9, 'x', 8, 9, 9, 'x'], - ['x', 4, 'x', 3, 5, 4]], - 'Dbm7': [['x', 4, 6, 4, 5, 4], - [9, 11, 11, 9, 12, 9], - [9, 'x', 9, 9, 9, 'x'], - ['x', 4, 2, 4, 5, 'x'], - [9, 11, 9, 9, 9, 9], - ['x', 4, 2, 4, 2, 'x'], - ['x', 'x', 11, 13, 12, 12]], - 'Dbm7b5': [['x', 4, 5, 4, 5, 'x'], - [9, 'x', 9, 9, 8, 'x'], - [9, 10, 11, 12, 12, 12], - ['x', 'x', 11, 12, 12, 12], - ['x', 4, 'x', 4, 5, 3], - [9, 10, 9, 9, 12, 9]], - 'Dbm9': [[9, 11, 9, 9, 9, 11], - ['x', 4, 2, 4, 4, 'x'], - ['x', 4, 2, 4, 4, 4], - ['x', 'x', 11, 9, 12, 11], - [9, 'x', 9, 9, 9, 11]], - 'DbMaj7': [['x', 4, 6, 5, 6, 4], - ['x', 'x', 11, 10, 9, 8], - ['x', 'x', 11, 13, 13, 13], - ['x', 4, 3, 1, 1, 'x'], - [9, 'x', 10, 10, 9, 'x'], - [9, 11, 10, 10, 9, 9]], - 'Dbsus2': [['x', 4, 6, 6, 4, 4], - ['x', 4, 1, 1, 2, 4], - ['x', 4, 6, 8, 'x', 'x'], - ['x', 'x', 11, 8, 9, 11], - ['x', 'x', 11, 13, 14, 11]], - 'Dbsus4': [['x', 4, 6, 6, 7, 4], - [9, 11, 11, 11, 9, 9], - ['x', 4, 4, 1, 2, 'x'], - ['x', 'x', 11, 13, 14, 14], - ['x', 'x', 11, 11, 9, 9]], - 'Db+': [['x', 4, 3, 2, 2, 'x'], - ['x', 'x', 11, 10, 10, 9], - [9, 8, 7, 6, 'x', 'x'], - [9, 12, 11, 10, 'x', 'x'], - ['x', 4, 'x', 6, 6, 5]], - 'Db+7': [['x', 4, 7, 4, 6, 5], - [9, 'x', 9, 10, 10, 'x'], - ['x', 'x', 11, 14, 12, 13], - ['x', 4, 'x', 4, 6, 5]], - 'Db+7b9': [['x', 4, 3, 4, 3, 5], - [9, 'x', 9, 10, 10, 10]], - 'Db+7#9': [['x', 4, 3, 4, 5, 5], - [9, 'x', 9, 10, 10, 12]], - 'Db+9': [['x', 4, 3, 4, 4, 5], - [9, 'x', 9, 10, 10, 11]], - 'Db7b5#9': [['x', 4, 3, 4, 5, 3]], - 'Db7b9': [['x', 4, 3, 4, 3, 'x'], - [9, 11, 9, 10, 9, 10], - ['x', 4, 3, 4, 3, 4], - ['x', 'x', 11, 10, 12, 10]], - 'Db7#11': [[9, 10, 9, 10, 9, 9]], - 'Db7#9': [['x', 4, 3, 4, 5, 'x'], - [9, 11, 9, 10, 9, 12], - ['x', 'x', 11, 10, 12, 12]], - 'Db9sus4': [['x', 4, 4, 4, 4, 4], - [9, 'x', 9, 8, 7, 'x'], - [9, 'x', 9, 8, 7, 7]], - 'Db9b5': [['x', 4, 3, 4, 4, 3], - [9, 8, 9, 8, 8, 'x']], - 'Db13sus4': [['x', 4, 4, 4, 4, 6], - [9, 'x', 9, 11, 11, 11]], - 'Db7sus2': [[9, 'x', 9, 8, 9, 9]], - 'Db7b5': [['x', 4, 5, 4, 6, 'x'], - [9, 'x', 9, 10, 8, 'x'], - ['x', 'x', 11, 12, 12, 13], - ['x', 4, 5, 4, 6, 7]], - 'Dbmadd9': [['x', 'x', 11, 9, 9, 11]], - 'DbMaj13': [['x', 4, 'x', 5, 6, 6], - [9, 8, 8, 8, 9, 8], - [9, 'x', 10, 10, 11, 11]], - 'DbMaj7#11': [['x', 4, 5, 5, 6, 4], - [9, 'x', 10, 10, 8, 'x'], - ['x', 'x', 11, 12, 13, 13]], - 'Dbm11': [['x', 4, 2, 4, 2, 2], - ['x', 4, 4, 4, 5, 4], - [9, 'x', 9, 9, 7, 'x'], - ['x', 'x', 11, 11, 12, 12], - ['x', 4, 'x', 4, 5, 2]], - 'Dbm13': [['x', 4, 'x', 4, 5, 6], - [9, 11, 9, 9, 11, 9], - [9, 'x', 9, 9, 11, 11], - ['x', 4, 6, 4, 5, 6], - ['x', 4, 2, 4, 4, 6]], - 'Dbm9b5': [[9, 10, 9, 9, 12, 11]], - 'DbMaj9': [['x', 4, 3, 5, 4, 'x'], - ['x', 'x', 11, 10, 13, 11], - ['x', 4, 1, 1, 1, 1], - [9, 8, 10, 8, 9, 8], - [9, 'x', 10, 8, 9, 'x']], - 'DbmMaj7': [['x', 4, 6, 5, 5, 4], - [9, 'x', 10, 9, 9, 'x'], - [9, 11, 10, 9, 9, 9], - ['x', 'x', 11, 13, 13, 12], - ['x', 'x', 11, 9, 9, 8]], - 'DbmMaj9': [['x', 4, 2, 5, 4, 'x'], - [9, 11, 10, 9, 9, 11]], - 'Dbmb6': [['x', 4, 2, 2, 2, 4], - [9, 'x', 7, 9, 9, 'x']], - 'Dbdim': [['x', 4, 5, 6, 5, 'x'], - [9, 'x', 11, 9, 8, 'x'], - [9, 10, 11, 9, 'x', 'x']], - 'D': [['x', 'x', 0, 2, 3, 2], - ['x', 5, 7, 7, 7, 5], - [10, 12, 12, 11, 10, 10], - ['x', 5, 4, 2, 3, 2], - [10, 9, 7, 7, 7, 10], - ['x', 'x', 12, 14, 15, 14]], - 'D11': [['x', 5, 5, 5, 5, 5], - [10, 'x', 10, 9, 8, 8], - ['x', 'x', 0, 5, 5, 3], - ['x', 5, 4, 5, 3, 3], - ['x', 5, 5, 5, 7, 5], - ['x', 'x', 12, 12, 13, 14]], - 'D13': [[10, 'x', 10, 9, 7, 7], - ['x', 5, 4, 5, 5, 7], - [10, 'x', 10, 11, 12, 12], - [10, 12, 10, 11, 12, 10]], - 'D5': [['x', 5, 7, 7, 'x', 'x'], - ['x', 'x', 0, 2, 3, 'x'], - [10, 12, 12, 'x', 'x', 'x'], - ['x', 'x', 'x', 7, 10, 10], - ['x', 'x', 12, 14, 15, 'x']], - 'D6': [['x', 'x', 0, 2, 0, 2], - ['x', 5, 7, 7, 7, 7], - [0, 0, 12, 11, 12, 10], - ['x', 'x', 12, 14, 12, 14], - [10, 'x', 9, 11, 10, 'x']], - 'D7': [['x', 'x', 0, 2, 1, 2], - ['x', 5, 7, 5, 7, 5], - [10, 12, 10, 11, 10, 10], - [10, 'x', 10, 11, 10, 'x'], - ['x', 5, 4, 5, 3, 'x'], - ['x', 'x', 12, 14, 13, 14]], - 'D7sus4': [['x', 'x', 0, 2, 1, 3], - ['x', 5, 5, 5, 3, 3], - ['x', 5, 7, 5, 8, 5], - [10, 12, 10, 12, 10, 10], - ['x', 'x', 12, 14, 13, 15]], - 'D9': [['x', 'x', 0, 2, 1, 0], - ['x', 5, 4, 5, 5, 'x'], - [10, 12, 10, 11, 10, 12], - [10, 'x', 10, 9, 10, 10], - ['x', 5, 4, 5, 5, 5], - [10, 'x', 10, 9, 7, 'x'], - ['x', 'x', 12, 11, 13, 12], - [10, 9, 10, 9, 10, 'x']], - 'Dadd9': [['x', 5, 4, 2, 3, 0], - ['x', 'x', 10, 11, 10, 12], - ['x', 5, 7, 7, 5, 5], - ['x', 'x', 12, 11, 10, 12], - ['x', 5, 7, 9, 7, 5], - [10, 'x', 'x', 11, 10, 12]], - 'Daug': [['x', 'x', 0, 3, 3, 2], - ['x', 5, 4, 3, 3, 'x'], - ['x', 'x', 12, 11, 11, 10], - [10, 9, 8, 7, 'x', 'x']], - 'Ddim7': [['x', 'x', 0, 1, 0, 1], - ['x', 5, 6, 4, 6, 'x'], - [10, 'x', 9, 10, 9, 'x'], - ['x', 'x', 12, 13, 12, 13]], - 'Dm': [['x', 'x', 0, 2, 3, 1], - ['x', 5, 7, 7, 6, 5], - [10, 12, 12, 10, 10, 10], - ['x', 'x', 12, 10, 10, 10], - ['x', 'x', 12, 14, 15, 13]], - 'Dm6': [['x', 'x', 0, 2, 0, 1], - [10, 12, 12, 10, 12, 10], - ['x', 5, 3, 4, 3, 'x'], - ['x', 'x', 12, 14, 12, 13], - ['x', 5, 7, 4, 6, 'x'], - ['x', 5, 3, 4, 3, 5], - [10, 'x', 9, 10, 10, 'x'], - ['x', 5, 'x', 4, 6, 5]], - 'Dm7': [['x', 'x', 0, 2, 1, 1], - ['x', 5, 7, 5, 6, 5], - [10, 12, 10, 10, 10, 10], - [10, 'x', 10, 10, 10, 'x'], - [10, 12, 12, 10, 13, 10], - ['x', 5, 3, 5, 6, 'x'], - ['x', 5, 3, 5, 3, 'x'], - ['x', 'x', 12, 14, 13, 13]], - 'Dm7b5': [['x', 'x', 0, 1, 1, 1], - ['x', 5, 6, 5, 6, 'x'], - [10, 'x', 10, 10, 9, 'x'], - [10, 11, 12, 13, 13, 13], - ['x', 'x', 12, 13, 13, 13], - ['x', 5, 'x', 5, 6, 4], - [10, 11, 10, 10, 13, 10]], - 'Dm9': [[10, 12, 10, 10, 10, 12], - ['x', 5, 3, 5, 5, 'x'], - ['x', 5, 3, 5, 5, 5], - ['x', 'x', 12, 10, 13, 12], - [10, 'x', 10, 10, 10, 12]], - 'DMaj7': [['x', 'x', 0, 2, 2, 2], - ['x', 5, 7, 6, 7, 5], - ['x', 'x', 12, 11, 10, 9], - ['x', 'x', 12, 14, 14, 14], - ['x', 5, 4, 2, 2, 'x'], - [10, 'x', 11, 11, 10, 'x'], - [10, 12, 11, 11, 10, 10]], - 'Dsus2': [['x', 'x', 0, 2, 3, 0], - ['x', 5, 7, 7, 5, 5], - ['x', 5, 7, 9, 'x', 'x'], - ['x', 'x', 12, 9, 10, 12], - ['x', 'x', 12, 14, 15, 12]], - 'Dsus4': [['x', 'x', 0, 2, 3, 3], - ['x', 5, 7, 7, 8, 5], - [10, 12, 12, 12, 10, 10], - ['x', 5, 5, 2, 3, 'x'], - ['x', 'x', 12, 14, 15, 15], - ['x', 'x', 12, 12, 10, 10]], - 'D+': [['x', 5, 4, 3, 3, 'x'], - ['x', 'x', 12, 11, 11, 10], - [10, 9, 8, 7, 'x', 'x'], - [10, 13, 12, 11, 'x', 'x'], - ['x', 5, 'x', 7, 7, 6]], - 'D+7': [['x', 5, 8, 5, 7, 6], - [10, 'x', 10, 11, 11, 'x'], - ['x', 'x', 12, 15, 13, 14], - ['x', 5, 'x', 5, 7, 6]], - 'D+7b9': [['x', 5, 4, 5, 4, 6], - [10, 'x', 10, 11, 11, 11]], - 'D+7#9': [['x', 5, 4, 5, 6, 6], - [10, 'x', 10, 11, 11, 13]], - 'D+9': [['x', 5, 4, 5, 5, 6], - [10, 'x', 10, 11, 11, 12]], - 'D7b5#9': [['x', 5, 4, 5, 6, 4]], - 'D7b9': [['x', 5, 4, 5, 4, 'x'], - [10, 12, 10, 11, 10, 11], - ['x', 5, 4, 5, 4, 5], - ['x', 'x', 12, 11, 13, 11]], - 'D7#11': [[10, 11, 10, 11, 10, 10]], - 'D7#9': [['x', 5, 4, 5, 6, 'x'], - [10, 12, 10, 11, 10, 13], - ['x', 'x', 12, 11, 13, 13]], - 'D9sus4': [['x', 5, 5, 5, 5, 5], - [10, 'x', 10, 9, 8, 'x'], - [10, 'x', 10, 9, 8, 8]], - 'D9b5': [['x', 5, 4, 5, 5, 4], - [10, 9, 10, 9, 9, 'x']], - 'D13sus4': [['x', 5, 5, 5, 5, 7], - [10, 'x', 10, 12, 12, 12]], - 'D7sus2': [[10, 'x', 10, 9, 10, 10]], - 'D7b5': [['x', 5, 6, 5, 7, 'x'], - [10, 'x', 10, 11, 9, 'x'], - ['x', 'x', 12, 13, 13, 14], - ['x', 5, 6, 5, 7, 8]], - 'Dmadd9': [['x', 'x', 12, 10, 10, 12]], - 'DMaj13': [['x', 5, 'x', 6, 7, 7], - [10, 9, 9, 9, 10, 9], - [10, 'x', 11, 11, 12, 12]], - 'DMaj7#11': [['x', 5, 6, 6, 7, 5], - [10, 'x', 11, 11, 9, 'x'], - ['x', 'x', 12, 13, 14, 14]], - 'Dm11': [['x', 5, 3, 5, 3, 3], - ['x', 5, 5, 5, 6, 5], - [10, 'x', 10, 10, 8, 'x'], - ['x', 'x', 12, 12, 13, 13], - ['x', 5, 'x', 5, 6, 3]], - 'Dm13': [['x', 5, 'x', 5, 6, 7], - [10, 12, 10, 10, 12, 10], - [10, 'x', 10, 10, 12, 12], - ['x', 5, 7, 5, 6, 7], - ['x', 5, 3, 5, 5, 7]], - 'Dm9b5': [[10, 11, 10, 10, 13, 12]], - 'DMaj9': [['x', 5, 4, 6, 5, 'x'], - ['x', 'x', 12, 11, 14, 12], - ['x', 5, 2, 2, 2, 2], - [10, 9, 11, 9, 10, 9], - [10, 'x', 11, 9, 10, 'x']], - 'DmMaj7': [['x', 5, 7, 6, 6, 5], - [10, 'x', 11, 10, 10, 'x'], - [10, 12, 11, 10, 10, 10], - ['x', 'x', 12, 14, 14, 13], - ['x', 'x', 12, 10, 10, 9]], - 'DmMaj9': [['x', 5, 3, 6, 5, 'x'], - [10, 12, 11, 10, 10, 12]], - 'Dmb6': [['x', 5, 3, 3, 3, 5], - [10, 'x', 8, 10, 10, 'x']], - 'Ddim': [['x', 5, 6, 7, 6, 'x'], - [10, 'x', 12, 10, 9, 'x'], - [10, 11, 12, 10, 'x', 'x']], - 'D#': [['x', 6, 8, 8, 8, 6], - ['x', 6, 5, 3, 4, 3], - ['x', 'x', 1, 3, 4, 3], - [11, 13, 13, 12, 11, 11], - [11, 10, 8, 8, 8, 11]], - 'D#11': [['x', 6, 6, 6, 6, 6], - [11, 'x', 11, 10, 9, 9], - ['x', 6, 5, 6, 4, 4], - ['x', 6, 6, 6, 8, 6], - ['x', 'x', 1, 1, 2, 3]], - 'D#13': [['x', 6, 5, 6, 6, 8], - [11, 'x', 11, 10, 8, 8], - [11, 'x', 11, 12, 13, 13], - [11, 13, 11, 12, 13, 11]], - 'D#5': [['x', 6, 8, 8, 'x', 'x'], - [11, 13, 13, 'x', 'x', 'x'], - ['x', 'x', 'x', 8, 11, 11], - ['x', 'x', 1, 3, 4, 'x']], - 'D#6': [['x', 'x', 1, 3, 1, 3], - ['x', 6, 8, 8, 8, 8], - ['x', 'x', 13, 15, 13, 15], - [11, 'x', 10, 12, 11, 'x']], - 'D#7': [['x', 'x', 1, 3, 2, 3], - ['x', 6, 8, 6, 8, 6], - [11, 'x', 11, 12, 11, 'x'], - ['x', 6, 5, 6, 4, 'x'], - [11, 13, 11, 12, 11, 11]], - 'D#7sus4': [['x', 6, 6, 6, 4, 4], - ['x', 6, 8, 6, 9, 6], - [11, 13, 11, 13, 11, 11], - ['x', 'x', 1, 3, 2, 4]], - 'D#9': [['x', 6, 5, 6, 6, 'x'], - [11, 13, 11, 12, 11, 13], - ['x', 6, 5, 6, 6, 6], - [11, 'x', 11, 10, 8, 'x'], - ['x', 'x', 13, 12, 14, 13], - [11, 10, 11, 10, 11, 'x']], - 'D#add9': [['x', 6, 8, 8, 6, 6], - ['x', 'x', 13, 12, 11, 13], - ['x', 6, 8, 10, 8, 6], - [11, 'x', 'x', 12, 11, 13]], - 'D#aug': [['x', 6, 5, 4, 4, 'x'], - [11, 10, 9, 8, 'x', 'x']], - 'D#dim7': [['x', 6, 7, 5, 7, 'x'], - ['x', 'x', 1, 2, 1, 2], - [11, 'x', 10, 11, 10, 'x']], - 'D#m': [['x', 6, 8, 8, 7, 6], - ['x', 'x', 1, 3, 4, 2], - [11, 13, 13, 11, 11, 11], - ['x', 'x', 13, 11, 11, 11]], - 'D#m6': [['x', 'x', 1, 3, 1, 2], - ['x', 6, 4, 5, 4, 'x'], - ['x', 'x', 13, 15, 13, 14], - ['x', 6, 8, 5, 7, 'x'], - [11, 13, 13, 11, 13, 11], - ['x', 6, 4, 5, 4, 6], - [11, 'x', 10, 11, 11, 'x'], - ['x', 6, 'x', 5, 7, 6]], - 'D#m7': [['x', 'x', 1, 3, 2, 2], - ['x', 6, 8, 6, 7, 6], - [11, 'x', 11, 11, 11, 'x'], - [11, 13, 11, 11, 14, 11], - ['x', 6, 4, 6, 7, 'x'], - [11, 13, 13, 11, 14, 11], - [11, 13, 11, 11, 11, 11], - ['x', 6, 4, 6, 4, 'x']], - 'D#m7b5': [['x', 6, 7, 6, 7, 'x'], - ['x', 'x', 1, 2, 2, 2], - [11, 'x', 11, 11, 10, 'x'], - [11, 12, 13, 14, 14, 14], - ['x', 6, 'x', 6, 7, 5], - [11, 12, 11, 11, 14, 11]], - 'D#m9': [['x', 6, 4, 6, 6, 'x'], - [11, 13, 11, 11, 11, 13], - ['x', 6, 4, 6, 6, 6], - ['x', 'x', 13, 11, 14, 13], - [11, 'x', 11, 11, 11, 13]], - 'D#Maj7': [['x', 'x', 1, 3, 3, 3], - ['x', 6, 8, 7, 8, 6], - ['x', 'x', 13, 15, 15, 15], - ['x', 6, 5, 3, 3, 'x'], - ['x', 'x', 13, 12, 11, 10], - [11, 'x', 12, 12, 11, 'x'], - [11, 13, 12, 12, 11, 11]], - 'D#sus2': [['x', 'x', 1, 3, 4, 1], - ['x', 6, 8, 8, 6, 6], - ['x', 6, 8, 10, 'x', 'x'], - ['x', 'x', 13, 10, 11, 13]], - 'D#sus4': [['x', 6, 8, 8, 9, 6], - ['x', 6, 6, 3, 4, 'x'], - ['x', 6, 8, 8, 9, 6], - [11, 13, 13, 13, 11, 11], - ['x', 'x', 1, 3, 4, 4], - ['x', 'x', 13, 13, 11, 11]], - 'D#+': [['x', 6, 5, 4, 4, 'x'], - ['x', 'x', 13, 12, 12, 11], - [11, 10, 9, 8, 'x', 'x'], - [11, 14, 13, 12, 'x', 'x'], - ['x', 6, 'x', 8, 8, 7]], - 'D#+7': [['x', 6, 9, 6, 8, 7], - [11, 'x', 11, 12, 12, 'x'], - ['x', 'x', 1, 4, 2, 3], - ['x', 6, 'x', 6, 8, 7]], - 'D#+7b9': [['x', 6, 5, 6, 5, 7], - [11, 'x', 11, 12, 12, 12]], - 'D#+7#9': [['x', 6, 5, 6, 7, 7], - [11, 'x', 11, 12, 12, 14]], - 'D#+9': [['x', 6, 5, 6, 6, 7], - [11, 'x', 11, 12, 12, 13]], - 'D#7b5#9': [['x', 6, 5, 6, 7, 5]], - 'D#7b9': [['x', 6, 5, 6, 5, 'x'], - [11, 13, 11, 12, 11, 12], - ['x', 6, 5, 6, 5, 6], - ['x', 'x', 13, 12, 14, 12]], - 'D#7#11': [[11, 12, 11, 12, 11, 11]], - 'D#7#9': [['x', 6, 5, 6, 7, 'x'], - [11, 13, 11, 12, 11, 14], - ['x', 'x', 13, 12, 14, 14]], - 'D#9sus4': [['x', 6, 6, 6, 6, 6], - [11, 'x', 11, 10, 9, 'x'], - [11, 'x', 11, 10, 9, 9]], - 'D#9b5': [['x', 6, 5, 6, 6, 5], - [11, 10, 11, 10, 10, 'x']], - 'D#13sus4': [['x', 6, 6, 6, 6, 8], - [11, 'x', 11, 13, 13, 13]], - 'D#7sus2': [[11, 'x', 11, 10, 11, 11]], - 'D#7b5': [['x', 6, 7, 6, 8, 'x'], - [11, 'x', 11, 12, 10, 'x'], - ['x', 'x', 1, 2, 2, 3], - ['x', 6, 7, 6, 8, 9]], - 'D#madd9': [['x', 'x', 13, 11, 11, 13]], - 'D#Maj13': [['x', 6, 'x', 7, 8, 8], - [11, 10, 10, 10, 11, 10], - [11, 'x', 12, 12, 13, 13]], - 'D#Maj7#11': [['x', 6, 7, 7, 8, 6], - [11, 'x', 12, 12, 10, 'x'], - ['x', 'x', 1, 2, 3, 3]], - 'D#m11': [['x', 6, 4, 6, 4, 4], - ['x', 6, 6, 6, 7, 6], - [11, 'x', 11, 11, 9, 'x'], - ['x', 'x', 1, 1, 2, 2], - ['x', 6, 'x', 6, 7, 4]], - 'D#m13': [['x', 6, 'x', 6, 7, 8], - [11, 13, 11, 11, 13, 11], - [11, 'x', 11, 11, 13, 13], - ['x', 6, 8, 6, 7, 8], - ['x', 6, 4, 6, 6, 8]], - 'D#m9b5': [[11, 12, 11, 11, 14, 13]], - 'D#Maj9': [['x', 6, 5, 7, 6, 'x'], - ['x', 'x', 13, 12, 15, 13], - ['x', 6, 3, 3, 3, 3], - [11, 10, 12, 10, 11, 10], - [11, 'x', 12, 10, 11, 'x']], - 'D#mMaj7': [['x', 6, 8, 7, 7, 6], - [11, 'x', 12, 11, 11, 'x'], - [11, 13, 12, 11, 11, 11], - ['x', 'x', 1, 3, 3, 2], - ['x', 'x', 13, 11, 11, 10]], - 'D#mMaj9': [['x', 6, 4, 7, 6, 'x'], - [11, 13, 12, 11, 11, 13]], - 'D#mb6': [['x', 6, 4, 4, 4, 6], - [11, 'x', 9, 11, 11, 'x']], - 'D#dim': [['x', 6, 7, 8, 7, 'x'], - [11, 'x', 13, 11, 10, 'x'], - [11, 12, 13, 11, 'x', 'x']], - 'Eb': [['x', 6, 8, 8, 8, 6], - ['x', 6, 5, 3, 4, 3], - ['x', 'x', 1, 3, 4, 3], - [11, 13, 13, 12, 11, 11], - [11, 10, 8, 8, 8, 11]], - 'Eb11': [['x', 6, 6, 6, 6, 6], - ['x', 6, 'x', 6, 6, 4], - [11, 'x', 11, 10, 9, 9], - ['x', 6, 5, 6, 4, 4], - ['x', 6, 6, 6, 8, 6], - ['x', 'x', 1, 1, 2, 3]], - 'Eb13': [['x', 6, 5, 6, 6, 8], - [11, 'x', 11, 10, 8, 8], - [11, 'x', 11, 12, 13, 13], - [11, 13, 11, 12, 13, 11]], - 'Eb5': [['x', 6, 8, 8, 'x', 'x'], - [11, 13, 13, 'x', 'x', 'x'], - ['x', 'x', 'x', 8, 11, 11], - ['x', 'x', 1, 3, 4, 'x']], - 'Eb6': [['x', 'x', 1, 3, 1, 3], - ['x', 6, 8, 8, 8, 8], - ['x', 'x', 13, 15, 13, 15], - [11, 'x', 10, 12, 11, 'x']], - 'Eb7': [['x', 'x', 1, 3, 2, 3], - ['x', 6, 8, 6, 8, 6], - [11, 'x', 11, 12, 11, 'x'], - ['x', 6, 5, 6, 4, 'x'], - [11, 13, 11, 12, 11, 11]], - 'Eb7sus4': [['x', 6, 6, 6, 4, 4], - ['x', 6, 8, 6, 9, 6], - [11, 13, 11, 13, 11, 11], - ['x', 'x', 1, 3, 2, 4]], - 'Eb9': [['x', 6, 5, 6, 6, 'x'], - [11, 'x', 11, 10, 11, 11], - [11, 13, 11, 12, 11, 13], - ['x', 6, 5, 6, 6, 6], - [11, 'x', 11, 10, 8, 'x'], - ['x', 'x', 13, 12, 14, 13], - [11, 10, 11, 10, 11, 'x']], - 'Ebadd9': [['x', 6, 8, 8, 6, 6], - ['x', 'x', 13, 12, 11, 13], - ['x', 6, 8, 10, 8, 6], - [11, 'x', 'x', 12, 11, 13]], - 'Ebaug': [['x', 6, 5, 4, 4, 'x'], - [11, 10, 9, 8, 'x', 'x']], - 'Ebdim7': [['x', 6, 7, 5, 7, 'x'], - ['x', 'x', 1, 2, 1, 2], - [11, 'x', 10, 11, 10, 'x']], - 'Ebm': [['x', 6, 8, 8, 7, 6], - ['x', 'x', 1, 3, 4, 2], - [11, 13, 13, 11, 11, 11], - ['x', 'x', 13, 11, 11, 11]], - 'Ebm6': [['x', 'x', 1, 3, 1, 2], - ['x', 6, 4, 5, 4, 'x'], - ['x', 'x', 13, 15, 13, 14], - ['x', 6, 8, 5, 7, 'x'], - [11, 13, 13, 11, 13, 11], - ['x', 6, 4, 5, 4, 6], - [11, 'x', 10, 11, 11, 'x'], - ['x', 6, 'x', 5, 7, 6]], - 'Ebm7': [['x', 'x', 1, 3, 2, 2], - ['x', 6, 8, 6, 7, 6], - [11, 'x', 11, 11, 11, 'x'], - [11, 13, 11, 11, 14, 11], - ['x', 6, 4, 6, 7, 'x'], - [11, 13, 13, 11, 14, 11], - [11, 13, 11, 11, 11, 11], - ['x', 6, 4, 6, 4, 'x']], - 'Ebm7b5': [['x', 6, 7, 6, 7, 'x'], - ['x', 'x', 1, 2, 2, 2], - [11, 'x', 11, 11, 10, 'x'], - [11, 12, 13, 14, 14, 14], - ['x', 6, 'x', 6, 7, 5], - [11, 12, 11, 11, 14, 11]], - 'Ebm9': [['x', 6, 4, 6, 6, 'x'], - [11, 13, 11, 11, 11, 13], - ['x', 6, 4, 6, 6, 6], - ['x', 'x', 13, 11, 14, 13], - [11, 'x', 11, 11, 11, 13]], - 'EbMaj7': [['x', 'x', 1, 3, 3, 3], - ['x', 6, 8, 7, 8, 6], - ['x', 'x', 13, 15, 15, 15], - ['x', 6, 5, 3, 3, 'x'], - ['x', 'x', 13, 12, 11, 10], - [11, 'x', 12, 12, 11, 'x'], - [11, 13, 12, 12, 11, 11]], - 'Ebsus2': [['x', 'x', 1, 3, 4, 1], - ['x', 6, 8, 8, 6, 6], - ['x', 6, 8, 10, 'x', 'x'], - ['x', 'x', 13, 10, 11, 13]], - 'Ebsus4': [['x', 6, 8, 8, 9, 6], - ['x', 6, 6, 3, 4, 'x'], - ['x', 6, 8, 8, 9, 6], - [11, 13, 13, 13, 11, 11], - ['x', 'x', 1, 3, 4, 4], - ['x', 'x', 13, 13, 11, 11]], - 'Eb+': [['x', 6, 5, 4, 4, 'x'], - ['x', 'x', 13, 12, 12, 11], - [11, 10, 9, 8, 'x', 'x'], - [11, 14, 13, 12, 'x', 'x'], - ['x', 6, 'x', 8, 8, 7]], - 'Eb+7': [['x', 6, 9, 6, 8, 7], - [11, 'x', 11, 12, 12, 'x'], - ['x', 'x', 1, 4, 2, 3], - ['x', 6, 'x', 6, 8, 7]], - 'Eb+7b9': [['x', 6, 5, 6, 5, 7], - [11, 'x', 11, 12, 12, 12]], - 'Eb+7#9': [['x', 6, 5, 6, 7, 7], - [11, 'x', 11, 12, 12, 14]], - 'Eb+9': [['x', 6, 5, 6, 6, 7], - [11, 'x', 11, 12, 12, 13]], - 'Eb7b5#9': [['x', 6, 5, 6, 7, 5]], - 'Eb7b9': [['x', 6, 5, 6, 5, 'x'], - [11, 13, 11, 12, 11, 12], - ['x', 6, 5, 6, 5, 6], - ['x', 'x', 13, 12, 14, 12]], - 'Eb7#11': [[11, 12, 11, 12, 11, 11]], - 'Eb7#9': [['x', 6, 5, 6, 7, 'x'], - [11, 13, 11, 12, 11, 14], - ['x', 'x', 13, 12, 14, 14]], - 'Eb9sus4': [['x', 6, 6, 6, 6, 6], - [11, 'x', 11, 10, 9, 'x'], - [11, 'x', 11, 10, 9, 9]], - 'Eb9b5': [['x', 6, 5, 6, 6, 5], - [11, 10, 11, 10, 10, 'x']], - 'Eb13sus4': [['x', 6, 6, 6, 6, 8], - [11, 'x', 11, 13, 13, 13]], - 'Eb7sus2': [[11, 'x', 11, 10, 11, 11]], - 'Eb7b5': [['x', 6, 7, 6, 8, 'x'], - [11, 'x', 11, 12, 10, 'x'], - ['x', 'x', 1, 2, 2, 3], - ['x', 6, 7, 6, 8, 9]], - 'Ebmadd9': [['x', 'x', 13, 11, 11, 13]], - 'EbMaj13': [['x', 6, 'x', 7, 8, 8], - [11, 10, 10, 10, 11, 10], - [11, 'x', 12, 12, 13, 13]], - 'EbMaj7#11': [['x', 6, 7, 7, 8, 6], - [11, 'x', 12, 12, 10, 'x'], - ['x', 'x', 1, 2, 3, 3]], - 'Ebm11': [['x', 6, 4, 6, 4, 4], - ['x', 6, 6, 6, 7, 6], - [11, 'x', 11, 11, 9, 'x'], - ['x', 'x', 1, 1, 2, 2], - ['x', 6, 'x', 6, 7, 4]], - 'Ebm13': [['x', 6, 'x', 6, 7, 8], - [11, 13, 11, 11, 13, 11], - [11, 'x', 11, 11, 13, 13], - ['x', 6, 8, 6, 7, 8], - ['x', 6, 4, 6, 6, 8]], - 'Ebm9b5': [[11, 12, 11, 11, 14, 13]], - 'EbMaj9': [['x', 6, 5, 7, 6, 'x'], - ['x', 'x', 13, 12, 15, 13], - ['x', 6, 3, 3, 3, 3], - [11, 10, 12, 10, 11, 10], - [11, 'x', 12, 10, 11, 'x']], - 'EbmMaj7': [['x', 6, 8, 7, 7, 6], - [11, 'x', 12, 11, 11, 'x'], - [11, 13, 12, 11, 11, 11], - ['x', 'x', 1, 3, 3, 2], - ['x', 'x', 13, 11, 11, 10]], - 'EbmMaj9': [['x', 6, 4, 7, 6, 'x'], - [11, 13, 12, 11, 11, 13]], - 'Ebmb6': [['x', 6, 4, 4, 4, 6], - [11, 'x', 9, 11, 11, 'x']], - 'Ebdim': [['x', 6, 7, 8, 7, 'x'], - [11, 'x', 13, 11, 10, 'x'], - [11, 12, 13, 11, 'x', 'x']], - 'E': [[0, 2, 2, 1, 0, 0], - ['x', 7, 9, 9, 9, 7], - ['x', 7, 6, 4, 5, 4], - [0, 'x', 2, 4, 5, 4], - [12, 14, 14, 13, 12, 12], - [12, 11, 9, 9, 9, 12], - ['x', 'x', 2, 4, 5, 4]], - 'E11': [[0, 2, 0, 2, 0, 2], - [0, 7, 7, 7, 7, 7], - [12, 'x', 12, 11, 10, 10], - ['x', 7, 6, 7, 5, 5], - ['x', 7, 7, 7, 9, 7], - ['x', 'x', 2, 2, 3, 4]], - 'E13': [[0, 'x', 0, 1, 2, 2], - ['x', 7, 6, 7, 7, 9], - [12, 'x', 12, 11, 9, 9], - [12, 'x', 12, 13, 14, 14], - [12, 14, 12, 13, 14, 12]], - 'E5': [[0, 2, 2, 'x', 'x', 'x'], - ['x', 7, 9, 9, 'x', 'x'], - [12, 14, 14, 'x', 'x', 'x'], - ['x', 'x', 'x', 9, 12, 12], - ['x', 'x', 2, 4, 5, 'x']], - 'E6': [[0, 2, 2, 1, 2, 0], - ['x', 7, 9, 9, 9, 9], - ['x', 'x', 2, 4, 2, 4], - ['x', 'x', 2, 1, 2, 0], - [12, 'x', 11, 13, 12, 'x']], - 'E7': [[0, 2, 0, 1, 0, 0], - [0, 2, 2, 1, 3, 0], - ['x', 7, 9, 7, 9, 7], - [0, 2, 0, 1, 3, 0], - ['x', 'x', 2, 4, 3, 4], - ['x', 7, 6, 7, 5, 'x'], - [12, 14, 12, 13, 12, 12], - [12, 'x', 12, 13, 12, 'x']], - 'E7sus4': [[0, 2, 0, 2, 0, 0], - ['x', 7, 9, 7, 10, 7], - ['x', 7, 7, 7, 5, 5], - [12, 14, 12, 14, 12, 12], - ['x', 'x', 2, 4, 3, 5]], - 'E9': [[0, 2, 0, 1, 0, 2], - [0, 7, 6, 7, 7, 0], - [12, 'x', 12, 11, 12, 12], - [12, 14, 12, 13, 12, 14], - ['x', 7, 6, 7, 7, 7], - [12, 'x', 12, 11, 9, 'x'], - ['x', 'x', 2, 1, 3, 2], - [12, 11, 12, 11, 12, 'x']], - 'Eadd9': [[0, 2, 4, 1, 0, 0], - [0, 2, 2, 1, 0, 2], - ['x', 7, 9, 9, 7, 7], - ['x', 'x', 14, 13, 12, 14], - ['x', 7, 9, 11, 9, 7], - [12, 'x', 'x', 13, 12, 14]], - 'Eaug': [[0, 3, 2, 1, 1, 0], - [0, 7, 6, 5, 5, 0], - [12, 11, 10, 9, 'x', 'x'], - ['x', 'x', 2, 1, 1, 0]], - 'Edim7': [[0, 1, 2, 0, 2, 0], - [0, 7, 8, 6, 8, 0], - ['x', 'x', 2, 3, 2, 3], - ['x', 7, 8, 6, 8, 'x'], - [12, 'x', 11, 12, 11, 'x']], - 'Em': [[0, 2, 2, 0, 0, 0], - ['x', 7, 9, 9, 8, 7], - [0, 10, 9, 0, 8, 0], - [0, 'x', 2, 4, 5, 3], - [12, 14, 14, 12, 12, 12], - ['x', 'x', 14, 12, 12, 12], - ['x', 'x', 2, 4, 5, 3]], - 'Em6': [[0, 2, 2, 0, 2, 0], - ['x', 'x', 2, 4, 2, 3], - ['x', 7, 5, 6, 5, 'x'], - ['x', 7, 9, 6, 8, 'x'], - [12, 14, 14, 12, 14, 12], - ['x', 7, 5, 6, 5, 7], - [12, 'x', 11, 12, 12, 'x'], - ['x', 7, 'x', 6, 8, 7]], - 'Em7': [[0, 2, 2, 0, 3, 0], - ['x', 7, 9, 7, 8, 7], - [0, 2, 2, 0, 3, 3], - [12, 'x', 12, 12, 12, 'x'], - ['x', 7, 5, 7, 8, 'x'], - [12, 14, 14, 12, 15, 12], - [12, 14, 12, 12, 12, 12], - ['x', 7, 5, 7, 5, 'x'], - ['x', 'x', 2, 4, 3, 3]], - 'Em7b5': [['x', 7, 8, 7, 8, 'x'], - ['x', 'x', 2, 3, 3, 3], - [0, 1, 2, 3, 3, 3], - [12, 'x', 12, 12, 11, 'x'], - [12, 13, 14, 15, 15, 15], - ['x', 7, 'x', 7, 8, 6], - [12, 13, 12, 12, 15, 12]], - 'Em9': [['x', 7, 5, 7, 7, 'x'], - [0, 2, 2, 0, 3, 2], - [12, 14, 12, 12, 12, 14], - ['x', 7, 5, 7, 7, 7], - ['x', 'x', 14, 12, 15, 14], - [12, 'x', 12, 12, 12, 14]], - 'EMaj7': [[0, 2, 1, 1, 0, 'x'], - ['x', 'x', 2, 4, 4, 4], - ['x', 7, 9, 8, 9, 7], - ['x', 7, 6, 4, 4, 'x'], - ['x', 'x', 14, 13, 12, 11], - [12, 'x', 13, 13, 12, 'x'], - [12, 14, 13, 13, 12, 12]], - 'Esus2': [[0, 2, 2, 4, 5, 2], - [0, 7, 4, 4, 7, 0], - [0, 7, 9, 9, 7, 7], - ['x', 7, 9, 9, 7, 7], - ['x', 7, 9, 11, 'x', 'x'], - ['x', 'x', 14, 11, 12, 14], - ['x', 'x', 2, 4, 5, 2]], - 'Esus4': [[0, 2, 2, 2, 0, 0], - ['x', 7, 9, 9, 10, 7], - [0, 0, 2, 2, 0, 0], - [0, 0, 2, 4, 0, 0], - ['x', 'x', 2, 4, 5, 5], - [12, 14, 14, 14, 12, 12], - ['x', 'x', 14, 14, 12, 12]], - 'E+': [['x', 7, 6, 5, 5, 'x'], - ['x', 'x', 14, 13, 13, 12], - [12, 11, 10, 9, 'x', 'x'], - [12, 15, 14, 13, 'x', 'x'], - ['x', 7, 'x', 9, 9, 8]], - 'E+7': [['x', 7, 10, 7, 9, 8], - [12, 'x', 12, 13, 13, 'x'], - ['x', 'x', 2, 5, 3, 4], - ['x', 7, 'x', 7, 9, 8]], - 'E+7b9': [['x', 7, 6, 7, 6, 8], - [12, 'x', 12, 13, 13, 13]], - 'E+7#9': [['x', 7, 6, 7, 8, 8], - [12, 'x', 12, 13, 13, 15]], - 'E+9': [['x', 7, 6, 7, 7, 8], - [12, 'x', 12, 13, 13, 14]], - 'E7b5#9': [['x', 7, 6, 7, 8, 6]], - 'E7b9': [['x', 7, 6, 7, 6, 'x'], - [12, 14, 12, 13, 12, 13], - ['x', 7, 6, 7, 6, 7], - ['x', 'x', 2, 1, 3, 1]], - 'E7#11': [[12, 13, 12, 13, 12, 12]], - 'E7#9': [['x', 7, 6, 7, 8, 'x'], - [12, 14, 12, 13, 12, 15], - ['x', 'x', 2, 1, 3, 3]], - 'E9sus4': [['x', 7, 7, 7, 7, 7], - [12, 'x', 12, 11, 10, 'x'], - [12, 'x', 12, 11, 10, 10]], - 'E9b5': [['x', 7, 6, 7, 7, 6], - [12, 11, 12, 11, 11, 'x']], - 'E13sus4': [['x', 7, 7, 7, 7, 9], - [12, 'x', 12, 14, 14, 14]], - 'E7sus2': [[12, 'x', 12, 11, 12, 12]], - 'E7b5': [['x', 7, 8, 7, 9, 'x'], - [12, 'x', 12, 13, 11, 'x'], - ['x', 'x', 2, 3, 3, 4], - ['x', 7, 8, 7, 9, 10]], - 'Emadd9': [['x', 'x', 14, 12, 12, 14]], - 'EMaj13': [['x', 7, 'x', 8, 9, 9], - [12, 11, 11, 11, 12, 11], - [12, 'x', 13, 13, 14, 14]], - 'EMaj7#11': [['x', 7, 8, 8, 9, 7], - [12, 'x', 13, 13, 11, 'x'], - ['x', 'x', 2, 3, 4, 4]], - 'Em11': [['x', 7, 5, 7, 5, 5], - ['x', 7, 7, 7, 8, 7], - [12, 'x', 12, 12, 10, 'x'], - ['x', 'x', 2, 2, 3, 3], - ['x', 7, 'x', 7, 8, 5]], - 'Em13': [['x', 7, 'x', 7, 8, 9], - [12, 14, 12, 12, 14, 12], - [12, 'x', 12, 12, 14, 14], - ['x', 7, 9, 7, 8, 9], - ['x', 7, 5, 7, 7, 9]], - 'Em9b5': [[12, 13, 12, 12, 15, 14]], - 'EMaj9': [['x', 7, 6, 8, 7, 'x'], - ['x', 'x', 2, 1, 4, 2], - ['x', 7, 4, 4, 4, 4], - [12, 11, 13, 11, 12, 11], - [12, 'x', 13, 11, 12, 'x']], - 'EmMaj7': [['x', 7, 9, 8, 8, 7], - [12, 'x', 13, 12, 12, 'x'], - [12, 14, 13, 12, 12, 12], - ['x', 'x', 2, 4, 4, 3], - ['x', 'x', 14, 12, 12, 11]], - 'EmMaj9': [['x', 7, 5, 8, 7, 'x'], - [12, 14, 13, 12, 12, 14]], - 'Emb6': [['x', 7, 5, 5, 5, 7], - [12, 'x', 10, 12, 12, 'x']], - 'Edim': [['x', 7, 8, 9, 8, 'x'], - [12, 'x', 14, 12, 11, 'x'], - [12, 13, 14, 12, 'x', 'x']], - 'E#': [['x', 8, 10, 10, 10, 8], - [1, 3, 3, 2, 1, 1], - [13, 12, 10, 10, 10, 13], - ['x', 'x', 3, 5, 6, 5]], - 'E#+': [['x', 8, 7, 6, 6, 'x'], - ['x', 'x', 3, 2, 2, 1], - [13, 12, 11, 10, 'x', 'x'], - [1, 4, 3, 2, 'x', 'x'], - ['x', 8, 'x', 10, 10, 9]], - 'E#+7': [['x', 8, 11, 8, 10, 9], - [1, 'x', 1, 2, 2, 'x'], - ['x', 'x', 3, 6, 4, 5], - ['x', 8, 'x', 8, 10, 9]], - 'E#+7b9': [['x', 8, 7, 8, 7, 9], - [1, 'x', 1, 2, 2, 2]], - 'E#+7#9': [['x', 8, 7, 8, 9, 9], - [1, 'x', 1, 2, 2, 4]], - 'E#+9': [['x', 8, 7, 8, 8, 9], - [1, 'x', 1, 2, 2, 3]], - 'E#11': [['x', 8, 7, 8, 6, 6], - ['x', 8, 8, 8, 10, 8], - ['x', 'x', 3, 3, 4, 5]], - 'E#7b5#9': [['x', 8, 7, 8, 9, 7]], - 'E#7b9': [['x', 8, 7, 8, 7, 'x'], - [1, 3, 1, 2, 1, 2], - ['x', 8, 7, 8, 7, 8], - ['x', 'x', 3, 2, 4, 2]], - 'E#7#11': [[1, 2, 1, 2, 1, 1]], - 'E#7#9': [['x', 8, 7, 8, 9, 'x'], - [1, 3, 1, 2, 1, 4], - ['x', 'x', 3, 2, 4, 4]], - 'E#9': [[1, 3, 1, 2, 1, 3], - ['x', 8, 7, 8, 8, 8], - [13, 'x', 13, 12, 10, 'x'], - ['x', 'x', 3, 2, 4, 3], - [13, 12, 13, 12, 13, 'x']], - 'E#9sus4': [['x', 8, 8, 8, 8, 8], - [13, 'x', 13, 12, 11, 'x'], - [13, 'x', 13, 12, 11, 11]], - 'E#9b5': [['x', 8, 7, 8, 8, 7], - [13, 12, 13, 12, 12, 'x']], - 'E#add9': [['x', 'x', 3, 2, 1, 3], - ['x', 8, 10, 12, 10, 8], - [1, 'x', 'x', 2, 1, 3]], - 'E#13': [['x', 8, 7, 8, 8, 10], - [13, 'x', 13, 12, 10, 10], - [1, 'x', 1, 2, 3, 3], - [1, 3, 1, 2, 3, 1]], - 'E#13sus4': [['x', 8, 8, 8, 8, 10], - [1, 'x', 1, 3, 3, 3]], - 'E#5': [[1, 3, 3, 'x', 'x', 'x'], - ['x', 8, 10, 10, 'x', 'x'], - ['x', 'x', 'x', 10, 13, 13], - ['x', 'x', 3, 5, 6, 'x']], - 'E#6': [['x', 8, 10, 10, 10, 10], - ['x', 'x', 3, 5, 3, 5], - [13, 'x', 12, 14, 13, 'x']], - 'E#7': [['x', 8, 10, 8, 10, 8], - [1, 3, 1, 2, 1, 1], - ['x', 'x', 3, 5, 4, 5], - ['x', 8, 7, 8, 6, 'x'], - [1, 'x', 1, 2, 1, 'x']], - 'E#7sus4': [['x', 8, 8, 8, 6, 6], - ['x', 8, 10, 8, 11, 8], - [1, 3, 1, 3, 1, 1], - ['x', 'x', 3, 5, 4, 6]], - 'E#7sus2': [[13, 'x', 13, 12, 13, 13]], - 'E#7b5': [['x', 8, 9, 8, 10, 'x'], - [13, 'x', 13, 14, 12, 'x'], - ['x', 'x', 3, 4, 4, 5], - ['x', 8, 9, 8, 10, 11]], - 'E#m9': [[1, 3, 1, 1, 1, 3], - ['x', 8, 6, 8, 8, 'x'], - ['x', 8, 6, 8, 8, 8], - ['x', 'x', 3, 1, 4, 3], - [1, 'x', 1, 1, 1, 3]], - 'E#m7b5': [[13, 'x', 13, 13, 12, 'x'], - ['x', 8, 9, 8, 9, 'x'], - ['x', 'x', 3, 4, 4, 4], - [1, 2, 3, 4, 4, 4], - ['x', 8, 'x', 8, 9, 7], - [1, 2, 1, 1, 4, 1]], - 'E#madd9': [['x', 'x', 3, 1, 1, 3]], - 'E#Maj13': [['x', 8, 'x', 9, 10, 10], - [13, 12, 12, 12, 13, 12], - [1, 'x', 2, 2, 3, 3]], - 'E#Maj7': [['x', 'x', 15, 14, 13, 12], - ['x', 8, 10, 9, 10, 8], - [1, 'x', 2, 2, 1, 'x'], - ['x', 'x', 3, 5, 5, 5], - [1, 3, 2, 2, 1, 1]], - 'E#Maj7#11': [['x', 8, 9, 9, 10, 8], - [13, 'x', 14, 14, 12, 'x'], - ['x', 'x', 3, 4, 5, 5]], - 'E#dim7': [['x', 8, 9, 7, 9, 'x'], - [13, 'x', 12, 13, 12, 'x'], - ['x', 'x', 3, 4, 3, 4]], - 'E#m': [['x', 8, 10, 10, 9, 8], - [1, 3, 3, 1, 1, 1], - ['x', 'x', 3, 1, 1, 1], - ['x', 'x', 3, 5, 6, 4]], - 'E#m11': [['x', 8, 6, 8, 6, 6], - ['x', 8, 8, 8, 9, 8], - [13, 'x', 13, 13, 11, 'x'], - ['x', 'x', 3, 3, 4, 4], - ['x', 8, 'x', 8, 9, 6]], - 'E#m13': [['x', 8, 'x', 8, 9, 10], - [1, 3, 1, 1, 3, 1], - [1, 'x', 1, 1, 3, 3], - ['x', 8, 10, 8, 9, 10], - ['x', 8, 6, 8, 8, 10]], - 'E#m6': [['x', 8, 6, 7, 6, 'x'], - [1, 3, 3, 1, 3, 1], - ['x', 'x', 3, 5, 3, 4], - ['x', 8, 10, 7, 9, 'x'], - ['x', 8, 6, 7, 6, 8], - [13, 'x', 12, 13, 13, 'x'], - ['x', 8, 'x', 7, 9, 8]], - 'E#m7': [['x', 8, 10, 8, 9, 8], - [1, 3, 3, 1, 4, 1], - [1, 'x', 1, 1, 1, 'x'], - ['x', 8, 6, 8, 9, 'x'], - [1, 3, 1, 1, 1, 1], - ['x', 8, 6, 8, 6, 'x'], - ['x', 'x', 3, 5, 4, 4]], - 'E#m9b5': [[1, 2, 1, 1, 4, 3]], - 'E#Maj9': [['x', 8, 7, 9, 8, 'x'], - ['x', 'x', 3, 2, 5, 3], - ['x', 8, 5, 5, 5, 5], - [13, 12, 14, 12, 13, 12], - [13, 'x', 14, 12, 13, 'x']], - 'E#mMaj7': [['x', 8, 10, 9, 9, 8], - [1, 'x', 2, 1, 1, 'x'], - [1, 3, 2, 1, 1, 1], - ['x', 'x', 3, 5, 5, 4], - ['x', 'x', 15, 13, 13, 12]], - 'E#mMaj9': [['x', 8, 6, 9, 8, 'x'], - [1, 3, 2, 1, 1, 3]], - 'E#mb6': [['x', 8, 6, 6, 6, 8], - [13, 'x', 11, 13, 13, 'x']], - 'E#sus2': [['x', 8, 10, 10, 8, 8], - ['x', 8, 10, 12, 'x', 'x'], - ['x', 'x', 15, 12, 13, 15], - ['x', 'x', 3, 5, 6, 3]], - 'E#sus4': [['x', 8, 10, 10, 11, 8], - [1, 3, 3, 3, 1, 1], - ['x', 'x', 3, 5, 6, 6], - ['x', 'x', 3, 3, 1, 1]], - 'E#dim': [['x', 8, 9, 10, 9, 'x'], - [13, 'x', 15, 13, 12, 'x'], - [1, 2, 3, 1, 'x', 'x']], - 'Fb': [['x', 7, 9, 9, 9, 7], - [12, 14, 14, 13, 12, 12], - [12, 11, 9, 9, 9, 12], - ['x', 'x', 2, 4, 5, 4]], - 'Fb+': [['x', 7, 6, 5, 5, 'x'], - ['x', 'x', 14, 13, 13, 12], - [12, 11, 10, 9, 'x', 'x'], - [12, 15, 14, 13, 'x', 'x'], - ['x', 7, 'x', 9, 9, 8]], - 'Fb+7': [['x', 7, 10, 7, 9, 8], - [12, 'x', 12, 13, 13, 'x'], - ['x', 'x', 2, 5, 3, 4], - ['x', 7, 'x', 7, 9, 8]], - 'Fb+7b9': [['x', 7, 6, 7, 6, 8], - [12, 'x', 12, 13, 13, 13]], - 'Fb+7#9': [['x', 7, 6, 7, 8, 8], - [12, 'x', 12, 13, 13, 15]], - 'Fb+9': [['x', 7, 6, 7, 7, 8], - [12, 'x', 12, 13, 13, 14]], - 'Fb11': [['x', 7, 6, 7, 5, 5], - ['x', 7, 7, 7, 9, 7], - ['x', 'x', 2, 2, 3, 4]], - 'Fb7b5#9': [['x', 7, 6, 7, 8, 6]], - 'Fb7b9': [['x', 7, 6, 7, 6, 'x'], - [12, 14, 12, 13, 12, 13], - ['x', 7, 6, 7, 6, 7], - ['x', 'x', 2, 1, 3, 1]], - 'Fb7#11': [[12, 13, 12, 13, 12, 12]], - 'Fb7#9': [['x', 7, 6, 7, 8, 'x'], - [12, 14, 12, 13, 12, 15], - ['x', 'x', 2, 1, 3, 3]], - 'Fb9': [[12, 14, 12, 13, 12, 14], - ['x', 7, 6, 7, 7, 7], - [12, 'x', 12, 11, 9, 'x'], - ['x', 'x', 2, 1, 3, 2], - [12, 11, 12, 11, 12, 'x']], - 'Fb9sus4': [['x', 7, 7, 7, 7, 7], - [12, 'x', 12, 11, 10, 'x'], - [12, 'x', 12, 11, 10, 10]], - 'Fb9b5': [['x', 7, 6, 7, 7, 6], - [12, 11, 12, 11, 11, 'x']], - 'Fbadd9': [['x', 'x', 14, 13, 12, 14], - ['x', 7, 9, 11, 9, 7], - [12, 'x', 'x', 13, 12, 14]], - 'Fb13': [['x', 7, 6, 7, 7, 9], - [12, 'x', 12, 11, 9, 9], - [12, 'x', 12, 13, 14, 14], - [12, 14, 12, 13, 14, 12]], - 'Fb13sus4': [['x', 7, 7, 7, 7, 9], - [12, 'x', 12, 14, 14, 14]], - 'Fb5': [[12, 14, 14, 'x', 'x', 'x'], - ['x', 7, 9, 9, 'x', 'x'], - ['x', 'x', 'x', 9, 12, 12], - ['x', 'x', 2, 4, 5, 'x']], - 'Fb6': [['x', 7, 9, 9, 9, 9], - ['x', 'x', 2, 4, 2, 4], - [12, 'x', 11, 13, 12, 'x']], - 'Fb7': [['x', 7, 9, 7, 9, 7], - [12, 14, 12, 13, 12, 12], - ['x', 'x', 2, 4, 3, 4], - ['x', 7, 6, 7, 5, 'x'], - [12, 'x', 12, 13, 12, 'x']], - 'Fb7sus4': [['x', 7, 7, 7, 5, 5], - ['x', 7, 9, 7, 10, 7], - [12, 14, 12, 14, 12, 12], - ['x', 'x', 2, 4, 3, 5]], - 'Fb7sus2': [[12, 'x', 12, 11, 12, 12]], - 'Fb7b5': [['x', 7, 8, 7, 9, 'x'], - [12, 'x', 12, 13, 11, 'x'], - ['x', 'x', 2, 3, 3, 4], - ['x', 7, 8, 7, 9, 10]], - 'Fbm9': [[12, 14, 12, 12, 12, 14], - ['x', 7, 5, 7, 7, 'x'], - ['x', 7, 5, 7, 7, 7], - ['x', 'x', 14, 12, 15, 14], - [12, 'x', 12, 12, 12, 14]], - 'Fbm7b5': [[12, 'x', 12, 12, 11, 'x'], - ['x', 7, 8, 7, 8, 'x'], - ['x', 'x', 2, 3, 3, 3], - [12, 13, 14, 15, 15, 15], - ['x', 7, 'x', 7, 8, 6], - [12, 13, 12, 12, 15, 12]], - 'Fbmadd9': [['x', 'x', 14, 12, 12, 14]], - 'FbMaj13': [['x', 7, 'x', 8, 9, 9], - [12, 11, 11, 11, 12, 11], - [12, 'x', 13, 13, 14, 14]], - 'FbMaj7': [['x', 'x', 14, 13, 12, 11], - ['x', 7, 9, 8, 9, 7], - [12, 'x', 13, 13, 12, 'x'], - ['x', 'x', 2, 4, 4, 4], - [12, 14, 13, 13, 12, 12]], - 'FbMaj7#11': [['x', 7, 8, 8, 9, 7], - [12, 'x', 13, 13, 11, 'x'], - ['x', 'x', 2, 3, 4, 4]], - 'Fbdim7': [['x', 7, 8, 6, 8, 'x'], - [12, 'x', 11, 12, 11, 'x'], - ['x', 'x', 2, 3, 2, 3]], - 'Fbm': [['x', 7, 9, 9, 8, 7], - [12, 14, 14, 12, 12, 12], - ['x', 'x', 14, 12, 12, 12], - ['x', 'x', 2, 4, 5, 3]], - 'Fbm11': [['x', 7, 5, 7, 5, 5], - ['x', 7, 7, 7, 8, 7], - [12, 'x', 12, 12, 10, 'x'], - ['x', 'x', 2, 2, 3, 3], - ['x', 7, 'x', 7, 8, 5]], - 'Fbm13': [['x', 7, 'x', 7, 8, 9], - [12, 14, 12, 12, 14, 12], - [12, 'x', 12, 12, 14, 14], - ['x', 7, 9, 7, 8, 9], - ['x', 7, 5, 7, 7, 9]], - 'Fbm6': [['x', 7, 5, 6, 5, 'x'], - [12, 14, 14, 12, 14, 12], - ['x', 'x', 2, 4, 2, 3], - ['x', 7, 9, 6, 8, 'x'], - ['x', 7, 5, 6, 5, 7], - [12, 'x', 11, 12, 12, 'x'], - ['x', 7, 'x', 6, 8, 7]], - 'Fbm7': [['x', 7, 9, 7, 8, 7], - [12, 14, 14, 12, 15, 12], - [12, 'x', 12, 12, 12, 'x'], - ['x', 7, 5, 7, 8, 'x'], - [12, 14, 12, 12, 12, 12], - ['x', 7, 5, 7, 5, 'x'], - ['x', 'x', 2, 4, 3, 3]], - 'Fbm9b5': [[12, 13, 12, 12, 15, 14]], - 'FbMaj9': [['x', 7, 6, 8, 7, 'x'], - ['x', 'x', 2, 1, 4, 2], - ['x', 7, 4, 4, 4, 4], - [12, 11, 13, 11, 12, 11], - [12, 'x', 13, 11, 12, 'x']], - 'FbmMaj7': [['x', 7, 9, 8, 8, 7], - [12, 'x', 13, 12, 12, 'x'], - [12, 14, 13, 12, 12, 12], - ['x', 'x', 2, 4, 4, 3], - ['x', 'x', 14, 12, 12, 11]], - 'FbmMaj9': [['x', 7, 5, 8, 7, 'x'], - [12, 14, 13, 12, 12, 14]], - 'Fbmb6': [['x', 7, 5, 5, 5, 7], - [12, 'x', 10, 12, 12, 'x']], - 'Fbsus2': [['x', 7, 9, 9, 7, 7], - ['x', 7, 9, 11, 'x', 'x'], - ['x', 'x', 14, 11, 12, 14], - ['x', 'x', 2, 4, 5, 2]], - 'Fbsus4': [['x', 7, 9, 9, 10, 7], - [12, 14, 14, 14, 12, 12], - ['x', 'x', 2, 4, 5, 5], - ['x', 'x', 14, 14, 12, 12]], - 'Fbdim': [['x', 7, 8, 9, 8, 'x'], - [12, 'x', 14, 12, 11, 'x'], - [12, 13, 14, 12, 'x', 'x']], - 'F': [[1, 3, 3, 2, 1, 1], - ['x', 8, 10, 10, 10, 8], - ['x', 8, 7, 5, 6, 5], - ['x', 'x', 3, 2, 1, 1], - [13, 12, 10, 10, 10, 13], - ['x', 'x', 3, 5, 6, 5]], - 'F11': [[1, 3, 1, 3, 1, 3], - ['x', 8, 8, 8, 8, 8], - ['x', 8, 7, 8, 6, 6], - ['x', 8, 8, 8, 10, 8], - ['x', 'x', 3, 3, 4, 5]], - 'F13': [[1, 0, 1, 2, 3, 3], - ['x', 8, 7, 8, 8, 10], - [13, 'x', 13, 12, 10, 10], - [1, 'x', 1, 2, 3, 3], - [1, 3, 1, 2, 3, 1]], - 'F5': [[1, 3, 3, 'x', 'x', 'x'], - ['x', 8, 10, 10, 'x', 'x'], - ['x', 'x', 'x', 10, 13, 13], - ['x', 'x', 3, 5, 6, 'x']], - 'F6': [['x', 'x', 3, 2, 3, 1], - ['x', 8, 10, 10, 10, 10], - ['x', 'x', 3, 5, 3, 5], - [13, 'x', 12, 14, 13, 'x']], - 'F7': [[1, 3, 1, 2, 1, 1], - ['x', 8, 10, 8, 10, 8], - [1, 'x', 1, 2, 1, 'x'], - ['x', 'x', 3, 5, 4, 5], - ['x', 8, 7, 8, 6, 'x']], - 'F7sus4': [[1, 3, 1, 3, 1, 1], - ['x', 8, 10, 8, 11, 8], - [13, 15, 13, 15, 13, 13], - ['x', 8, 8, 8, 6, 6], - ['x', 'x', 3, 5, 4, 6]], - 'F9': [[1, 3, 1, 2, 1, 3], - [1, 'x', 1, 0, 1, 1], - ['x', 8, 7, 8, 8, 'x'], - ['x', 8, 7, 8, 8, 8], - [13, 'x', 13, 12, 10, 'x'], - ['x', 'x', 3, 2, 4, 3], - [13, 12, 13, 12, 13, 'x']], - 'Fadd9': [['x', 'x', 3, 2, 1, 3], - ['x', 8, 10, 10, 8, 8], - ['x', 8, 10, 12, 10, 8], - [1, 'x', 'x', 2, 1, 3]], - 'Faug': [['x', 'x', 3, 2, 2, 1], - ['x', 8, 7, 6, 6, 'x']], - 'Fdim7': [[1, 2, 0, 1, 'x', 'x'], - ['x', 8, 9, 7, 9, 'x'], - ['x', 'x', 3, 4, 3, 4], - [1, 'x', 0, 1, 0, 'x'], - [1, 2, 3, 1, 3, 1], - [13, 'x', 12, 13, 12, 'x']], - 'Fm': [[1, 3, 3, 1, 1, 1], - ['x', 8, 10, 10, 9, 8], - ['x', 'x', 3, 5, 6, 4], - ['x', 'x', 3, 1, 1, 1]], - 'Fm6': [[1, 3, 3, 1, 3, 1], - ['x', 'x', 3, 5, 3, 4], - ['x', 8, 6, 7, 6, 'x'], - [1, 'x', 0, 1, 1, 'x'], - ['x', 8, 10, 7, 9, 'x'], - ['x', 8, 6, 7, 6, 8], - [13, 'x', 12, 13, 13, 'x'], - ['x', 8, 'x', 7, 9, 8]], - 'Fm7': [[1, 3, 1, 1, 1, 1], - ['x', 8, 10, 8, 9, 8], - [1, 'x', 1, 1, 1, 'x'], - ['x', 8, 6, 8, 9, 'x'], - [1, 3, 3, 1, 4, 1], - ['x', 8, 6, 8, 6, 'x'], - ['x', 'x', 3, 5, 4, 4]], - 'Fm7b5': [['x', 8, 9, 8, 9, 'x'], - ['x', 'x', 3, 4, 4, 4], - [1, 'x', 1, 1, 0, 'x'], - [1, 2, 3, 4, 4, 4], - [13, 'x', 13, 13, 12, 'x'], - ['x', 8, 'x', 8, 9, 7], - [1, 2, 1, 1, 4, 1]], - 'Fm9': [[1, 3, 1, 1, 1, 3], - ['x', 8, 6, 8, 8, 'x'], - ['x', 8, 6, 8, 8, 8], - ['x', 'x', 3, 1, 4, 3], - [1, 'x', 1, 1, 1, 3]], - 'FMaj7': [['x', 'x', 3, 2, 1, 0], - ['x', 8, 10, 9, 10, 8], - ['x', 'x', 3, 5, 5, 5], - [1, 'x', 2, 2, 1, 0], - ['x', 8, 7, 5, 5, 'x'], - ['x', 'x', 15, 14, 13, 12], - [1, 'x', 2, 2, 1, 'x'], - [1, 3, 2, 2, 1, 1]], - 'Fsus2': [['x', 8, 10, 10, 8, 8], - ['x', 'x', 3, 5, 6, 3], - ['x', 8, 10, 12, 'x', 'x'], - ['x', 'x', 15, 12, 13, 15]], - 'Fsus4': [[1, 3, 3, 3, 1, 1], - ['x', 8, 10, 10, 11, 8], - ['x', 8, 8, 5, 6, 'x'], - ['x', 'x', 3, 5, 6, 6], - ['x', 'x', 3, 3, 1, 1]], - 'F+': [['x', 8, 7, 6, 6, 'x'], - ['x', 'x', 3, 2, 2, 1], - [13, 12, 11, 10, 'x', 'x'], - [1, 4, 3, 2, 'x', 'x'], - ['x', 8, 'x', 10, 10, 9]], - 'F+7': [['x', 8, 11, 8, 10, 9], - [1, 'x', 1, 2, 2, 'x'], - ['x', 'x', 3, 6, 4, 5], - ['x', 8, 'x', 8, 10, 9]], - 'F+7b9': [['x', 8, 7, 8, 7, 9], - [1, 'x', 1, 2, 2, 2]], - 'F+7#9': [['x', 8, 7, 8, 9, 9], - [1, 'x', 1, 2, 2, 4]], - 'F+9': [['x', 8, 7, 8, 8, 9], - [1, 'x', 1, 2, 2, 3]], - 'F7b5#9': [['x', 8, 7, 8, 9, 7]], - 'F7b9': [['x', 8, 7, 8, 7, 'x'], - [1, 3, 1, 2, 1, 2], - ['x', 8, 7, 8, 7, 8], - ['x', 'x', 3, 2, 4, 2]], - 'F7#11': [[1, 2, 1, 2, 1, 1]], - 'F7#9': [['x', 8, 7, 8, 9, 'x'], - [1, 3, 1, 2, 1, 4], - ['x', 'x', 3, 2, 4, 4]], - 'F9sus4': [['x', 8, 8, 8, 8, 8], - [13, 'x', 13, 12, 11, 'x'], - [13, 'x', 13, 12, 11, 11]], - 'F9b5': [['x', 8, 7, 8, 8, 7], - [13, 12, 13, 12, 12, 'x']], - 'F13sus4': [['x', 8, 8, 8, 8, 10], - [1, 'x', 1, 3, 3, 3]], - 'F7sus2': [[13, 'x', 13, 12, 13, 13]], - 'F7b5': [['x', 8, 9, 8, 10, 'x'], - [13, 'x', 13, 14, 12, 'x'], - ['x', 'x', 3, 4, 4, 5], - ['x', 8, 9, 8, 10, 11]], - 'Fmadd9': [['x', 'x', 3, 1, 1, 3]], - 'FMaj13': [['x', 8, 'x', 9, 10, 10], - [13, 12, 12, 12, 13, 12], - [1, 'x', 2, 2, 3, 3]], - 'FMaj7#11': [['x', 8, 9, 9, 10, 8], - [13, 'x', 14, 14, 12, 'x'], - ['x', 'x', 3, 4, 5, 5]], - 'Fm11': [['x', 8, 6, 8, 6, 6], - ['x', 8, 8, 8, 9, 8], - [13, 'x', 13, 13, 11, 'x'], - ['x', 'x', 3, 3, 4, 4], - ['x', 8, 'x', 8, 9, 6]], - 'Fm13': [['x', 8, 'x', 8, 9, 10], - [1, 3, 1, 1, 3, 1], - [1, 'x', 1, 1, 3, 3], - ['x', 8, 10, 8, 9, 10], - ['x', 8, 6, 8, 8, 10]], - 'Fm9b5': [[1, 2, 1, 1, 4, 3]], - 'FMaj9': [['x', 8, 7, 9, 8, 'x'], - ['x', 'x', 3, 2, 5, 3], - ['x', 8, 5, 5, 5, 5], - [13, 12, 14, 12, 13, 12], - [13, 'x', 14, 12, 13, 'x']], - 'FmMaj7': [['x', 8, 10, 9, 9, 8], - [1, 'x', 2, 1, 1, 'x'], - [1, 3, 2, 1, 1, 1], - ['x', 'x', 3, 5, 5, 4], - ['x', 'x', 15, 13, 13, 12]], - 'FmMaj9': [['x', 8, 6, 9, 8, 'x'], - [1, 3, 2, 1, 1, 3]], - 'Fmb6': [['x', 8, 6, 6, 6, 8], - [13, 'x', 11, 13, 13, 'x']], - 'Fdim': [['x', 8, 9, 10, 9, 'x'], - [13, 'x', 15, 13, 12, 'x'], - [1, 2, 3, 1, 'x', 'x']], - 'F#': [[2, 4, 4, 3, 2, 2], - ['x', 9, 11, 11, 11, 9], - ['x', 9, 8, 6, 7, 6], - ['x', 'x', 4, 3, 2, 2], - [14, 13, 11, 11, 11, 14], - ['x', 'x', 4, 6, 7, 6]], - 'F#11': [[2, 4, 2, 4, 2, 4], - ['x', 9, 9, 9, 9, 9], - [2, 'x', 2, 1, 0, 0], - ['x', 9, 8, 9, 7, 7], - ['x', 9, 9, 9, 11, 9], - ['x', 'x', 4, 4, 5, 6]], - 'F#13': [[2, 'x', 2, 3, 4, 4], - ['x', 9, 8, 9, 9, 11], - [14, 'x', 14, 13, 11, 11], - [2, 4, 2, 3, 4, 2]], - 'F#5': [[2, 4, 4, 'x', 'x', 'x'], - ['x', 9, 11, 11, 'x', 'x'], - ['x', 'x', 'x', 11, 14, 14], - ['x', 'x', 4, 6, 7, 'x']], - 'F#6': [['x', 'x', 4, 3, 4, 2], - ['x', 9, 11, 11, 11, 11], - ['x', 'x', 4, 6, 4, 6], - [2, 'x', 1, 3, 2, 'x']], - 'F#7': [[2, 4, 2, 3, 2, 2], - ['x', 9, 10, 9, 10, 9], - [2, 'x', 2, 3, 2, 'x'], - ['x', 'x', 4, 6, 5, 6], - ['x', 9, 8, 9, 7, 'x'], - ['x', 9, 11, 9, 11, 9]], - 'F#7sus4': [[2, 4, 2, 4, 2, 2], - ['x', 9, 9, 9, 7, 7], - ['x', 9, 11, 9, 12, 9], - ['x', 'x', 4, 6, 5, 7]], - 'F#9': [[2, 4, 2, 3, 2, 4], - ['x', 9, 8, 9, 9, 'x'], - ['x', 9, 8, 9, 9, 9], - [14, 'x', 14, 13, 11, 'x'], - ['x', 'x', 4, 3, 5, 4], - [2, 1, 2, 1, 2, 'x']], - 'F#add9': [['x', 'x', 4, 3, 2, 4], - ['x', 9, 11, 11, 9, 9], - ['x', 9, 11, 13, 11, 9], - [2, 'x', 'x', 3, 2, 4]], - 'F#aug': [['x', 'x', 4, 3, 3, 2], - ['x', 9, 8, 7, 7, 'x']], - 'F#dim7': [[2, 3, 1, 2, 'x', 'x'], - ['x', 9, 10, 8, 10, 'x'], - ['x', 'x', 4, 5, 4, 5], - [2, 'x', 1, 2, 1, 'x'], - [2, 3, 4, 2, 4, 2]], - 'F#m': [[2, 4, 4, 2, 2, 2], - ['x', 9, 11, 11, 10, 9], - ['x', 'x', 4, 6, 7, 5], - ['x', 'x', 4, 2, 2, 2]], - 'F#m6': [[2, 4, 4, 2, 4, 2], - ['x', 'x', 4, 6, 4, 5], - ['x', 9, 7, 8, 7, 'x'], - [2, 'x', 1, 2, 2, 'x'], - ['x', 9, 11, 8, 10, 'x'], - ['x', 9, 7, 8, 7, 9], - ['x', 9, 'x', 8, 10, 9]], - 'F#m7': [[2, 4, 2, 2, 2, 2], - [2, 'x', 2, 2, 2, 'x'], - ['x', 9, 11, 9, 10, 9], - ['x', 9, 7, 9, 10, 'x'], - [2, 4, 4, 2, 5, 2], - ['x', 9, 7, 9, 7, 'x'], - ['x', 'x', 4, 6, 5, 5]], - 'F#m7b5': [[2, 'x', 2, 2, 1, 'x'], - ['x', 9, 10, 9, 10, 'x'], - ['x', 'x', 4, 5, 5, 5], - [2, 3, 4, 5, 5, 5], - ['x', 9, 'x', 9, 10, 8], - [2, 3, 2, 2, 5, 2]], - 'F#m9': [[2, 4, 2, 2, 2, 4], - ['x', 9, 7, 9, 9, 'x'], - ['x', 9, 7, 9, 9, 9], - ['x', 'x', 4, 2, 5, 4], - [2, 'x', 2, 2, 2, 4]], - 'F#Maj7': [['x', 'x', 4, 3, 2, 1], - ['x', 9, 11, 10, 11, 9], - ['x', 'x', 4, 6, 6, 6], - ['x', 9, 8, 6, 6, 'x'], - [2, 'x', 3, 3, 2, 'x'], - [2, 4, 3, 3, 2, 2]], - 'F#sus2': [[2, 4, 4, 1, 'x', 'x'], - ['x', 'x', 4, 1, 2, 4], - [2, 'x', 2, 1, 2, 2], - ['x', 9, 11, 11, 9, 9], - ['x', 'x', 4, 6, 7, 4], - ['x', 9, 11, 13, 'x', 'x']], - 'F#sus4': [[2, 4, 4, 4, 2, 2], - ['x', 9, 11, 11, 12, 9], - ['x', 9, 9, 6, 7, 'x'], - ['x', 'x', 4, 6, 7, 7], - ['x', 'x', 4, 4, 2, 2]], - 'F#+': [['x', 9, 8, 7, 7, 'x'], - ['x', 'x', 4, 3, 3, 2], - [14, 13, 12, 11, 'x', 'x'], - [2, 5, 4, 3, 'x', 'x'], - ['x', 9, 'x', 11, 11, 10]], - 'F#+7': [['x', 9, 12, 9, 11, 10], - [2, 'x', 2, 3, 3, 'x'], - ['x', 'x', 4, 7, 5, 6], - ['x', 9, 'x', 9, 11, 10]], - 'F#+7b9': [['x', 9, 8, 9, 8, 10], - [2, 'x', 2, 3, 3, 3]], - 'F#+7#9': [['x', 9, 8, 9, 10, 10], - [2, 'x', 2, 3, 3, 5]], - 'F#+9': [['x', 9, 8, 9, 9, 10], - [2, 'x', 2, 3, 3, 4]], - 'F#7b5#9': [['x', 9, 8, 9, 10, 8]], - 'F#7b9': [['x', 9, 8, 9, 8, 'x'], - [2, 4, 2, 3, 2, 3], - ['x', 9, 8, 9, 8, 9], - ['x', 'x', 4, 3, 5, 3]], - 'F#7#11': [[2, 3, 2, 3, 2, 2]], - 'F#7#9': [['x', 9, 8, 9, 10, 'x'], - [2, 4, 2, 3, 2, 5], - ['x', 'x', 4, 3, 5, 5]], - 'F#9sus4': [['x', 9, 9, 9, 9, 9], - [14, 'x', 14, 13, 12, 'x'], - [14, 'x', 14, 13, 12, 12]], - 'F#9b5': [['x', 9, 8, 9, 9, 8], - [2, 1, 2, 1, 1, 'x']], - 'F#13sus4': [['x', 9, 9, 9, 9, 11], - [2, 'x', 2, 4, 4, 4]], - 'F#7sus2': [[2, 'x', 2, 1, 2, 2]], - 'F#7b5': [['x', 9, 10, 9, 11, 'x'], - [2, 'x', 2, 3, 1, 'x'], - ['x', 'x', 4, 5, 5, 6], - ['x', 9, 10, 9, 11, 12]], - 'F#madd9': [['x', 'x', 4, 2, 2, 4]], - 'F#Maj13': [['x', 9, 'x', 10, 11, 11], - [2, 1, 1, 1, 2, 1], - [2, 'x', 3, 3, 4, 4]], - 'F#Maj7#11': [['x', 9, 10, 10, 11, 9], - [2, 'x', 3, 3, 1, 'x'], - ['x', 'x', 4, 5, 6, 6]], - 'F#m11': [['x', 9, 7, 9, 7, 7], - ['x', 9, 9, 9, 10, 9], - [14, 'x', 14, 14, 12, 'x'], - ['x', 'x', 4, 4, 5, 5], - ['x', 9, 'x', 9, 10, 7]], - 'F#m13': [['x', 9, 'x', 9, 10, 11], - [2, 4, 2, 2, 4, 2], - [2, 'x', 2, 2, 4, 4], - ['x', 9, 11, 9, 10, 11], - ['x', 9, 7, 9, 9, 11]], - 'F#m9b5': [[2, 3, 2, 2, 5, 4]], - 'F#Maj9': [['x', 9, 8, 10, 9, 'x'], - ['x', 'x', 4, 3, 6, 4], - ['x', 9, 6, 6, 6, 6], - [2, 1, 3, 1, 2, 1], - [2, 'x', 3, 1, 2, 'x']], - 'F#mMaj7': [['x', 9, 11, 10, 10, 9], - [2, 'x', 3, 2, 2, 'x'], - [2, 4, 3, 2, 2, 2], - ['x', 'x', 4, 6, 6, 5], - ['x', 'x', 4, 2, 2, 1]], - 'F#mMaj9': [['x', 9, 7, 10, 9, 'x'], - [2, 4, 3, 2, 2, 4]], - 'F#mb6': [['x', 9, 7, 7, 7, 9], - [14, 'x', 12, 14, 14, 'x']], - 'F#dim': [['x', 9, 10, 11, 10, 'x'], - [2, 'x', 4, 2, 1, 'x'], - [2, 3, 4, 2, 'x', 'x']], - 'Gb': [[2, 4, 4, 3, 2, 2], - ['x', 9, 11, 11, 11, 9], - ['x', 9, 8, 6, 7, 6], - ['x', 'x', 4, 3, 2, 2], - [14, 13, 11, 11, 11, 14], - ['x', 'x', 4, 6, 7, 6]], - 'Gb11': [[2, 4, 2, 4, 2, 4], - ['x', 9, 9, 9, 9, 9], - [2, 'x', 2, 1, 0, 0], - ['x', 9, 8, 9, 7, 7], - ['x', 9, 9, 9, 11, 9], - ['x', 'x', 4, 4, 5, 6]], - 'Gb13': [[2, 'x', 2, 3, 4, 4], - ['x', 9, 8, 9, 9, 11], - [14, 'x', 14, 13, 11, 11], - [2, 4, 2, 3, 4, 2]], - 'Gb5': [[2, 4, 4, 'x', 'x', 'x'], - ['x', 9, 11, 11, 'x', 'x'], - ['x', 'x', 'x', 11, 14, 14], - ['x', 'x', 4, 6, 7, 'x']], - 'Gb6': [['x', 'x', 4, 3, 4, 2], - ['x', 9, 11, 11, 11, 11], - ['x', 'x', 4, 6, 4, 6], - [2, 'x', 1, 3, 2, 'x']], - 'Gb7': [[2, 4, 2, 3, 2, 2], - ['x', 9, 10, 9, 10, 9], - [2, 'x', 2, 3, 2, 'x'], - ['x', 'x', 4, 6, 5, 6], - ['x', 9, 8, 9, 7, 'x'], - ['x', 9, 11, 9, 11, 9]], - 'Gb7sus4': [[2, 4, 2, 4, 2, 2], - ['x', 9, 9, 9, 7, 7], - ['x', 9, 11, 9, 12, 9], - ['x', 'x', 4, 6, 5, 7]], - 'Gb9': [[2, 1, 2, 3, 2, 4], - ['x', 9, 8, 9, 9, 'x'], - [2, 4, 2, 3, 2, 4], - ['x', 9, 8, 9, 9, 9], - [14, 'x', 14, 13, 11, 'x'], - ['x', 'x', 4, 3, 5, 4], - [2, 1, 2, 1, 2, 'x']], - 'Gbadd9': [['x', 'x', 4, 3, 2, 4], - ['x', 9, 11, 11, 9, 9], - ['x', 9, 11, 13, 11, 9], - [2, 'x', 'x', 3, 2, 4]], - 'Gbaug': [['x', 'x', 4, 3, 3, 2], - ['x', 9, 8, 7, 7, 'x']], - 'Gbdim7': [[2, 3, 1, 2, 'x', 'x'], - ['x', 9, 10, 8, 10, 'x'], - [2, 'x', 1, 2, 1, 'x'], - ['x', 'x', 4, 5, 4, 5], - [2, 3, 4, 2, 4, 2]], - 'Gbm': [[2, 4, 4, 2, 2, 2], - ['x', 9, 11, 11, 10, 9], - ['x', 'x', 4, 6, 7, 5], - ['x', 'x', 4, 2, 2, 2]], - 'Gbm6': [[2, 4, 4, 2, 4, 2], - ['x', 'x', 4, 6, 4, 5], - ['x', 9, 7, 8, 7, 'x'], - [2, 'x', 1, 2, 2, 'x'], - ['x', 9, 11, 8, 10, 'x'], - ['x', 9, 7, 8, 7, 9], - ['x', 9, 'x', 8, 10, 9]], - 'Gbm7': [[2, 4, 2, 2, 2, 2], - [2, 'x', 2, 2, 2, 'x'], - ['x', 9, 11, 9, 10, 9], - ['x', 9, 7, 9, 10, 'x'], - [2, 4, 4, 2, 5, 2], - ['x', 9, 7, 9, 7, 'x'], - ['x', 'x', 4, 6, 5, 5]], - 'Gbm7b5': [[2, 'x', 2, 2, 1, 'x'], - ['x', 'x', 4, 5, 5, 5], - ['x', 9, 10, 9, 10, 'x'], - [2, 3, 4, 5, 5, 5], - ['x', 9, 'x', 9, 10, 8], - [2, 3, 2, 2, 5, 2]], - 'Gbm9': [[2, 4, 2, 2, 2, 4], - ['x', 9, 7, 9, 9, 'x'], - ['x', 9, 7, 9, 9, 9], - ['x', 'x', 4, 2, 5, 4], - [2, 'x', 2, 2, 2, 4]], - 'GbMaj7': [['x', 'x', 4, 3, 2, 1], - ['x', 9, 11, 10, 11, 9], - ['x', 'x', 4, 6, 6, 6], - [2, 'x', 3, 3, 2, 'x'], - ['x', 9, 8, 6, 6, 'x'], - [2, 4, 3, 3, 2, 2]], - 'Gbsus2': [[2, 4, 4, 1, 'x', 'x'], - ['x', 'x', 4, 1, 2, 4], - [2, 'x', 2, 1, 2, 2], - ['x', 9, 11, 11, 9, 9], - ['x', 'x', 4, 6, 7, 4], - ['x', 9, 11, 13, 'x', 'x']], - 'Gbsus4': [[2, 4, 4, 4, 2, 2], - ['x', 9, 11, 11, 12, 9], - ['x', 9, 9, 6, 7, 'x'], - ['x', 'x', 4, 6, 7, 7], - ['x', 'x', 4, 4, 2, 2]], - 'Gb+': [['x', 9, 8, 7, 7, 'x'], - ['x', 'x', 4, 3, 3, 2], - [14, 13, 12, 11, 'x', 'x'], - [2, 5, 4, 3, 'x', 'x'], - ['x', 9, 'x', 11, 11, 10]], - 'Gb+7': [['x', 9, 12, 9, 11, 10], - [2, 'x', 2, 3, 3, 'x'], - ['x', 'x', 4, 7, 5, 6], - ['x', 9, 'x', 9, 11, 10]], - 'Gb+7b9': [['x', 9, 8, 9, 8, 10], - [2, 'x', 2, 3, 3, 3]], - 'Gb+7#9': [['x', 9, 8, 9, 10, 10], - [2, 'x', 2, 3, 3, 5]], - 'Gb+9': [['x', 9, 8, 9, 9, 10], - [2, 'x', 2, 3, 3, 4]], - 'Gb7b5#9': [['x', 9, 8, 9, 10, 8]], - 'Gb7b9': [['x', 9, 8, 9, 8, 'x'], - [2, 4, 2, 3, 2, 3], - ['x', 9, 8, 9, 8, 9], - ['x', 'x', 4, 3, 5, 3]], - 'Gb7#11': [[2, 3, 2, 3, 2, 2]], - 'Gb7#9': [['x', 9, 8, 9, 10, 'x'], - [2, 4, 2, 3, 2, 5], - ['x', 'x', 4, 3, 5, 5]], - 'Gb9sus4': [['x', 9, 9, 9, 9, 9], - [14, 'x', 14, 13, 12, 'x'], - [14, 'x', 14, 13, 12, 12]], - 'Gb9b5': [['x', 9, 8, 9, 9, 8], - [2, 1, 2, 1, 1, 'x']], - 'Gb13sus4': [['x', 9, 9, 9, 9, 11], - [2, 'x', 2, 4, 4, 4]], - 'Gb7sus2': [[2, 'x', 2, 1, 2, 2]], - 'Gb7b5': [['x', 9, 10, 9, 11, 'x'], - [2, 'x', 2, 3, 1, 'x'], - ['x', 'x', 4, 5, 5, 6], - ['x', 9, 10, 9, 11, 12]], - 'Gbmadd9': [['x', 'x', 4, 2, 2, 4]], - 'GbMaj13': [['x', 9, 'x', 10, 11, 11], - [2, 1, 1, 1, 2, 1], - [2, 'x', 3, 3, 4, 4]], - 'GbMaj7#11': [['x', 9, 10, 10, 11, 9], - [2, 'x', 3, 3, 1, 'x'], - ['x', 'x', 4, 5, 6, 6]], - 'Gbm11': [['x', 9, 7, 9, 7, 7], - ['x', 9, 9, 9, 10, 9], - [14, 'x', 14, 14, 12, 'x'], - ['x', 'x', 4, 4, 5, 5], - ['x', 9, 'x', 9, 10, 7]], - 'Gbm13': [['x', 9, 'x', 9, 10, 11], - [2, 4, 2, 2, 4, 2], - [2, 'x', 2, 2, 4, 4], - ['x', 9, 11, 9, 10, 11], - ['x', 9, 7, 9, 9, 11]], - 'Gbm9b5': [[2, 3, 2, 2, 5, 4]], - 'GbMaj9': [['x', 9, 8, 10, 9, 'x'], - ['x', 'x', 4, 3, 6, 4], - ['x', 9, 6, 6, 6, 6], - [2, 1, 3, 1, 2, 1], - [2, 'x', 3, 1, 2, 'x']], - 'GbmMaj7': [['x', 9, 11, 10, 10, 9], - [2, 'x', 3, 2, 2, 'x'], - [2, 4, 3, 2, 2, 2], - ['x', 'x', 4, 6, 6, 5], - ['x', 'x', 4, 2, 2, 1]], - 'GbmMaj9': [['x', 9, 7, 10, 9, 'x'], - [2, 4, 3, 2, 2, 4]], - 'Gbmb6': [['x', 9, 7, 7, 7, 9], - [14, 'x', 12, 14, 14, 'x']], - 'Gbdim': [['x', 9, 10, 11, 10, 'x'], - [2, 'x', 4, 2, 1, 'x'], - [2, 3, 4, 2, 'x', 'x']], - 'G': [[3, 2, 0, 0, 3, 3], - [3, 5, 5, 4, 3, 3], - [3, 2, 0, 'x', 'x', 'x'], - ['x', 10, 12, 12, 12, 10], - ['x', 10, 9, 7, 8, 7], - [15, 14, 12, 12, 12, 15], - ['x', 'x', 5, 7, 8, 7]], - 'G11': [[3, 'x', 3, 2, 1, 1], - [3, 5, 3, 5, 3, 5], - ['x', 10, 10, 10, 10, 10], - ['x', 10, 9, 10, 8, 8], - ['x', 10, 10, 10, 12, 10], - ['x', 'x', 5, 5, 6, 7]], - 'G13': [[3, 'x', 3, 2, 0, 0], - [3, 'x', 3, 4, 5, 5], - ['x', 10, 9, 10, 10, 12], - [15, 'x', 15, 14, 12, 12], - [3, 5, 3, 4, 5, 3]], - 'G5': [[3, 5, 5, 'x', 'x', 'x'], - ['x', 10, 12, 12, 'x', 'x'], - ['x', 'x', 'x', 12, 15, 15], - ['x', 'x', 5, 7, 8, 'x']], - 'G6': [[3, 2, 0, 0, 0, 0], - ['x', 'x', 5, 4, 5, 3], - ['x', 10, 12, 12, 12, 12], - ['x', 'x', 5, 7, 5, 7], - [3, 'x', 2, 4, 3, 'x']], - 'G7': [[3, 2, 0, 0, 0, 1], - [3, 5, 3, 4, 3, 3], - ['x', 10, 12, 10, 12, 10], - ['x', 'x', 5, 7, 6, 7], - ['x', 10, 9, 10, 8, 'x'], - [3, 'x', 3, 4, 3, 'x']], - 'G7sus4': [[3, 5, 3, 5, 3, 3], - ['x', 10, 10, 10, 8, 8], - ['x', 10, 12, 10, 13, 10], - ['x', 'x', 5, 7, 6, 8]], - 'G9': [[3, 5, 3, 4, 3, 5], - ['x', 10, 9, 10, 10, 'x'], - ['x', 10, 9, 10, 10, 10], - [15, 'x', 15, 14, 12, 'x'], - ['x', 'x', 5, 4, 6, 5], - [3, 2, 3, 2, 3, 'x']], - 'Gadd11': [[3, 2, 0, 0, 1, 3]], - 'Gadd9': [[3, 2, 0, 0, 0, 5], - [3, 2, 0, 2, 0, 3], - ['x', 'x', 5, 4, 3, 5], - ['x', 10, 12, 12, 10, 10], - ['x', 10, 12, 14, 12, 10], - [3, 'x', 'x', 4, 3, 5]], - 'Gaug': [[3, 2, 1, 0, 0, 3], - ['x', 10, 9, 8, 8, 'x'], - ['x', 'x', 5, 4, 4, 3], - [3, 2, 1, 0, 1, 'x']], - 'Gdim7': [[3, 4, 2, 3, 'x', 'x'], - ['x', 10, 11, 9, 11, 'x'], - ['x', 'x', 5, 6, 5, 6], - [3, 4, 5, 3, 5, 3], - [3, 'x', 2, 3, 2, 'x']], - 'Gm': [[3, 5, 5, 3, 3, 3], - ['x', 10, 12, 12, 11, 10], - ['x', 'x', 5, 7, 8, 6], - ['x', 'x', 5, 3, 3, 3]], - 'Gm6': [[3, 5, 5, 3, 5, 3], - ['x', 'x', 5, 7, 5, 6], - ['x', 10, 8, 9, 8, 'x'], - [3, 'x', 2, 3, 3, 'x'], - ['x', 10, 12, 9, 11, 'x'], - ['x', 10, 8, 9, 8, 10], - ['x', 10, 'x', 9, 11, 10]], - 'Gm7': [[3, 5, 3, 3, 3, 3], - [3, 'x', 3, 3, 3, 'x'], - ['x', 10, 12, 10, 11, 10], - ['x', 10, 8, 10, 11, 'x'], - [3, 5, 5, 3, 6, 3], - ['x', 10, 8, 10, 8, 'x'], - ['x', 'x', 5, 7, 6, 6]], - 'Gm7b5': [[3, 'x', 3, 3, 2, 'x'], - ['x', 'x', 5, 6, 6, 6], - ['x', 10, 11, 10, 11, 'x'], - [3, 4, 5, 6, 6, 6], - ['x', 10, 'x', 10, 11, 9], - [3, 4, 3, 3, 6, 3]], - 'Gm9': [[3, 5, 3, 3, 3, 5], - ['x', 10, 8, 10, 10, 'x'], - ['x', 10, 8, 10, 10, 10], - ['x', 'x', 5, 3, 6, 5], - [3, 'x', 3, 3, 3, 5]], - 'GMaj7': [[3, 2, 0, 0, 0, 2], - ['x', 'x', 5, 4, 3, 2], - ['x', 'x', 5, 7, 7, 7], - ['x', 10, 12, 11, 12, 10], - [3, 'x', 4, 4, 3, 'x'], - ['x', 10, 9, 7, 7, 'x'], - [3, 5, 4, 4, 3, 3]], - 'Gsus2': [[3, 0, 0, 0, 3, 3], - [3, 5, 5, 2, 'x', 'x'], - [3, 'x', 0, 2, 3, 3], - ['x', 10, 12, 12, 10, 10], - ['x', 'x', 5, 7, 8, 5], - ['x', 10, 12, 14, 'x', 'x'], - ['x', 'x', 5, 2, 3, 5]], - 'Gsus4': [[3, 3, 0, 0, 1, 3], - [3, 5, 5, 5, 3, 3], - ['x', 10, 10, 7, 8, 'x'], - ['x', 'x', 5, 7, 8, 8], - ['x', 10, 12, 12, 13, 10], - ['x', 'x', 5, 5, 3, 3]], - 'G+': [['x', 10, 9, 8, 8, 'x'], - ['x', 'x', 5, 4, 4, 3], - [15, 14, 13, 12, 'x', 'x'], - [3, 6, 5, 4, 'x', 'x'], - ['x', 10, 'x', 12, 12, 11]], - 'G+7': [['x', 10, 13, 10, 12, 11], - [3, 'x', 3, 4, 4, 'x'], - ['x', 'x', 5, 8, 6, 7], - ['x', 10, 'x', 10, 12, 11]], - 'G+7b9': [['x', 10, 9, 10, 9, 11], - [3, 'x', 3, 4, 4, 4]], - 'G+7#9': [['x', 10, 9, 10, 11, 11], - [3, 'x', 3, 4, 4, 6]], - 'G+9': [['x', 10, 9, 10, 10, 11], - [3, 'x', 3, 4, 4, 5]], - 'G7b5#9': [['x', 10, 9, 10, 11, 9]], - 'G7b9': [['x', 10, 9, 10, 9, 'x'], - [3, 5, 3, 4, 3, 4], - ['x', 10, 9, 10, 9, 10], - ['x', 'x', 5, 4, 6, 4]], - 'G7#11': [[3, 4, 3, 4, 3, 3]], - 'G7#9': [['x', 10, 9, 10, 11, 'x'], - [3, 5, 3, 4, 3, 6], - ['x', 'x', 5, 4, 6, 6]], - 'G9sus4': [['x', 10, 10, 10, 10, 10], - [3, 'x', 3, 2, 1, 'x'], - [3, 'x', 3, 2, 1, 1]], - 'G9b5': [['x', 10, 9, 10, 10, 9], - [3, 2, 3, 2, 2, 'x']], - 'G13sus4': [['x', 10, 10, 10, 10, 12], - [3, 'x', 3, 5, 5, 5]], - 'G7sus2': [[3, 'x', 3, 2, 3, 3]], - 'G7b5': [['x', 10, 11, 10, 12, 'x'], - [3, 'x', 3, 4, 2, 'x'], - ['x', 'x', 5, 6, 6, 7], - ['x', 10, 11, 10, 12, 13]], - 'Gmadd9': [['x', 'x', 5, 3, 3, 5]], - 'GMaj13': [['x', 10, 'x', 11, 12, 12], - [3, 2, 2, 2, 3, 2], - [3, 'x', 4, 4, 5, 5]], - 'GMaj7#11': [['x', 10, 11, 11, 12, 10], - [3, 'x', 4, 4, 2, 'x'], - ['x', 'x', 5, 6, 7, 7]], - 'Gm11': [['x', 10, 8, 10, 8, 8], - ['x', 10, 10, 10, 11, 10], - [3, 'x', 3, 3, 1, 'x'], - ['x', 'x', 5, 5, 6, 6], - ['x', 10, 'x', 10, 11, 8]], - 'Gm13': [['x', 10, 'x', 10, 11, 12], - [3, 5, 3, 3, 5, 3], - [3, 'x', 3, 3, 5, 5], - ['x', 10, 12, 10, 11, 12], - ['x', 10, 8, 10, 10, 12]], - 'Gm9b5': [[3, 4, 3, 3, 6, 5]], - 'GMaj9': [['x', 10, 9, 11, 10, 'x'], - ['x', 'x', 5, 4, 7, 5], - ['x', 10, 7, 7, 7, 7], - [3, 2, 4, 2, 3, 2], - [3, 'x', 4, 2, 3, 'x']], - 'GmMaj7': [['x', 10, 12, 11, 11, 10], - [3, 'x', 4, 3, 3, 'x'], - [3, 5, 4, 3, 3, 3], - ['x', 'x', 5, 7, 7, 6], - ['x', 'x', 5, 3, 3, 2]], - 'GmMaj9': [['x', 10, 8, 11, 10, 'x'], - [3, 5, 4, 3, 3, 5]], - 'Gmb6': [['x', 10, 8, 8, 8, 10], - [3, 'x', 1, 3, 3, 'x']], - 'Gdim': [['x', 10, 11, 12, 11, 'x'], - [3, 'x', 5, 3, 2, 'x'], - [3, 4, 5, 3, 'x', 'x']], - 'G#': [[4, 6, 6, 5, 4, 4], - ['x', 11, 10, 9, 8, 8], - ['x', 11, 13, 13, 13, 11], - [4, 3, 1, 1, 1, 4], - ['x', 'x', 6, 8, 9, 8]], - 'G#11': [[4, 6, 4, 6, 4, 6], - [4, 'x', 4, 3, 2, 2], - ['x', 11, 11, 11, 11, 11], - ['x', 11, 10, 11, 9, 9], - ['x', 11, 11, 11, 13, 11], - ['x', 'x', 6, 6, 7, 8]], - 'G#13': [[4, 'x', 4, 3, 1, 1], - [4, 'x', 4, 5, 6, 6], - ['x', 11, 10, 11, 11, 13], - [4, 6, 4, 5, 6, 4]], - 'G#5': [[4, 6, 6, 'x', 'x', 'x'], - ['x', 11, 13, 13, 'x', 'x'], - ['x', 'x', 'x', 1, 4, 4], - ['x', 'x', 6, 8, 9, 'x']], - 'G#6': [['x', 'x', 6, 5, 6, 4], - ['x', 'x', 6, 8, 6, 8], - ['x', 11, 13, 13, 13, 13], - [4, 'x', 3, 5, 4, 'x']], - 'G#7': [[4, 6, 4, 5, 4, 4], - [4, 'x', 4, 5, 4, 'x'], - ['x', 11, 13, 11, 13, 11], - ['x', 'x', 6, 8, 7, 8], - ['x', 11, 10, 11, 9, 'x']], - 'G#7sus4': [[4, 6, 4, 6, 4, 4], - ['x', 11, 11, 11, 9, 9], - ['x', 11, 13, 11, 14, 11], - ['x', 'x', 6, 8, 7, 9]], - 'G#9': [[4, 6, 4, 5, 4, 6], - [4, 'x', 4, 3, 4, 4], - ['x', 11, 'x', 10, 11, 11], - ['x', 11, 10, 11, 11, 11], - [4, 'x', 4, 3, 1, 'x'], - ['x', 'x', 6, 5, 7, 6], - [4, 3, 4, 3, 4, 'x']], - 'G#add9': [['x', 'x', 6, 5, 4, 6], - ['x', 11, 8, 8, 9, 8], - ['x', 11, 13, 14, 13, 11], - ['x', 11, 13, 15, 13, 11], - [4, 'x', 'x', 5, 4, 6]], - 'G#aug': [[4, 3, 2, 1, 'x', 'x'], - ['x', 'x', 6, 5, 5, 4], - ['x', 11, 10, 9, 9, 'x']], - 'G#dim7': [[4, 5, 3, 4, 'x', 'x'], - ['x', 11, 12, 10, 12, 'x'], - [4, 'x', 3, 4, 3, 'x'], - ['x', 'x', 6, 7, 6, 7]], - 'G#m': [[4, 6, 6, 4, 4, 4], - ['x', 'x', 6, 8, 9, 7], - ['x', 11, 13, 13, 12, 11], - ['x', 'x', 6, 4, 4, 4]], - 'G#m6': [[4, 6, 6, 4, 6, 4], - ['x', 'x', 6, 8, 6, 7], - ['x', 11, 9, 10, 9, 'x'], - [4, 'x', 3, 4, 4, 'x'], - ['x', 11, 13, 10, 12, 'x'], - ['x', 11, 9, 10, 9, 11], - ['x', 11, 'x', 10, 12, 11]], - 'G#m7': [[4, 6, 4, 4, 4, 4], - [4, 'x', 4, 4, 4, 'x'], - ['x', 11, 13, 11, 12, 11], - ['x', 'x', 6, 8, 7, 7], - [4, 6, 6, 4, 7, 4], - ['x', 11, 9, 11, 12, 'x'], - ['x', 11, 9, 11, 9, 'x']], - 'G#m7b5': [['x', 'x', 6, 7, 7, 7], - [4, 'x', 4, 4, 3, 'x'], - [4, 5, 6, 7, 7, 7], - ['x', 11, 12, 11, 12, 'x'], - ['x', 11, 'x', 11, 12, 10], - [4, 5, 4, 4, 7, 4]], - 'G#m9': [[4, 6, 4, 4, 4, 6], - ['x', 11, 9, 11, 11, 'x'], - ['x', 11, 9, 11, 11, 11], - ['x', 'x', 6, 4, 7, 6], - [4, 'x', 4, 4, 4, 6]], - 'G#Maj7': [['x', 'x', 6, 5, 4, 3], - ['x', 'x', 6, 8, 8, 8], - [4, 'x', 5, 5, 4, 'x'], - ['x', 11, 10, 8, 8, 'x'], - ['x', 11, 13, 12, 13, 11], - [4, 6, 5, 5, 4, 4]], - 'G#sus2': [[4, 1, 1, 1, 4, 4], - ['x', 11, 13, 13, 11, 11], - ['x', 'x', 6, 8, 9, 6], - ['x', 11, 13, 15, 'x', 'x'], - ['x', 'x', 6, 3, 4, 6]], - 'G#sus4': [[4, 6, 6, 6, 4, 4], - ['x', 11, 11, 8, 9, 'x'], - ['x', 'x', 6, 8, 9, 9], - ['x', 11, 13, 13, 14, 11], - ['x', 'x', 6, 6, 4, 4]], - 'G#+': [['x', 11, 10, 9, 9, 'x'], - ['x', 'x', 6, 5, 5, 4], - [4, 3, 2, 1, 'x', 'x'], - [4, 7, 6, 5, 'x', 'x'], - ['x', 11, 'x', 13, 13, 12]], - 'G#+7': [['x', 11, 14, 11, 13, 12], - [4, 'x', 4, 5, 5, 'x'], - ['x', 'x', 6, 9, 7, 8], - ['x', 11, 'x', 11, 13, 12]], - 'G#+7b9': [['x', 11, 10, 11, 10, 12], - [4, 'x', 4, 5, 5, 5]], - 'G#+7#9': [['x', 11, 10, 11, 12, 12], - [4, 'x', 4, 5, 5, 7]], - 'G#+9': [['x', 11, 10, 11, 11, 12], - [4, 'x', 4, 5, 5, 6]], - 'G#7b5#9': [['x', 11, 10, 11, 12, 10]], - 'G#7b9': [['x', 11, 10, 11, 10, 'x'], - [4, 6, 4, 5, 4, 5], - ['x', 11, 10, 11, 10, 11], - ['x', 'x', 6, 5, 7, 5]], - 'G#7#11': [[4, 5, 4, 5, 4, 4]], - 'G#7#9': [['x', 11, 10, 11, 12, 'x'], - [4, 6, 4, 5, 4, 7], - ['x', 'x', 6, 5, 7, 7]], - 'G#9sus4': [['x', 11, 11, 11, 11, 11], - [4, 'x', 4, 3, 2, 'x'], - [4, 'x', 4, 3, 2, 2]], - 'G#9b5': [['x', 11, 10, 11, 11, 10], - [4, 3, 4, 3, 3, 'x']], - 'G#13sus4': [['x', 11, 11, 11, 11, 13], - [4, 'x', 4, 6, 6, 6]], - 'G#7sus2': [[4, 'x', 4, 3, 4, 4]], - 'G#7b5': [['x', 11, 12, 11, 13, 'x'], - [4, 'x', 4, 5, 3, 'x'], - ['x', 'x', 6, 7, 7, 8], - ['x', 11, 12, 11, 13, 14]], - 'G#madd9': [['x', 'x', 6, 4, 4, 6]], - 'G#Maj13': [['x', 11, 'x', 12, 13, 13], - [4, 3, 3, 3, 4, 3], - [4, 'x', 5, 5, 6, 6]], - 'G#Maj7#11': [['x', 11, 12, 12, 13, 11], - [4, 'x', 5, 5, 3, 'x'], - ['x', 'x', 6, 7, 8, 8]], - 'G#m11': [['x', 11, 9, 11, 9, 9], - ['x', 11, 11, 11, 12, 11], - [4, 'x', 4, 4, 2, 'x'], - ['x', 'x', 6, 6, 7, 7], - ['x', 11, 'x', 11, 12, 9]], - 'G#m13': [['x', 11, 'x', 11, 12, 13], - [4, 6, 4, 4, 6, 4], - [4, 'x', 4, 4, 6, 6], - ['x', 11, 13, 11, 12, 13], - ['x', 11, 9, 11, 11, 13]], - 'G#m9b5': [[4, 5, 4, 4, 7, 6]], - 'G#Maj9': [['x', 11, 10, 12, 11, 'x'], - ['x', 'x', 6, 5, 8, 6], - ['x', 11, 8, 8, 8, 8], - [4, 3, 5, 3, 4, 3], - [4, 'x', 5, 3, 4, 'x']], - 'G#mMaj7': [['x', 11, 13, 12, 12, 11], - [4, 'x', 5, 4, 4, 'x'], - [4, 6, 5, 4, 4, 4], - ['x', 'x', 6, 8, 8, 7], - ['x', 'x', 6, 4, 4, 3]], - 'G#mMaj9': [['x', 11, 9, 12, 11, 'x'], - [4, 6, 5, 4, 4, 6]], - 'G#mb6': [['x', 11, 9, 9, 9, 11], - [4, 'x', 2, 4, 4, 'x']], - 'G#dim': [['x', 11, 12, 13, 12, 'x'], - [4, 'x', 6, 4, 3, 'x'], - [4, 5, 6, 4, 'x', 'x']]}, 'DADGBE': {}, 'DADGAD': {}, 'GCEA': {'A': [[2, 1, 0, 0], - [2, 4, 5, 4], - [6, 4, 5, 4], - [9, 9, 9, 12]], - 'Am': [[2, 0, 0, 0], - [2, 0, 0, 3], - [2, 4, 5, 3], - [5, 4, 5, 3]], - 'Adim': [[2, 3, 5, 3], - [5, 3, 5, 3], - [8, 9, 8, 6], - [14, 12, 11, 12]], - 'Adim7': [[2, 3, 2, 3], - [5, 6, 5, 6], - [8, 9, 8, 9], - [11, 12, 11, 12]], - 'Asus2': [[2, 4, 5, 2], - [4, 4, 5, 7], - [9, 9, 7, 7], - [9, 11, 12, 12]], - 'Asus4': [[2, 2, 0, 0], - [2, 4, 5, 5], - [7, 4, 5, 5], - [7, 4, 5, 7]], - 'A7sus4': [[0, 2, 0, 0], - [2, 4, 3, 5], - [7, 7, 5, 7], - [9, 9, 10, 10]], - 'A7alt': [[2, 3, 5, 4], - [6, 3, 5, 4], - [6, 9, 9, 6]], - 'A+': [[2, 1, 1, 0], - [2, 1, 1, 4], - [2, 5, 5, 4], - [6, 5, 5, 8]], - 'A6': [[2, 4, 2, 4], - [6, 6, 5, 7], - [9, 9, 9, 9], - [11, 13, 12, 12]], - 'A69': [[4, 4, 2, 4], - [6, 6, 7, 7], - [9, 11, 9, 9], - [11, 13, 12, 14]], - 'A7': [[0, 1, 0, 0], - [2, 4, 3, 4], - [6, 7, 5, 7], - [9, 9, 9, 10]], - 'A7b5': [[2, 3, 3, 4], - [6, 7, 5, 6], - [8, 9, 9, 10], - [12, 13, 11, 12]], - 'A+7': [[0, 1, 1, 0], - [2, 5, 3, 4], - [6, 7, 5, 8], - [10, 9, 9, 10]], - 'A9': [[0, 1, 0, 2], - [4, 4, 3, 4], - [6, 7, 7, 7], - [9, 11, 9, 10]], - 'A9b5': [[4, 3, 3, 4], - [6, 7, 7, 6], - [8, 11, 9, 10], - [12, 13, 11, 14]], - 'A+9': [[0, 1, 1, 2], - [4, 5, 3, 4], - [6, 7, 7, 8], - [10, 11, 9, 10]], - 'A7b9': [[0, 1, 0, 1], - [3, 4, 3, 4], - [6, 7, 6, 7], - [9, 10, 9, 10]], - 'A7b9#5': [[0, 1, 1, 1], - [3, 5, 3, 4], - [6, 7, 6, 8], - [10, 10, 9, 10]], - 'A7#9': [[0, 1, 0, 3], - [5, 4, 3, 4], - [6, 4, 3, 3], - [6, 7, 8, 7]], - 'A11': [[4, 2, 3, 4], - [7, 7, 7, 4], - [6, 7, 7, 5]], - 'A9#11': [[4, 3, 3, 4], - [6, 7, 7, 6], - [8, 11, 9, 10], - [12, 13, 11, 14]], - 'A13': [[0, 1, 2, 2], - [4, 6, 3, 4], - [6, 7, 7, 9], - [11, 11, 9, 10]], - 'A13b9': [[0, 1, 2, 1], - [3, 6, 3, 4], - [6, 7, 6, 9], - [12, 10, 9, 9]], - 'A13b5b9': [[3, 6, 3, 6], - [8, 7, 6, 9], - [0, 10, 11, 9], - [11, 10, 11, 10]], - 'Ab13b9': [[0, 1, 1, 1], - [3, 5, 3, 4], - [6, 7, 6, 8], - [10, 10, 9, 10], - [2, 5, 2, 3], - [5, 6, 5, 8], - [11, 9, 8, 8], - [11, 12, 13, 12]], - 'Ab13#9': [[0, 1, 1, 3], - [5, 5, 3, 4], - [6, 5, 3, 3], - [6, 7, 8, 8]], - 'Amaj7': [[1, 1, 0, 0], - [2, 4, 4, 4], - [6, 8, 5, 7], - [9, 9, 9, 11]], - 'Amaj7b5': [[2, 3, 4, 4], - [6, 8, 5, 6], - [8, 9, 9, 11], - [14, 13, 11, 11]], - 'Amaj7#5': [[1, 1, 1, 0], - [2, 5, 4, 4], - [6, 8, 5, 8], - [10, 9, 9, 11]], - 'Amaj9': [[1, 1, 0, 2], - [4, 4, 4, 4], - [6, 8, 7, 7], - [9, 11, 9, 11]], - 'Amaj11': [[4, 2, 4, 4], - [6, 8, 7, 5]], - 'Amaj13': [[1, 1, 2, 2], - [4, 6, 4, 4], - [6, 8, 7, 9], - [11, 11, 9, 11]], - 'Am6': [[2, 4, 2, 3], - [5, 6, 5, 7], - [9, 9, 8, 9], - [11, 12, 12, 12]], - 'Am7': [[0, 0, 0, 0], - [2, 4, 3, 3], - [5, 7, 5, 7], - [9, 9, 8, 10]], - 'Am7b5': [[2, 3, 3, 3], - [5, 7, 5, 6], - [8, 9, 8, 10], - [12, 12, 11, 12]], - 'Am9': [[0, 0, 0, 2], - [5, 4, 3, 2], - [4, 4, 3, 3], - [5, 7, 7, 7]], - 'Am69': [[4, 4, 2, 3], - [5, 4, 2, 2], - [5, 6, 7, 7], - [9, 11, 8, 9]], - 'Am9b5': [[5, 3, 3, 2], - [4, 3, 3, 3], - [5, 7, 7, 6], - [8, 11, 8, 10]], - 'Am11': [[4, 2, 3, 3], - [5, 2, 3, 2], - [5, 7, 7, 5]], - 'Ammaj7': [[1, 0, 0, 0], - [2, 4, 4, 3], - [5, 8, 5, 7], - [9, 9, 8, 11]], - 'Ammaj7b5': [[2, 3, 4, 3], - [5, 8, 5, 6], - [8, 9, 8, 11], - [13, 12, 11, 12]], - 'Ammaj9': [[1, 0, 0, 2], - [5, 4, 4, 2], - [4, 4, 4, 3], - [5, 8, 7, 7]], - 'Ammaj11': [[4, 2, 4, 3], - [5, 2, 4, 2], - [5, 8, 7, 5]], - 'Aadd9': [[2, 1, 0, 2], - [4, 4, 5, 4], - [6, 9, 7, 7], - [9, 11, 9, 12]], - 'Amadd9': [[2, 0, 0, 2], - [5, 4, 5, 2], - [4, 4, 5, 3]], - 'Ab': [[1, 3, 4, 3], - [5, 3, 4, 3], - [5, 3, 4, 6], - [8, 8, 8, 11]], - 'Abm': [[1, 3, 4, 2], - [4, 3, 4, 2], - [4, 3, 4, 6], - [8, 8, 7, 6]], - 'Abdim': [[1, 2, 4, 2], - [4, 2, 4, 2], - [7, 8, 7, 5], - [13, 11, 10, 11]], - 'Abdim7': [[1, 2, 1, 2], - [4, 5, 4, 5], - [7, 8, 7, 8], - [10, 11, 10, 11]], - 'Absus2': [[1, 3, 4, 1], - [3, 3, 4, 6], - [8, 8, 6, 6], - [8, 10, 11, 11]], - 'Absus4': [[1, 3, 4, 4], - [6, 3, 4, 4], - [6, 3, 4, 6], - [6, 8, 9, 6]], - 'Ab7sus4': [[1, 3, 2, 4], - [6, 6, 4, 6], - [8, 8, 9, 9], - [11, 13, 11, 11]], - 'Ab7alt': [[5, 2, 4, 3], - [5, 8, 8, 5]], - 'Ab+': [[1, 0, 0, 3], - [1, 4, 4, 3], - [5, 4, 4, 3], - [5, 4, 4, 7]], - 'Ab6': [[1, 3, 1, 3], - [5, 5, 4, 6], - [8, 8, 8, 8], - [10, 12, 11, 11]], - 'Ab69': [[3, 3, 1, 3], - [5, 5, 6, 6], - [8, 10, 8, 8], - [10, 12, 11, 13]], - 'Ab7': [[1, 3, 2, 3], - [5, 6, 4, 6], - [8, 8, 8, 9], - [11, 12, 11, 11]], - 'Ab7b5': [[1, 2, 2, 3], - [5, 6, 4, 5], - [7, 8, 8, 9], - [11, 12, 10, 11]], - 'Ab+7': [[1, 4, 2, 3], - [5, 6, 4, 7], - [9, 8, 8, 9], - [11, 12, 12, 11]], - 'Ab9': [[3, 3, 2, 3], - [5, 6, 6, 6], - [8, 10, 8, 9], - [11, 12, 11, 13]], - 'Ab9b5': [[3, 2, 2, 3], - [5, 6, 6, 5], - [7, 10, 8, 9], - [11, 12, 10, 13]], - 'Ab+9': [[3, 4, 2, 3], - [5, 6, 6, 7], - [9, 10, 8, 9], - [11, 12, 12, 13]], - 'Ab7b9': [[2, 3, 2, 3], - [5, 6, 5, 6], - [8, 9, 8, 9], - [11, 12, 11, 12]], - 'Ab7b9#5': [[2, 4, 2, 3], - [5, 6, 5, 7], - [9, 9, 8, 9], - [11, 12, 12, 12]], - 'Ab7#9': [[4, 3, 2, 3], - [5, 3, 2, 2], - [5, 6, 7, 6], - [8, 11, 8, 9]], - 'Ab11': [[3, 1, 2, 3], - [6, 6, 6, 3], - [5, 6, 6, 4]], - 'Ab9#11': [[3, 2, 2, 3], - [5, 6, 6, 5], - [7, 10, 8, 9], - [11, 12, 10, 13]], - 'Ab13': [[3, 5, 2, 3], - [5, 6, 6, 8], - [10, 10, 8, 9], - [11, 10, 8, 8]], - 'Ab13b5b9': [[2, 5, 2, 5], - [7, 6, 5, 8], - [11, 9, 10, 8], - [10, 9, 10, 9]], - 'Abb13b9': [[2, 4, 2, 3], - [5, 6, 5, 7], - [9, 9, 8, 9], - [11, 12, 12, 12]], - 'Abb13#9': [[5, 4, 2, 2], - [4, 4, 2, 3], - [5, 6, 7, 7], - [9, 11, 8, 9]], - 'Abmaj7': [[1, 3, 3, 3], - [5, 7, 4, 6], - [8, 8, 8, 10], - [13, 12, 11, 10]], - 'Abmaj7b5': [[1, 2, 3, 3], - [5, 7, 4, 5], - [7, 8, 8, 10], - [13, 12, 10, 10]], - 'Abmaj7#5': [[1, 4, 3, 3], - [5, 7, 4, 7], - [9, 8, 8, 10], - [13, 12, 12, 10]], - 'Abmaj9': [[3, 3, 3, 3], - [5, 7, 6, 6], - [8, 10, 8, 10], - [12, 12, 11, 13]], - 'Abmaj11': [[3, 1, 3, 3], - [5, 7, 6, 4]], - 'Abmaj13': [[0, 0, 1, 1], - [3, 5, 3, 3], - [5, 7, 6, 8], - [10, 10, 8, 10]], - 'Abm6': [[1, 3, 1, 2], - [4, 5, 4, 6], - [8, 8, 7, 8], - [10, 11, 11, 11]], - 'Abm7': [[1, 3, 2, 2], - [4, 6, 4, 6], - [8, 8, 7, 9], - [11, 11, 11, 11]], - 'Abm7b5': [[1, 2, 2, 2], - [4, 6, 4, 5], - [7, 8, 7, 9], - [11, 11, 10, 11]], - 'Abm9': [[4, 3, 2, 1], - [3, 3, 2, 2], - [4, 6, 6, 6], - [8, 10, 7, 9]], - 'Abm69': [[3, 3, 1, 2], - [4, 3, 1, 1], - [4, 5, 6, 6], - [8, 10, 7, 8]], - 'Abm9b5': [[4, 2, 2, 1], - [3, 2, 2, 2], - [4, 6, 6, 5], - [7, 10, 7, 9]], - 'Abm11': [[3, 1, 2, 2], - [4, 1, 2, 1], - [4, 6, 6, 4]], - 'Abmmaj7': [[1, 3, 3, 2], - [4, 7, 4, 6], - [8, 8, 7, 10], - [13, 11, 11, 10]], - 'Abmmaj7b5': [[1, 2, 3, 2], - [4, 7, 4, 5], - [7, 8, 7, 10], - [12, 11, 10, 11]], - 'Abmmaj9': [[4, 3, 3, 1], - [3, 3, 3, 2], - [4, 7, 6, 6], - [8, 10, 7, 10]], - 'Abmmaj11': [[3, 1, 3, 2], - [4, 1, 3, 1], - [4, 7, 6, 4]], - 'Abadd9': [[3, 3, 4, 3], - [5, 8, 6, 6], - [8, 10, 8, 11], - [13, 12, 11, 13]], - 'Abmadd9': [[4, 3, 4, 1], - [3, 3, 4, 2], - [13, 11, 11, 13]], - 'B': [[4, 3, 2, 2], - [4, 6, 7, 6], - [8, 6, 7, 6], - [11, 11, 11, 14]], - 'Bm': [[4, 2, 2, 2], - [4, 2, 2, 5], - [4, 6, 7, 5], - [7, 6, 7, 5]], - 'Bdim': [[4, 2, 1, 2], - [4, 5, 7, 5], - [7, 5, 7, 5], - [10, 11, 10, 8]], - 'Bdim7': [[1, 2, 1, 2], - [4, 5, 4, 5], - [7, 8, 7, 8], - [10, 11, 10, 11]], - 'Bsus2': [[4, 6, 7, 4], - [6, 6, 7, 9], - [11, 11, 9, 9], - [11, 13, 14, 14]], - 'Bsus4': [[4, 4, 2, 2], - [4, 6, 7, 7], - [9, 6, 7, 7], - [9, 6, 7, 9]], - 'B7sus4': [[2, 4, 2, 2], - [4, 6, 5, 7], - [9, 9, 7, 9], - [11, 11, 12, 12]], - 'B7alt': [[4, 3, 1, 2], - [4, 5, 7, 6], - [8, 5, 7, 6]], - 'B+': [[0, 3, 3, 2], - [4, 3, 3, 2], - [4, 3, 3, 6], - [4, 7, 7, 6]], - 'B6': [[1, 3, 2, 2], - [4, 6, 4, 6], - [8, 8, 7, 9], - [11, 11, 11, 11]], - 'B69': [[1, 3, 2, 4], - [6, 6, 4, 6], - [8, 8, 9, 9], - [11, 13, 11, 11]], - 'B7': [[2, 3, 2, 2], - [4, 6, 5, 6], - [8, 9, 7, 9], - [11, 11, 11, 12]], - 'B7b5': [[2, 3, 1, 2], - [4, 5, 5, 6], - [8, 9, 7, 8], - [10, 11, 11, 12]], - 'B+7': [[2, 3, 3, 2], - [4, 7, 5, 6], - [8, 9, 7, 10], - [12, 11, 11, 12]], - 'B9': [[2, 3, 2, 4], - [6, 6, 5, 6], - [8, 9, 9, 9], - [11, 13, 11, 12]], - 'B9b5': [[2, 3, 1, 4], - [6, 5, 5, 6], - [8, 9, 9, 8], - [10, 13, 11, 12]], - 'B+9': [[2, 3, 3, 4], - [6, 7, 5, 6], - [8, 9, 9, 10], - [12, 13, 11, 12]], - 'B7b9': [[2, 3, 2, 3], - [5, 6, 5, 6], - [8, 9, 8, 9], - [11, 12, 11, 12]], - 'B7b9#5': [[2, 3, 3, 3], - [5, 7, 5, 6], - [8, 9, 8, 10], - [12, 12, 11, 12]], - 'B7#9': [[2, 3, 2, 5], - [7, 6, 5, 6], - [8, 6, 5, 5], - [8, 9, 10, 9]], - 'B11': [[2, 3, 0, 4], - [6, 4, 5, 6], - [9, 9, 9, 6], - [8, 9, 9, 7]], - 'B9#11': [[2, 3, 1, 4], - [6, 5, 5, 6], - [8, 9, 9, 8], - [10, 13, 11, 12]], - 'B13': [[2, 3, 4, 4], - [6, 8, 5, 6], - [8, 9, 9, 11], - [13, 13, 11, 12]], - 'B13b9': [[2, 3, 4, 3], - [5, 8, 5, 6], - [8, 9, 8, 11], - [14, 12, 11, 11]], - 'B13b5b9': [[1, 0, 1, 0], - [2, 5, 4, 3], - [5, 8, 5, 8], - [10, 9, 8, 11]], - 'Bb13b9': [[2, 3, 3, 3], - [5, 7, 5, 6], - [8, 9, 8, 10], - [12, 12, 11, 12], - [1, 2, 3, 2], - [4, 7, 4, 5], - [7, 8, 7, 10], - [13, 11, 10, 10]], - 'Bb13#9': [[2, 3, 3, 5], - [8, 7, 5, 5], - [7, 7, 5, 6], - [8, 9, 10, 10]], - 'Bmaj7': [[4, 3, 2, 1], - [3, 3, 2, 2], - [4, 6, 6, 6], - [8, 10, 7, 9]], - 'Bmaj7b5': [[4, 3, 1, 1], - [3, 3, 1, 2], - [4, 5, 6, 6], - [8, 10, 7, 8]], - 'Bmaj7#5': [[4, 3, 3, 1], - [3, 3, 3, 2], - [4, 7, 6, 6], - [8, 10, 7, 10]], - 'Bmaj9': [[3, 3, 2, 4], - [6, 6, 6, 6], - [8, 10, 9, 9], - [11, 13, 11, 13]], - 'Bmaj11': [[3, 3, 0, 4], - [6, 4, 6, 6], - [8, 10, 9, 7]], - 'Bmaj13': [[3, 3, 4, 4], - [6, 8, 6, 6], - [8, 10, 9, 11], - [13, 13, 11, 13]], - 'Bm6': [[1, 2, 2, 2], - [4, 6, 4, 5], - [7, 8, 7, 9], - [11, 11, 10, 11]], - 'Bm7': [[2, 2, 2, 2], - [4, 6, 5, 5], - [7, 9, 7, 9], - [11, 11, 10, 12]], - 'Bm7b5': [[2, 2, 1, 2], - [4, 5, 5, 5], - [7, 9, 7, 8], - [10, 11, 10, 12]], - 'Bm9': [[2, 2, 2, 4], - [7, 6, 5, 4], - [6, 6, 5, 5], - [7, 9, 9, 9]], - 'Bm69': [[1, 2, 2, 4], - [6, 6, 4, 5], - [7, 6, 4, 4], - [7, 8, 9, 9]], - 'Bm9b5': [[2, 2, 1, 4], - [7, 5, 5, 4], - [6, 5, 5, 5], - [7, 9, 9, 8]], - 'Bm11': [[6, 4, 5, 5], - [7, 4, 5, 4], - [7, 9, 9, 7]], - 'Bmmaj7': [[4, 2, 2, 1], - [3, 2, 2, 2], - [4, 6, 6, 5], - [7, 10, 7, 9]], - 'Bmmaj7b5': [[3, 2, 1, 2], - [4, 2, 1, 1], - [4, 5, 6, 5], - [7, 10, 7, 8]], - 'Bmmaj9': [[3, 2, 2, 4], - [7, 6, 6, 4], - [6, 6, 6, 5], - [7, 10, 9, 9]], - 'Bmmaj11': [[6, 4, 6, 5], - [7, 4, 6, 4], - [7, 10, 9, 7]], - 'Badd9': [[4, 3, 2, 4], - [6, 6, 7, 6], - [8, 11, 9, 9], - [11, 13, 11, 14]], - 'Bmadd9': [[2, 0, 0, 2], - [5, 4, 5, 2], - [4, 4, 5, 3]], - 'Bb': [[3, 2, 1, 1], - [3, 5, 6, 5], - [7, 5, 6, 5], - [10, 10, 10, 13]], - 'Bbm': [[3, 1, 1, 1], - [3, 1, 1, 4], - [3, 5, 6, 4], - [6, 5, 6, 4]], - 'Bbdim': [[3, 1, 0, 1], - [3, 4, 6, 4], - [6, 4, 6, 4], - [9, 10, 9, 7]], - 'Bbdim7': [[0, 1, 0, 1], - [3, 4, 3, 4], - [6, 7, 6, 7], - [9, 10, 9, 10]], - 'Bbsus2': [[3, 5, 6, 3], - [5, 5, 6, 8], - [10, 10, 8, 8], - [10, 12, 13, 13]], - 'Bbsus4': [[3, 3, 1, 1], - [3, 5, 6, 6], - [8, 5, 6, 6], - [8, 5, 6, 8]], - 'Bb7sus4': [[1, 3, 1, 1], - [3, 5, 4, 6], - [8, 8, 6, 8], - [10, 10, 11, 11]], - 'Bb7alt': [[3, 2, 0, 1], - [3, 4, 6, 5], - [7, 4, 6, 5], - [7, 10, 10, 7]], - 'Bb+': [[3, 2, 2, 1], - [3, 2, 2, 5], - [3, 6, 6, 5], - [7, 6, 6, 9]], - 'Bb6': [[0, 2, 1, 1], - [3, 5, 3, 5], - [7, 7, 6, 8], - [10, 10, 10, 10]], - 'Bb69': [[0, 2, 1, 3], - [5, 5, 3, 5], - [7, 7, 8, 8], - [10, 12, 10, 10]], - 'Bb7': [[1, 2, 1, 1], - [3, 5, 4, 5], - [7, 8, 6, 8], - [10, 10, 10, 11]], - 'Bb7b5': [[1, 2, 0, 1], - [3, 4, 4, 5], - [7, 8, 6, 7], - [9, 10, 10, 11]], - 'Bb+7': [[1, 2, 2, 1], - [3, 6, 4, 5], - [7, 8, 6, 9], - [11, 10, 10, 11]], - 'Bb9': [[1, 2, 1, 3], - [5, 5, 4, 5], - [7, 8, 8, 8], - [10, 12, 10, 11]], - 'Bb9b5': [[1, 2, 0, 3], - [5, 4, 4, 5], - [7, 8, 8, 7], - [9, 12, 10, 11]], - 'Bb+9': [[1, 2, 2, 3], - [5, 6, 4, 5], - [7, 8, 8, 9], - [11, 12, 10, 11]], - 'Bb7b9': [[1, 2, 1, 2], - [4, 5, 4, 5], - [7, 8, 7, 8], - [10, 11, 10, 11]], - 'Bb7b9#5': [[1, 2, 2, 2], - [4, 6, 4, 5], - [7, 8, 7, 9], - [11, 11, 10, 11]], - 'Bb7#9': [[1, 2, 1, 4], - [6, 5, 4, 5], - [7, 5, 4, 4], - [7, 8, 9, 8]], - 'Bb11': [[5, 3, 4, 5], - [8, 8, 8, 5], - [7, 8, 8, 6]], - 'Bb9#11': [[1, 2, 0, 3], - [5, 4, 4, 5], - [7, 8, 8, 7], - [9, 12, 10, 11]], - 'Bb13': [[1, 2, 3, 3], - [5, 7, 4, 5], - [7, 8, 8, 10], - [12, 12, 10, 11]], - 'Bb13b5b9': [[1, 4, 3, 2], - [4, 7, 4, 7], - [9, 8, 7, 10], - [13, 11, 12, 10]], - 'Bbb13b9': [[1, 2, 2, 2], - [4, 6, 4, 5], - [7, 8, 7, 9], - [11, 11, 10, 11]], - 'Bbb13#9': [[1, 2, 2, 4], - [7, 6, 4, 4], - [6, 6, 4, 5], - [7, 8, 9, 9]], - 'Bbmaj7': [[3, 2, 1, 0], - [2, 2, 1, 1], - [3, 5, 5, 5], - [7, 9, 6, 8]], - 'Bbmaj7b5': [[3, 2, 0, 0], - [2, 2, 0, 1], - [3, 4, 5, 5], - [7, 9, 6, 7]], - 'Bbmaj7#5': [[3, 2, 2, 0], - [2, 2, 2, 1], - [3, 6, 5, 5], - [7, 9, 6, 9]], - 'Bbmaj9': [[2, 2, 1, 3], - [5, 5, 5, 5], - [7, 9, 8, 8], - [10, 12, 10, 12]], - 'Bbmaj11': [[5, 3, 5, 5], - [7, 9, 8, 6]], - 'Bbmaj13': [[2, 2, 3, 3], - [5, 7, 5, 5], - [7, 9, 8, 10], - [12, 12, 10, 12]], - 'Bbm6': [[0, 1, 1, 1], - [3, 5, 3, 4], - [6, 7, 6, 8], - [10, 10, 9, 10]], - 'Bbm7': [[1, 1, 1, 1], - [3, 5, 4, 4], - [6, 8, 6, 8], - [10, 10, 9, 11]], - 'Bbm7b5': [[1, 1, 0, 1], - [3, 4, 4, 4], - [6, 8, 6, 7], - [9, 10, 9, 11]], - 'Bbm9': [[1, 1, 1, 3], - [5, 5, 4, 4], - [6, 5, 4, 3], - [6, 8, 8, 8]], - 'Bbm69': [[0, 1, 1, 3], - [5, 5, 3, 4], - [6, 5, 3, 3], - [6, 7, 8, 8]], - 'Bbm9b5': [[1, 1, 0, 3], - [5, 4, 4, 4], - [6, 4, 4, 3], - [6, 8, 8, 7]], - 'Bbm11': [[5, 3, 4, 4], - [6, 3, 4, 3], - [6, 8, 8, 6]], - 'Bbmmaj7': [[3, 1, 1, 0], - [2, 1, 1, 1], - [3, 5, 5, 4], - [6, 9, 6, 8]], - 'Bbmmaj7b5': [[2, 1, 0, 1], - [3, 1, 0, 0], - [3, 4, 5, 4], - [6, 9, 6, 7]], - 'Bbmmaj9': [[2, 1, 1, 3], - [5, 5, 5, 4], - [6, 5, 5, 3], - [6, 9, 8, 8]], - 'Bbmmaj11': [[5, 3, 5, 4], - [6, 3, 5, 3], - [6, 9, 8, 6]], - 'Bbadd9': [[3, 2, 1, 3], - [5, 5, 6, 5], - [7, 10, 8, 8], - [10, 12, 10, 13]], - 'Bbmadd9': [[3, 1, 1, 3], - [6, 5, 6, 3], - [5, 5, 6, 4]], - 'C': [[0, 0, 0, 3], - [0, 4, 3, 3], - [5, 4, 3, 3], - [5, 7, 8, 7]], - 'Cm': [[0, 3, 3, 3], - [5, 3, 3, 3], - [5, 3, 3, 6], - [5, 7, 8, 6]], - 'Cdim': [[5, 3, 2, 3], - [5, 6, 8, 6], - [8, 6, 8, 6], - [11, 12, 11, 9]], - 'Cdim7': [[2, 3, 2, 3], - [5, 6, 5, 6], - [8, 9, 8, 9], - [11, 12, 11, 12]], - 'Csus2': [[0, 2, 3, 3], - [5, 7, 8, 5], - [7, 7, 8, 10], - [12, 12, 10, 10]], - 'Csus4': [[0, 0, 1, 3], - [5, 5, 3, 3], - [5, 7, 8, 8], - [10, 7, 8, 10]], - 'C7sus4': [[0, 0, 1, 1], - [3, 5, 3, 3], - [5, 7, 6, 8], - [10, 10, 8, 10]], - 'C7alt': [[5, 4, 2, 3], - [5, 6, 8, 7], - [9, 6, 8, 7]], - 'C+': [[1, 0, 0, 3], - [1, 4, 4, 3], - [5, 4, 4, 3], - [5, 4, 4, 7]], - 'C6': [[0, 0, 0, 0], - [2, 4, 3, 3], - [5, 7, 5, 7], - [9, 9, 8, 10]], - 'C69': [[0, 2, 0, 0], - [2, 4, 3, 5], - [7, 7, 5, 7], - [9, 9, 10, 10]], - 'C7': [[0, 0, 0, 1], - [3, 4, 3, 3], - [5, 7, 6, 7], - [9, 10, 8, 10]], - 'C7b5': [[3, 4, 2, 3], - [5, 6, 6, 7], - [9, 10, 8, 9], - [11, 12, 12, 13]], - 'C+7': [[1, 0, 0, 1], - [3, 4, 4, 3], - [5, 8, 6, 7], - [9, 10, 8, 11]], - 'C9': [[0, 2, 0, 1], - [3, 4, 3, 5], - [7, 7, 6, 7], - [9, 10, 10, 10]], - 'C9b5': [[3, 4, 2, 5], - [7, 6, 6, 7], - [9, 10, 10, 9], - [11, 14, 12, 13]], - 'C+9': [[1, 2, 0, 1], - [3, 4, 4, 5], - [7, 8, 6, 7], - [9, 10, 10, 11]], - 'C7b9': [[0, 1, 0, 1], - [3, 4, 3, 4], - [6, 7, 6, 7], - [9, 10, 9, 10]], - 'C7b9#5': [[1, 1, 0, 1], - [3, 4, 4, 4], - [6, 8, 6, 7], - [9, 10, 9, 11]], - 'C7#9': [[0, 3, 0, 1], - [3, 4, 3, 6], - [8, 7, 6, 7], - [9, 7, 6, 6]], - 'C11': [[7, 5, 6, 7]], - 'C9#11': [[3, 4, 2, 5], - [7, 6, 6, 7], - [9, 10, 10, 9], - [11, 14, 12, 13]], - 'C13': [[2, 2, 0, 1], - [3, 2, 0, 0], - [3, 4, 5, 5], - [7, 9, 6, 7]], - 'C13b9': [[2, 1, 0, 1], - [3, 1, 0, 0], - [3, 4, 5, 4], - [6, 9, 6, 7]], - 'C13b5b9': [[2, 1, 2, 1], - [3, 1, 2, 0], - [3, 6, 5, 4]], - 'Cb13b9': [[1, 1, 0, 1], - [3, 4, 4, 4], - [6, 8, 6, 7], - [9, 10, 9, 11]], - 'Cb13#9': [[1, 3, 0, 1], - [3, 4, 4, 6], - [9, 8, 6, 6], - [8, 8, 6, 7]], - 'Cmaj7': [[0, 0, 0, 2], - [5, 4, 3, 2], - [4, 4, 3, 3], - [5, 7, 7, 7]], - 'Cmaj7b5': [[5, 4, 2, 2], - [4, 4, 2, 3], - [5, 6, 7, 7], - [9, 11, 8, 9]], - 'Cmaj7#5': [[1, 0, 0, 2], - [5, 4, 4, 2], - [4, 4, 4, 3], - [5, 8, 7, 7]], - 'Cmaj9': [[0, 2, 0, 2], - [4, 4, 3, 5], - [7, 7, 7, 7], - [9, 11, 10, 10]], - 'Cmaj11': [[7, 5, 7, 7], - [9, 11, 10, 8]], - 'Cmaj13': [[2, 2, 0, 2], - [4, 4, 5, 5], - [7, 9, 7, 7], - [9, 11, 10, 12]], - 'Cm6': [[2, 3, 3, 3], - [5, 7, 5, 6], - [8, 9, 8, 10], - [12, 12, 11, 12]], - 'Cm7': [[3, 3, 3, 3], - [5, 7, 6, 6], - [8, 10, 8, 10], - [12, 12, 11, 13]], - 'Cm7b5': [[3, 3, 2, 3], - [5, 6, 6, 6], - [8, 10, 8, 9], - [11, 12, 11, 13]], - 'Cm9': [[3, 3, 3, 5], - [8, 7, 6, 5], - [7, 7, 6, 6], - [8, 10, 10, 10]], - 'Cm69': [[2, 3, 3, 5], - [7, 7, 5, 6], - [8, 7, 5, 5], - [8, 9, 10, 10]], - 'Cm9b5': [[3, 3, 2, 5], - [8, 6, 6, 5], - [7, 6, 6, 6], - [8, 10, 10, 9]], - 'Cm11': [[7, 5, 6, 6], - [8, 5, 6, 5], - [8, 10, 10, 8]], - 'Cmmaj7': [[5, 3, 3, 2], - [4, 3, 3, 3], - [5, 7, 7, 6], - [8, 11, 8, 10]], - 'Cmmaj7b5': [[4, 3, 2, 3], - [5, 3, 2, 2], - [5, 6, 7, 6]], - 'Cmmaj9': [[4, 3, 3, 5], - [8, 7, 7, 5], - [7, 7, 7, 6], - [8, 11, 10, 10]], - 'Cmmaj11': [[7, 5, 7, 6], - [8, 5, 7, 5], - [8, 11, 10, 8]], - 'Cadd9': [[0, 2, 0, 3], - [5, 4, 3, 5], - [7, 7, 8, 7], - [9, 12, 10, 10]], - 'Cmadd9': [[5, 3, 3, 5], - [8, 7, 8, 5], - [7, 7, 8, 6]], - 'D': [[2, 2, 2, 0], - [2, 2, 2, 5], - [7, 6, 5, 5], - [7, 9, 10, 9]], - 'Dm': [[2, 2, 1, 0], - [2, 5, 5, 5], - [7, 5, 5, 5], - [7, 5, 5, 8]], - 'Ddim': [[7, 5, 4, 5], - [7, 8, 10, 8], - [10, 8, 10, 8], - [13, 14, 13, 11]], - 'Ddim7': [[1, 2, 1, 2], - [4, 5, 4, 5], - [7, 8, 7, 8], - [10, 11, 10, 11]], - 'Dsus2': [[2, 4, 5, 5], - [7, 9, 10, 7], - [9, 9, 10, 12], - [14, 14, 12, 12]], - 'Dsus4': [[0, 2, 3, 0], - [2, 2, 3, 0], - [2, 2, 3, 5], - [7, 7, 5, 5]], - 'D7sus4': [[2, 2, 3, 3], - [5, 7, 5, 5], - [7, 9, 8, 10], - [12, 12, 10, 12]], - 'D7alt': [[7, 6, 4, 5], - [7, 8, 10, 9], - [11, 8, 10, 9]], - 'D+': [[3, 2, 2, 1], - [3, 2, 2, 5], - [3, 6, 6, 5], - [7, 6, 6, 9]], - 'D6': [[2, 2, 2, 2], - [4, 6, 5, 5], - [7, 9, 7, 9], - [11, 11, 10, 12]], - 'D69': [[2, 4, 2, 2], - [4, 6, 5, 7], - [9, 9, 7, 9], - [11, 11, 12, 12]], - 'D7': [[2, 2, 2, 3], - [5, 6, 5, 5], - [7, 9, 8, 9], - [11, 12, 10, 12]], - 'D7b5': [[1, 2, 2, 3], - [5, 6, 4, 5], - [7, 8, 8, 9], - [11, 12, 10, 11]], - 'D+7': [[3, 2, 2, 3], - [5, 6, 6, 5], - [7, 10, 8, 9], - [11, 12, 10, 13]], - 'D9': [[2, 4, 2, 3], - [5, 6, 5, 7], - [9, 9, 8, 9], - [11, 12, 12, 12]], - 'D9b5': [[1, 4, 2, 3], - [5, 6, 4, 7], - [9, 8, 8, 9], - [11, 12, 12, 11]], - 'D+9': [[3, 4, 2, 3], - [5, 6, 6, 7], - [9, 10, 8, 9]], - 'D7b9': [[2, 3, 2, 3], - [5, 6, 5, 6], - [8, 9, 8, 9], - [11, 12, 11, 12]], - 'D7b9#5': [[3, 3, 2, 3], - [5, 6, 6, 6], - [8, 10, 8, 9], - [11, 12, 11, 13]], - 'D7#9': [[2, 5, 2, 3], - [5, 6, 5, 8], - [10, 9, 8, 9], - [11, 9, 8, 8]], - 'D11': [[0, 4, 2, 3], - [9, 7, 8, 9]], - 'D9#11': [[1, 4, 2, 3], - [5, 6, 4, 7], - [9, 8, 8, 9], - [11, 12, 12, 11]], - 'D13': [[4, 4, 2, 3], - [5, 4, 2, 2], - [5, 6, 7, 7], - [9, 11, 8, 9]], - 'D13b9': [[5, 3, 2, 2], - [4, 3, 2, 3], - [5, 6, 7, 6], - [8, 11, 8, 9]], - 'D13b5b9': [[5, 3, 4, 2], - [4, 3, 4, 3], - [5, 8, 7, 6]], - 'Db13b9': [[3, 3, 2, 3], - [5, 6, 6, 6], - [8, 10, 8, 9], - [11, 12, 11, 13], - [4, 2, 1, 1], - [3, 2, 1, 2], - [4, 5, 6, 5], - [7, 10, 7, 8]], - 'Db13#9': [[3, 5, 2, 3], - [5, 6, 6, 8], - [11, 10, 8, 8], - [10, 10, 8, 9]], - 'Dmaj7': [[2, 2, 2, 4], - [7, 6, 5, 4], - [6, 6, 5, 5], - [7, 9, 9, 9]], - 'Dmaj7b5': [[1, 2, 2, 4], - [7, 6, 4, 4], - [6, 6, 4, 5], - [7, 8, 9, 9]], - 'Dmaj7#5': [[3, 2, 2, 4], - [7, 6, 6, 4], - [6, 6, 6, 5], - [7, 10, 9, 9]], - 'Dmaj9': [[2, 4, 2, 4], - [6, 6, 5, 7], - [9, 9, 9, 9], - [11, 13, 12, 12]], - 'Dmaj11': [[0, 4, 2, 4], - [9, 7, 9, 9], - [11, 13, 12, 10]], - 'Dmaj13': [[4, 4, 2, 4], - [6, 6, 7, 7], - [9, 11, 9, 9], - [11, 13, 12, 14]], - 'Dm6': [[2, 2, 1, 2], - [4, 5, 5, 5], - [7, 9, 7, 8], - [10, 11, 10, 12]], - 'Dm7': [[2, 2, 1, 3], - [5, 5, 5, 5], - [7, 9, 8, 8], - [10, 12, 10, 12]], - 'Dm7b5': [[1, 2, 1, 3], - [5, 5, 4, 5], - [7, 8, 8, 8], - [10, 12, 10, 11]], - 'Dm9': [[2, 4, 1, 3], - [5, 5, 5, 7], - [10, 9, 8, 7], - [9, 9, 8, 8]], - 'Dm69': [[2, 4, 1, 2], - [4, 5, 5, 7], - [9, 9, 7, 8], - [10, 9, 7, 7]], - 'Dm9b5': [[1, 4, 1, 3], - [5, 5, 4, 7], - [10, 8, 8, 7], - [9, 8, 8, 8]], - 'Dm11': [[9, 7, 8, 8], - [10, 7, 8, 7], - [10, 12, 12, 10]], - 'Dmmaj7': [[2, 2, 1, 4], - [7, 5, 5, 4], - [6, 5, 5, 5], - [7, 9, 9, 8]], - 'Dmmaj7b5': [[1, 2, 1, 4], - [6, 5, 4, 5], - [7, 5, 4, 4], - [7, 8, 9, 8]], - 'Dmmaj9': [[2, 4, 1, 4], - [6, 5, 5, 7], - [10, 9, 9, 7], - [9, 9, 9, 8]], - 'Dmmaj11': [[9, 7, 9, 8], - [10, 7, 9, 7], - [10, 13, 12, 10]], - 'Dadd9': [[2, 4, 2, 5], - [7, 6, 5, 7], - [9, 9, 10, 9], - [11, 14, 12, 12]], - 'Dmadd9': [[7, 5, 5, 7], - [10, 9, 10, 7], - [9, 9, 10, 8]], - 'Db': [[1, 1, 1, 4], - [6, 5, 4, 4], - [6, 8, 9, 8], - [10, 8, 9, 8]], - 'Dbm': [[1, 4, 4, 4], - [6, 4, 4, 4], - [6, 4, 4, 7], - [6, 8, 9, 7]], - 'Dbdim': [[6, 4, 3, 4], - [6, 7, 9, 7], - [9, 7, 9, 7], - [12, 13, 12, 10]], - 'Dbdim7': [[0, 1, 0, 1], - [3, 4, 3, 4], - [6, 7, 6, 7], - [9, 10, 9, 10]], - 'Dbsus2': [[1, 3, 4, 4], - [6, 8, 9, 6], - [8, 8, 9, 11], - [13, 13, 11, 11]], - 'Dbsus4': [[1, 1, 2, 4], - [6, 6, 4, 4], - [6, 8, 9, 9], - [11, 8, 9, 11]], - 'Db7sus4': [[1, 1, 2, 2], - [4, 6, 4, 4], - [6, 8, 7, 9], - [11, 11, 9, 11]], - 'Db7alt': [[0, 1, 1, 4], - [6, 5, 3, 4], - [6, 7, 9, 8], - [10, 7, 9, 8]], - 'Db+': [[2, 1, 1, 0], - [2, 1, 1, 4], - [2, 5, 5, 4], - [6, 5, 5, 4]], - 'Db6': [[1, 1, 1, 1], - [3, 5, 4, 4], - [6, 8, 6, 8], - [10, 10, 9, 11]], - 'Db69': [[1, 3, 1, 1], - [3, 5, 4, 6], - [8, 8, 6, 8], - [10, 10, 11, 11]], - 'Db7': [[1, 1, 1, 2], - [4, 5, 4, 4], - [6, 8, 7, 8], - [10, 11, 9, 11]], - 'Db7b5': [[0, 1, 1, 2], - [4, 5, 3, 4], - [6, 7, 7, 8], - [10, 11, 9, 10]], - 'Db+7': [[2, 1, 1, 2], - [4, 5, 5, 4], - [6, 9, 7, 8], - [10, 11, 9, 12]], - 'Db9': [[1, 3, 1, 2], - [4, 5, 4, 6], - [8, 8, 7, 8], - [10, 11, 11, 11]], - 'Db9b5': [[0, 3, 1, 2], - [4, 5, 3, 6], - [8, 7, 7, 8], - [10, 11, 11, 10]], - 'Db+9': [[2, 3, 1, 2], - [4, 3, 1, 0], - [4, 5, 5, 6], - [8, 9, 7, 8]], - 'Db7b9': [[1, 2, 1, 2], - [4, 5, 4, 5], - [7, 8, 7, 8], - [10, 11, 10, 11]], - 'Db7b9#5': [[2, 2, 1, 2], - [4, 5, 5, 5], - [7, 9, 7, 8], - [10, 11, 10, 12]], - 'Db7#9': [[1, 4, 1, 2], - [4, 5, 4, 7], - [9, 8, 7, 8], - [10, 8, 7, 7]], - 'Db11': [[8, 6, 7, 8]], - 'Db9#11': [[0, 3, 1, 2], - [4, 5, 3, 6], - [8, 7, 7, 8], - [10, 11, 11, 10]], - 'Db13': [[3, 3, 1, 2], - [4, 3, 1, 1], - [4, 5, 6, 6], - [8, 10, 7, 8]], - 'Db13b5b9': [[4, 2, 3, 1], - [3, 2, 3, 2], - [4, 7, 6, 5]], - 'Dbb13b9': [[2, 2, 1, 2], - [4, 5, 5, 5], - [7, 9, 7, 8], - [10, 11, 10, 12]], - 'Dbb13#9': [[2, 4, 1, 2], - [4, 5, 5, 7], - [10, 9, 7, 7], - [9, 9, 7, 8]], - 'Dbmaj7': [[1, 1, 1, 3], - [5, 5, 4, 4], - [6, 5, 4, 3], - [6, 8, 8, 8]], - 'Dbmaj7b5': [[0, 1, 1, 3], - [5, 5, 3, 4], - [6, 5, 3, 3], - [6, 7, 8, 8]], - 'Dbmaj7#5': [[2, 1, 1, 3], - [5, 5, 5, 4], - [6, 5, 5, 3], - [6, 9, 8, 8]], - 'Dbmaj9': [[1, 3, 1, 3], - [5, 5, 4, 6], - [8, 8, 8, 8], - [10, 12, 11, 11]], - 'Dbmaj11': [[8, 6, 8, 8], - [10, 12, 11, 9]], - 'Dbmaj13': [[3, 3, 1, 3], - [5, 5, 6, 6], - [8, 10, 8, 8], - [10, 12, 11, 13]], - 'Dbm6': [[1, 1, 0, 1], - [3, 4, 4, 4], - [6, 8, 6, 7], - [9, 10, 9, 11]], - 'Dbm7': [[1, 1, 0, 2], - [4, 4, 4, 4], - [6, 8, 7, 7], - [9, 11, 9, 11]], - 'Dbm7b5': [[0, 1, 0, 2], - [4, 4, 3, 4], - [6, 7, 7, 7], - [9, 11, 9, 10]], - 'Dbm9': [[1, 3, 0, 2], - [4, 4, 4, 6], - [9, 8, 7, 6], - [8, 8, 7, 7]], - 'Dbm69': [[1, 3, 0, 1], - [3, 4, 4, 6], - [8, 8, 6, 7], - [9, 8, 6, 6]], - 'Dbm9b5': [[0, 3, 0, 2], - [4, 4, 3, 6], - [9, 7, 7, 6], - [8, 7, 7, 7]], - 'Dbm11': [[8, 6, 7, 7], - [9, 6, 7, 6], - [9, 11, 11, 9]], - 'Dbmmaj7': [[1, 1, 0, 3], - [5, 4, 4, 4], - [6, 4, 4, 3], - [6, 8, 8, 7]], - 'Dbmmaj7b5': [[0, 1, 0, 3], - [5, 4, 3, 4], - [6, 4, 3, 3], - [6, 7, 8, 7]], - 'Dbmmaj9': [[1, 3, 0, 3], - [5, 4, 4, 6], - [9, 8, 8, 6], - [8, 8, 8, 7]], - 'Dbmmaj11': [[8, 6, 8, 7], - [9, 6, 8, 6], - [9, 12, 11, 9]], - 'Dbadd9': [[1, 3, 1, 4], - [6, 5, 4, 6], - [8, 8, 9, 8], - [10, 13, 11, 11]], - 'Dbmadd9': [[6, 4, 4, 6], - [9, 8, 9, 6], - [8, 8, 9, 7]], - 'E': [[1, 4, 0, 2], - [4, 4, 4, 2], - [4, 4, 4, 7], - [9, 8, 7, 7]], - 'Em': [[0, 4, 3, 2], - [4, 4, 3, 2], - [4, 7, 7, 7], - [9, 7, 7, 7]], - 'Edim': [[3, 4, 3, 1], - [9, 7, 6, 7], - [9, 10, 12, 10], - [12, 10, 12, 10]], - 'Edim7': [[0, 1, 0, 1], - [3, 4, 3, 4], - [6, 7, 6, 7], - [9, 10, 9, 10]], - 'Esus2': [[4, 4, 2, 2], - [4, 6, 7, 7], - [9, 11, 12, 9], - [11, 11, 12, 14]], - 'Esus4': [[2, 4, 5, 2], - [4, 4, 5, 2], - [4, 4, 5, 7], - [9, 9, 7, 7]], - 'E7sus4': [[2, 2, 0, 2], - [4, 4, 5, 5], - [7, 9, 7, 7], - [9, 11, 10, 12]], - 'E7alt': [[9, 8, 6, 7], - [9, 10, 12, 11], - [13, 10, 12, 11]], - 'E+': [[1, 0, 0, 3], - [1, 4, 4, 3], - [5, 4, 4, 3], - [5, 4, 4, 7]], - 'E6': [[1, 1, 0, 2], - [4, 4, 4, 4], - [6, 8, 7, 7], - [9, 11, 9, 11]], - 'E69': [[1, 1, 2, 2], - [4, 6, 4, 4], - [6, 8, 7, 9], - [11, 11, 9, 11]], - 'E7': [[1, 2, 0, 2], - [4, 4, 4, 5], - [7, 8, 7, 7], - [9, 11, 10, 11]], - 'E7b5': [[1, 2, 0, 1], - [3, 4, 4, 5], - [7, 8, 6, 7], - [9, 10, 10, 11]], - 'E+7': [[1, 2, 0, 3], - [5, 4, 4, 5], - [7, 8, 8, 7], - [9, 12, 10, 11]], - 'E9': [[1, 2, 2, 2], - [4, 6, 4, 5], - [7, 8, 7, 9], - [11, 11, 10, 11]], - 'E9b5': [[1, 2, 2, 1], - [3, 6, 4, 5], - [7, 8, 6, 9], - [11, 10, 10, 11]], - 'E+9': [[1, 2, 2, 3], - [5, 6, 4, 5], - [7, 8, 8, 9], - [11, 12, 10, 11]], - 'E7b9': [[1, 2, 1, 2], - [4, 5, 4, 5], - [7, 8, 7, 8], - [10, 11, 10, 11]], - 'E7b9#5': [[1, 2, 1, 3], - [5, 5, 4, 5], - [7, 8, 8, 8], - [10, 12, 10, 11]], - 'E7#9': [[1, 2, 3, 2], - [4, 7, 4, 5], - [7, 8, 7, 10], - [12, 11, 10, 11]], - 'E11': [[1, 2, 2, 0]], - 'E9#11': [[1, 2, 2, 1], - [3, 6, 4, 5], - [7, 8, 6, 9], - [11, 10, 10, 11]], - 'E13': [[1, 2, 2, 4], - [6, 6, 4, 5], - [7, 6, 4, 4], - [7, 8, 9, 9]], - 'E13b9': [[1, 2, 1, 4], - [7, 5, 4, 4], - [6, 5, 4, 5], - [10, 13, 10, 11]], - 'E13b5b9': [[3, 2, 1, 4], - [7, 5, 6, 4], - [6, 5, 6, 5], - [7, 10, 9, 8]], - 'Eb13b9': [[1, 2, 1, 3], - [5, 5, 4, 5], - [7, 8, 8, 8], - [10, 12, 10, 11], - [0, 1, 0, 3], - [5, 4, 3, 4], - [6, 4, 3, 3], - [9, 12, 9, 10]], - 'Eb13#9': [[1, 2, 3, 3], - [5, 7, 4, 5], - [7, 8, 8, 10], - [13, 12, 10, 10]], - 'Emaj7': [[1, 3, 0, 2], - [4, 4, 4, 6], - [9, 8, 7, 6], - [8, 8, 7, 7]], - 'Emaj7b5': [[1, 3, 0, 1], - [3, 4, 4, 6], - [9, 8, 6, 6], - [8, 8, 6, 7]], - 'Emaj7#5': [[1, 3, 0, 3], - [5, 4, 4, 6], - [9, 8, 8, 6], - [8, 8, 8, 7]], - 'Emaj9': [[1, 3, 2, 2], - [4, 6, 4, 6], - [8, 8, 7, 9], - [11, 11, 11, 11]], - 'Emaj11': [[1, 3, 2, 0], - [11, 9, 11, 11]], - 'Emaj13': [[1, 3, 2, 4], - [6, 6, 4, 6], - [8, 8, 9, 9], - [11, 13, 11, 11]], - 'Em6': [[0, 1, 0, 2], - [4, 4, 3, 4], - [6, 7, 7, 7], - [9, 11, 9, 10]], - 'Em7': [[0, 2, 0, 2], - [4, 4, 3, 5], - [7, 7, 7, 7], - [9, 11, 10, 10]], - 'Em7b5': [[0, 2, 0, 1], - [3, 4, 3, 5], - [7, 7, 6, 7], - [9, 10, 10, 10]], - 'Em9': [[0, 2, 2, 2], - [4, 6, 3, 5], - [7, 7, 7, 9], - [12, 11, 10, 9]], - 'Em69': [[0, 1, 2, 2], - [4, 6, 3, 4], - [6, 7, 7, 9], - [11, 11, 9, 10]], - 'Em9b5': [[0, 2, 2, 1], - [3, 6, 3, 5], - [7, 7, 6, 9], - [12, 10, 10, 9]], - 'Em11': [[0, 2, 2, 0], - [11, 9, 10, 10], - [12, 9, 10, 9]], - 'Emmaj7': [[0, 3, 0, 2], - [4, 4, 3, 6], - [9, 7, 7, 6], - [8, 7, 7, 7]], - 'Emmaj7b5': [[0, 3, 0, 1], - [3, 4, 3, 6], - [8, 7, 6, 7], - [9, 7, 6, 6]], - 'Emmaj9': [[0, 3, 2, 2], - [4, 6, 3, 6], - [8, 7, 7, 9], - [12, 11, 11, 9]], - 'Emmaj11': [[0, 3, 2, 0], - [11, 9, 11, 10], - [12, 9, 11, 9]], - 'Eadd9': [[1, 4, 2, 2], - [4, 6, 4, 7], - [9, 8, 7, 9], - [11, 11, 12, 11]], - 'Emadd9': [[9, 7, 7, 9], - [12, 11, 12, 9], - [11, 11, 12, 10]], - 'Eb': [[0, 3, 3, 1], - [3, 3, 3, 1], - [3, 3, 3, 6], - [8, 7, 6, 6]], - 'Ebm': [[3, 3, 2, 1], - [3, 6, 6, 6], - [8, 6, 6, 6], - [8, 6, 6, 9]], - 'Ebdim': [[2, 3, 2, 0], - [8, 6, 5, 6], - [8, 9, 11, 9], - [11, 9, 11, 9]], - 'Ebdim7': [[2, 3, 2, 3], - [5, 6, 5, 6], - [8, 9, 8, 9], - [11, 12, 11, 12]], - 'Ebsus2': [[3, 3, 1, 1], - [3, 5, 6, 6], - [8, 10, 11, 8], - [10, 10, 11, 13]], - 'Ebsus4': [[1, 3, 4, 1], - [3, 3, 4, 1], - [3, 3, 4, 6], - [8, 8, 6, 6]], - 'Eb7sus4': [[3, 3, 4, 4], - [6, 8, 6, 6], - [8, 10, 9, 11], - [13, 13, 11, 13]], - 'Eb7alt': [[8, 7, 5, 6], - [8, 9, 11, 10], - [12, 9, 11, 10]], - 'Eb+': [[0, 3, 3, 2], - [4, 3, 3, 2], - [4, 3, 3, 6], - [4, 7, 7, 6]], - 'Eb6': [[3, 3, 3, 3], - [5, 7, 6, 6], - [8, 10, 8, 10], - [12, 12, 11, 13]], - 'Eb69': [[0, 0, 1, 1], - [3, 5, 3, 3], - [5, 7, 6, 8], - [10, 10, 8, 10]], - 'Eb7': [[3, 3, 3, 4], - [6, 7, 6, 6], - [8, 10, 9, 10], - [12, 13, 11, 13]], - 'Eb7b5': [[2, 3, 3, 4], - [6, 7, 5, 6], - [8, 9, 9, 10], - [12, 13, 11, 12]], - 'Eb+7': [[4, 3, 3, 4], - [6, 7, 7, 6], - [8, 11, 9, 10], - [12, 13, 11, 14]], - 'Eb9': [[0, 1, 1, 1], - [3, 5, 3, 4], - [6, 7, 6, 8], - [10, 10, 9, 10]], - 'Eb9b5': [[0, 1, 1, 0], - [2, 5, 3, 4], - [6, 7, 5, 8], - [10, 9, 9, 10]], - 'Eb+9': [[0, 1, 1, 2], - [4, 5, 3, 4], - [6, 7, 7, 8], - [10, 11, 9, 10]], - 'Eb7b9': [[0, 1, 0, 1], - [3, 4, 3, 4], - [6, 7, 6, 7], - [9, 10, 9, 10]], - 'Eb7b9#5': [[0, 1, 0, 2], - [4, 4, 3, 4], - [6, 7, 7, 7], - [9, 11, 9, 10]], - 'Eb7#9': [[0, 1, 2, 1], - [3, 6, 3, 4], - [6, 7, 6, 9], - [11, 10, 9, 10]], - 'Eb11': [[10, 8, 9, 10]], - 'Eb9#11': [[0, 1, 1, 0], - [2, 5, 3, 4], - [6, 7, 5, 8], - [10, 9, 9, 10]], - 'Eb13': [[0, 1, 1, 3], - [5, 5, 3, 4], - [6, 5, 3, 3], - [6, 7, 8, 8]], - 'Eb13b5b9': [[2, 1, 0, 3], - [5, 4, 5, 4], - [6, 4, 5, 3], - [6, 9, 8, 7]], - 'Ebb13b9': [[0, 1, 0, 2], - [4, 4, 3, 4], - [6, 7, 7, 7], - [9, 11, 9, 10]], - 'Ebb13#9': [[0, 1, 2, 2], - [4, 6, 3, 4], - [6, 7, 7, 9], - [12, 11, 9, 9]], - 'Ebmaj7': [[3, 3, 3, 5], - [8, 7, 6, 5], - [7, 7, 6, 6], - [8, 10, 10, 10]], - 'Ebmaj7b5': [[2, 3, 3, 5], - [8, 7, 5, 5], - [7, 7, 5, 6], - [8, 9, 10, 10]], - 'Ebmaj7#5': [[4, 3, 3, 5], - [8, 7, 7, 5], - [7, 7, 7, 6], - [8, 11, 10, 10]], - 'Ebmaj9': [[0, 2, 1, 1], - [3, 5, 3, 5], - [7, 7, 6, 8], - [10, 10, 10, 10]], - 'Ebmaj11': [[10, 8, 10, 10], - [12, 14, 13, 11]], - 'Ebmaj13': [[0, 2, 1, 3], - [5, 5, 3, 5], - [7, 7, 8, 8], - [10, 12, 10, 10]], - 'Ebm6': [[3, 3, 2, 3], - [5, 6, 6, 6], - [8, 10, 8, 9], - [11, 12, 11, 13]], - 'Ebm7': [[3, 3, 2, 4], - [6, 6, 6, 6], - [8, 10, 9, 9], - [11, 13, 11, 13]], - 'Ebm7b5': [[2, 3, 2, 4], - [6, 6, 5, 6], - [8, 9, 9, 9], - [11, 13, 11, 12]], - 'Ebm9': [[3, 5, 2, 4], - [6, 6, 6, 8], - [11, 10, 9, 8], - [10, 10, 9, 9]], - 'Ebm69': [[3, 5, 2, 3], - [5, 6, 6, 8], - [10, 10, 8, 9], - [11, 10, 8, 8]], - 'Ebm9b5': [[2, 5, 2, 4], - [6, 6, 5, 8], - [11, 9, 9, 8], - [10, 9, 9, 9]], - 'Ebm11': [[10, 8, 9, 9], - [11, 8, 9, 8], - [11, 13, 13, 11]], - 'Ebmmaj7': [[3, 3, 2, 5], - [8, 6, 6, 5], - [7, 6, 6, 6], - [8, 10, 10, 9]], - 'Ebmmaj7b5': [[2, 3, 2, 5], - [7, 6, 5, 6], - [8, 6, 5, 5], - [8, 9, 10, 9]], - 'Ebmmaj9': [[3, 5, 2, 5], - [7, 6, 6, 8], - [11, 10, 10, 8], - [10, 10, 10, 9]], - 'Ebmmaj11': [[10, 8, 10, 9], - [11, 8, 10, 8], - [11, 14, 13, 11]], - 'Ebadd9': [[0, 3, 1, 1], - [3, 5, 3, 6], - [8, 7, 6, 8], - [10, 10, 11, 10]], - 'Ebmadd9': [[8, 6, 6, 8], - [11, 10, 11, 8], - [10, 10, 11, 9]], - 'F': [[2, 0, 1, 0], - [2, 0, 1, 3], - [5, 5, 5, 8], - [10, 9, 8, 8]], - 'Fm': [[1, 0, 1, 3], - [5, 5, 4, 3], - [5, 8, 8, 8], - [10, 8, 8, 8]], - 'Fdim': [[4, 5, 4, 2], - [10, 8, 7, 8], - [10, 11, 13, 11], - [13, 11, 13, 11]], - 'Fdim7': [[1, 2, 1, 2], - [4, 5, 4, 5], - [7, 8, 7, 8], - [10, 11, 10, 11]], - 'Fsus2': [[0, 0, 1, 3], - [5, 5, 3, 3], - [5, 7, 8, 8], - [10, 12, 13, 10]], - 'Fsus4': [[3, 0, 1, 1], - [3, 0, 1, 3], - [3, 5, 6, 3], - [5, 5, 6, 3]], - 'F7sus4': [[3, 3, 1, 3], - [5, 5, 6, 6], - [8, 10, 8, 8], - [10, 12, 11, 13]], - 'F7alt': [[2, 5, 5, 2], - [10, 9, 7, 8], - [10, 11, 13, 12]], - 'F+': [[2, 1, 1, 0], - [2, 1, 1, 4], - [2, 5, 5, 4], - [6, 5, 5, 8]], - 'F6': [[2, 2, 1, 3], - [5, 5, 5, 5], - [7, 9, 8, 8], - [10, 12, 10, 12]], - 'F69': [[2, 2, 3, 3], - [5, 7, 5, 5], - [7, 9, 8, 10], - [12, 12, 10, 12]], - 'F7': [[2, 3, 1, 3], - [5, 5, 5, 6], - [8, 9, 8, 8], - [10, 12, 11, 12]], - 'F7b5': [[2, 3, 1, 2], - [4, 5, 5, 6], - [8, 9, 7, 8], - [10, 11, 11, 12]], - 'F+7': [[2, 3, 1, 4], - [6, 5, 5, 6], - [8, 9, 9, 8], - [10, 13, 11, 12]], - 'F9': [[2, 3, 3, 3], - [5, 7, 5, 6], - [8, 9, 8, 10], - [12, 12, 11, 12]], - 'F9b5': [[2, 3, 3, 2], - [4, 7, 5, 6], - [8, 9, 7, 10], - [12, 11, 11, 12]], - 'F+9': [[2, 3, 3, 4], - [6, 7, 5, 6], - [8, 9, 9, 10], - [12, 13, 11, 12]], - 'F7b9': [[2, 3, 2, 3], - [5, 6, 5, 6], - [8, 9, 8, 9], - [11, 12, 11, 12]], - 'F7b9#5': [[2, 3, 2, 4], - [6, 6, 5, 6], - [8, 9, 9, 9], - [11, 13, 11, 12]], - 'F7#9': [[2, 3, 4, 3], - [5, 8, 5, 6], - [8, 9, 8, 11], - [13, 12, 11, 12]], - 'F11': [[1, 2, 2, 0]], - 'F9#11': [[2, 3, 3, 2], - [4, 7, 5, 6], - [8, 9, 7, 10], - [12, 11, 11, 12]], - 'F13': [[2, 3, 3, 5], - [7, 7, 5, 6], - [8, 7, 5, 5], - [8, 9, 10, 10]], - 'F13b9': [[2, 3, 2, 5], - [8, 6, 5, 5], - [8, 9, 10, 9], - [11, 14, 11, 12]], - 'F13b5b9': [[4, 3, 2, 5], - [8, 6, 7, 5], - [7, 6, 7, 6], - [8, 11, 10, 9]], - 'Fb13b9': [[2, 3, 2, 4], - [6, 6, 5, 6], - [8, 9, 9, 9], - [11, 13, 11, 12]], - 'Fb13#9': [[2, 3, 4, 4], - [6, 8, 5, 6], - [8, 9, 9, 11], - [14, 13, 11, 11]], - 'Fmaj7': [[2, 4, 1, 3], - [5, 5, 5, 7], - [10, 9, 8, 7], - [9, 9, 8, 8]], - 'Fmaj7b5': [[2, 4, 1, 2], - [4, 5, 5, 7], - [10, 9, 7, 7], - [9, 9, 7, 8]], - 'Fmaj7#5': [[2, 4, 1, 4], - [6, 5, 5, 7], - [10, 9, 9, 7], - [9, 9, 9, 8]], - 'Fmaj9': [[0, 0, 0, 0], - [2, 4, 3, 3], - [5, 7, 5, 7], - [9, 9, 8, 10]], - 'Fmaj11': [[2, 4, 3, 1], - [12, 10, 12, 12]], - 'Fmaj13': [[0, 2, 0, 0], - [2, 4, 3, 5], - [7, 7, 5, 7], - [9, 9, 10, 10]], - 'Fm6': [[1, 2, 1, 3], - [5, 5, 4, 5], - [7, 8, 8, 8], - [10, 12, 10, 11]], - 'Fm7': [[1, 3, 1, 3], - [5, 5, 4, 6], - [8, 8, 8, 8], - [10, 12, 11, 11]], - 'Fm7b5': [[1, 3, 1, 2], - [4, 5, 4, 6], - [8, 8, 7, 8], - [10, 11, 11, 11]], - 'Fm9': [[1, 3, 3, 3], - [5, 7, 4, 6], - [8, 8, 8, 10], - [13, 12, 11, 10]], - 'Fm69': [[1, 2, 3, 3], - [5, 7, 4, 5], - [7, 8, 8, 10], - [12, 12, 10, 11]], - 'Fm9b5': [[1, 3, 3, 2], - [4, 7, 4, 6], - [8, 8, 7, 10], - [13, 11, 11, 10]], - 'Fm11': [[1, 3, 3, 1], - [12, 10, 11, 11], - [13, 10, 11, 10]], - 'Fmmaj7': [[1, 4, 1, 3], - [5, 5, 4, 7], - [10, 8, 8, 7], - [9, 8, 8, 8]], - 'Fmmaj7b5': [[1, 4, 1, 2], - [4, 5, 4, 7], - [9, 8, 7, 8], - [10, 8, 7, 7]], - 'Fmmaj9': [[1, 4, 3, 3], - [5, 7, 4, 7], - [9, 8, 8, 10], - [13, 12, 12, 10]], - 'Fmmaj11': [[1, 4, 3, 1], - [12, 10, 12, 11], - [13, 10, 12, 10]], - 'Fadd9': [[0, 0, 1, 0], - [2, 5, 3, 3], - [5, 7, 5, 8], - [10, 9, 8, 10]], - 'Fmadd9': [[0, 5, 4, 3], - [10, 8, 8, 10], - [13, 12, 13, 10], - [12, 12, 13, 11]], - 'G': [[0, 2, 3, 2], - [4, 2, 3, 2], - [4, 2, 3, 5], - [7, 7, 7, 10]], - 'Gm': [[0, 2, 3, 1], - [3, 2, 3, 1], - [3, 2, 3, 5], - [7, 7, 6, 5]], - 'Gdim': [[0, 1, 3, 1], - [3, 1, 3, 1], - [6, 7, 6, 4], - [12, 10, 9, 10]], - 'Gdim7': [[0, 1, 0, 1], - [3, 4, 3, 4], - [6, 7, 6, 7], - [9, 10, 9, 10]], - 'Gsus2': [[0, 2, 3, 0], - [2, 2, 3, 5], - [7, 7, 5, 5], - [7, 9, 10, 10]], - 'Gsus4': [[0, 2, 3, 3], - [5, 2, 3, 3], - [5, 2, 3, 5], - [5, 7, 8, 5]], - 'G7sus4': [[0, 2, 1, 3], - [5, 5, 3, 5], - [7, 7, 8, 8], - [10, 12, 10, 10]], - 'G7alt': [[4, 1, 3, 2], - [4, 7, 7, 4], - [12, 11, 9, 10]], - 'G+': [[0, 3, 3, 2], - [4, 3, 3, 2], - [4, 3, 3, 6], - [4, 7, 7, 6]], - 'G6': [[0, 2, 0, 2], - [4, 4, 3, 5], - [7, 7, 7, 7], - [9, 11, 10, 10]], - 'G69': [[2, 2, 0, 2], - [4, 4, 5, 5], - [7, 9, 7, 7], - [9, 11, 10, 12]], - 'G7': [[0, 2, 1, 2], - [4, 5, 3, 5], - [7, 7, 7, 8], - [10, 11, 10, 10]], - 'G7b5': [[0, 1, 1, 2], - [4, 5, 3, 4], - [6, 7, 7, 8], - [10, 11, 9, 10]], - 'G+7': [[0, 3, 1, 2], - [4, 5, 3, 6], - [8, 7, 7, 8], - [10, 11, 11, 10]], - 'G9': [[2, 2, 1, 2], - [4, 5, 5, 5], - [7, 9, 7, 8], - [10, 11, 10, 12]], - 'G9b5': [[2, 1, 1, 2], - [4, 5, 5, 4], - [6, 9, 7, 8], - [10, 11, 9, 12]], - 'G+9': [[2, 3, 1, 2], - [4, 5, 5, 6], - [8, 9, 7, 8], - [10, 11, 11, 12]], - 'G7b9': [[1, 2, 1, 2], - [4, 5, 4, 5], - [7, 8, 7, 8], - [10, 11, 10, 11]], - 'G7b9#5': [[1, 3, 1, 2], - [4, 5, 4, 6], - [8, 8, 7, 8], - [10, 11, 11, 11]], - 'G7#9': [[3, 2, 1, 2], - [4, 2, 1, 1], - [4, 5, 6, 5], - [7, 10, 7, 8]], - 'G11': [[2, 0, 1, 2], - [5, 5, 5, 2], - [4, 5, 5, 3]], - 'G9#11': [[2, 1, 1, 2], - [4, 5, 5, 4], - [6, 9, 7, 8], - [10, 11, 9, 12]], - 'G13': [[2, 4, 1, 2], - [4, 5, 5, 7], - [9, 9, 7, 8], - [10, 9, 7, 7]], - 'G13b9': [[1, 4, 1, 2], - [4, 5, 4, 7], - [10, 8, 7, 7], - [10, 11, 12, 11]], - 'G13b5b9': [[1, 4, 1, 4], - [6, 5, 4, 7], - [10, 8, 9, 7], - [9, 8, 9, 8]], - 'Gb13b9': [[1, 3, 1, 2], - [4, 5, 4, 6], - [8, 8, 7, 8], - [10, 11, 11, 11], - [0, 3, 0, 1], - [3, 4, 3, 6], - [9, 7, 6, 6], - [9, 10, 11, 10]], - 'Gb13#9': [[4, 3, 1, 1], - [3, 3, 1, 2], - [4, 5, 6, 6], - [8, 10, 7, 8]], - 'Gmaj7': [[0, 2, 2, 2], - [4, 6, 3, 5], - [7, 7, 7, 9], - [12, 11, 10, 9]], - 'Gmaj7b5': [[0, 1, 2, 2], - [4, 6, 3, 4], - [6, 7, 7, 9], - [12, 11, 9, 9]], - 'Gmaj7#5': [[0, 3, 2, 2], - [4, 6, 3, 6], - [8, 7, 7, 9], - [12, 11, 11, 9]], - 'Gmaj9': [[2, 2, 2, 2], - [4, 6, 5, 5], - [7, 9, 7, 9], - [11, 11, 10, 12]], - 'Gmaj11': [[2, 0, 2, 2], - [4, 6, 5, 3]], - 'Gmaj13': [[2, 4, 2, 2], - [4, 6, 5, 7], - [9, 9, 7, 9], - [11, 11, 12, 12]], - 'Gm6': [[0, 2, 0, 1], - [3, 4, 3, 5], - [7, 7, 6, 7], - [9, 10, 10, 10]], - 'Gm7': [[0, 2, 1, 1], - [3, 5, 3, 5], - [7, 7, 6, 8], - [10, 10, 10, 10]], - 'Gm7b5': [[0, 1, 1, 1], - [3, 5, 3, 4], - [6, 7, 6, 8], - [10, 10, 9, 10]], - 'Gm9': [[3, 2, 1, 0], - [2, 2, 1, 1], - [3, 5, 5, 5], - [7, 9, 6, 8]], - 'Gm69': [[2, 2, 0, 1], - [3, 2, 0, 0], - [3, 4, 5, 5], - [7, 9, 6, 7]], - 'Gm9b5': [[3, 1, 1, 0], - [2, 1, 1, 1], - [3, 5, 5, 4], - [6, 9, 6, 8]], - 'Gm11': [[2, 0, 1, 1], - [3, 0, 1, 0], - [3, 5, 5, 3], - [5, 5, 6, 0]], - 'Gmmaj7': [[0, 2, 2, 1], - [3, 6, 3, 5], - [7, 7, 6, 9], - [12, 10, 10, 9]], - 'Gmmaj7b5': [[0, 1, 2, 1], - [3, 6, 3, 4], - [6, 7, 6, 9], - [11, 10, 9, 10]], - 'Gmmaj9': [[3, 2, 2, 0], - [2, 2, 2, 1], - [3, 6, 5, 5], - [7, 9, 6, 9]], - 'Gmmaj11': [[2, 0, 2, 1], - [3, 0, 2, 0], - [3, 6, 5, 3], - [5, 6, 6, 0]], - 'Gadd9': [[2, 2, 3, 2], - [4, 7, 5, 5], - [7, 9, 7, 10], - [12, 11, 10, 12]], - 'Gmadd9': [[3, 2, 3, 0], - [2, 2, 3, 1], - [12, 10, 10, 12]], - 'Gb': [[3, 1, 2, 1], - [3, 1, 2, 4], - [6, 6, 6, 9], - [11, 10, 9, 9]], - 'Gbm': [[2, 1, 2, 0], - [2, 1, 2, 4], - [6, 6, 5, 4], - [11, 9, 9, 9]], - 'Gbdim': [[2, 0, 2, 0], - [5, 6, 5, 3], - [11, 9, 8, 9], - [11, 12, 14, 12]], - 'Gbdim7': [[2, 3, 2, 3], - [5, 6, 5, 6], - [8, 9, 8, 9], - [11, 12, 11, 12]], - 'Gbsus2': [[1, 1, 2, 4], - [6, 6, 4, 4], - [6, 8, 9, 9], - [11, 13, 14, 11]], - 'Gbsus4': [[4, 1, 2, 4], - [4, 6, 7, 4], - [6, 6, 7, 4], - [6, 6, 7, 9]], - 'Gb7sus4': [[4, 4, 2, 4], - [6, 6, 7, 7], - [9, 11, 9, 9], - [11, 13, 12, 14]], - 'Gb7alt': [[3, 0, 2, 1], - [3, 6, 6, 3], - [11, 10, 8, 9]], - 'Gb+': [[3, 2, 2, 1], - [3, 2, 2, 5], - [3, 6, 6, 5], - [7, 6, 6, 9]], - 'Gb6': [[3, 3, 2, 4], - [6, 6, 6, 6], - [8, 10, 9, 9], - [11, 13, 11, 13]], - 'Gb69': [[3, 3, 4, 4], - [6, 8, 6, 6], - [8, 10, 9, 11], - [13, 13, 11, 13]], - 'Gb7': [[3, 4, 2, 4], - [6, 6, 6, 7], - [9, 10, 9, 9], - [11, 13, 12, 13]], - 'Gb7b5': [[3, 4, 2, 3], - [5, 6, 6, 7], - [9, 10, 8, 9], - [11, 12, 12, 13]], - 'Gb+7': [[3, 4, 2, 5], - [7, 6, 6, 7], - [9, 10, 10, 9], - [11, 14, 12, 13]], - 'Gb9': [[1, 1, 0, 1], - [3, 4, 4, 4], - [6, 8, 6, 7], - [9, 10, 9, 11]], - 'Gb9b5': [[1, 0, 0, 1], - [3, 4, 4, 3], - [5, 8, 6, 7], - [9, 10, 8, 11]], - 'Gb+9': [[1, 2, 0, 1], - [3, 4, 4, 5], - [7, 8, 6, 7], - [9, 10, 10, 11]], - 'Gb7b9': [[0, 1, 0, 1], - [3, 4, 3, 4], - [6, 7, 6, 7], - [9, 10, 9, 10]], - 'Gb7b9#5': [[0, 2, 0, 1], - [3, 4, 3, 5], - [7, 7, 6, 7], - [9, 10, 10, 10]], - 'Gb7#9': [[2, 1, 0, 1], - [3, 1, 0, 0], - [3, 4, 5, 4], - [6, 9, 6, 7]], - 'Gb11': [[3, 4, 4, 2], - [4, 4, 4, 1]], - 'Gb9#11': [[1, 0, 0, 1], - [3, 4, 4, 3], - [5, 8, 6, 7], - [9, 10, 8, 11]], - 'Gb13': [[1, 3, 0, 1], - [3, 4, 4, 6], - [8, 8, 6, 7], - [9, 8, 6, 6]], - 'Gb13b5b9': [[0, 3, 0, 3], - [5, 4, 3, 6], - [9, 7, 8, 6], - [8, 7, 8, 7]], - 'Gbb13b9': [[0, 2, 0, 1], - [3, 4, 3, 5], - [7, 7, 6, 7], - [9, 10, 10, 10]], - 'Gbb13#9': [[3, 2, 0, 0], - [2, 2, 0, 1], - [3, 4, 5, 5], - [7, 9, 6, 7]], - 'Gbmaj7': [[3, 5, 2, 4], - [6, 6, 6, 8], - [11, 10, 9, 8], - [10, 10, 9, 9]], - 'Gbmaj7b5': [[3, 5, 2, 3], - [5, 6, 6, 8], - [11, 10, 8, 8], - [10, 10, 8, 9]], - 'Gbmaj7#5': [[3, 5, 2, 5], - [7, 6, 6, 8], - [11, 10, 10, 8], - [10, 10, 10, 9]], - 'Gbmaj9': [[1, 1, 1, 1], - [3, 5, 4, 4], - [6, 8, 6, 8], - [10, 10, 9, 11]], - 'Gbmaj11': [[3, 5, 4, 2], - [13, 11, 13, 13]], - 'Gbmaj13': [[1, 3, 1, 1], - [3, 5, 4, 6], - [8, 8, 6, 8], - [10, 10, 11, 11]], - 'Gbm6': [[2, 3, 2, 4], - [6, 6, 5, 6], - [8, 9, 9, 9], - [11, 13, 11, 12]], - 'Gbm7': [[2, 4, 2, 4], - [6, 6, 5, 7], - [9, 9, 9, 9], - [11, 13, 12, 12]], - 'Gbm7b5': [[2, 4, 2, 3], - [5, 6, 5, 7], - [9, 9, 8, 9], - [11, 12, 12, 12]], - 'Gbm9': [[1, 1, 0, 0], - [2, 4, 4, 4], - [6, 8, 5, 7], - [9, 9, 9, 11]], - 'Gbm69': [[2, 3, 4, 4], - [6, 8, 5, 6], - [8, 9, 9, 11], - [13, 13, 11, 12]], - 'Gbm9b5': [[1, 0, 0, 0], - [2, 4, 4, 3], - [5, 8, 5, 7], - [9, 9, 8, 11]], - 'Gbm11': [[2, 4, 4, 2], - [13, 11, 12, 12], - [14, 11, 12, 11]], - 'Gbmmaj7': [[2, 5, 2, 4], - [6, 6, 5, 8], - [11, 9, 9, 8], - [10, 9, 9, 9]], - 'Gbmmaj7b5': [[2, 5, 2, 3], - [5, 6, 5, 8], - [10, 9, 8, 9], - [11, 9, 8, 8]], - 'Gbmmaj9': [[1, 1, 1, 0], - [2, 5, 4, 4], - [6, 8, 5, 8], - [10, 9, 9, 11]], - 'Gbmmaj11': [[2, 5, 4, 2], - [13, 11, 13, 12], - [14, 11, 13, 11]], - 'Gbadd9': [[1, 1, 2, 1], - [3, 6, 4, 4], - [6, 8, 6, 9], - [11, 10, 9, 11]], - 'Gbmadd9': [[1, 1, 2, 0], - [11, 9, 9, 11], - [14, 13, 14, 11]]}} \ No newline at end of file diff --git a/Apps_example/GuitarAccord/app/show_guitar_accord.py b/Apps_example/GuitarAccord/app/show_guitar_accord.py deleted file mode 100644 index 6fc1f94..0000000 --- a/Apps_example/GuitarAccord/app/show_guitar_accord.py +++ /dev/null @@ -1,322 +0,0 @@ -#!/usr/bin/python3 -# -*- coding: utf-8 -*- -""" -Display guitar chords from listedesaccords database -""" -# import des blibliothèques python - -import sys -import tkinter as tk -import tkinter.ttk as ttk - -# import des paramètres géométriques -from .guitare_parameter import CORDES_ESPACEMENT, \ - CORDES_OFFSET, \ - FRETTES_NOMBRE, \ - FRETTES_ESPACEMENT, \ - GUITARE_LARGEUR, \ - GUITARE_HAUTEUR, \ - WOOD_BG -# import du dictionnaire d'accords -from .listedesaccords import CHORDS -# création d'un manche en bois si WOOD_BG = True -if WOOD_BG : from .woodenbackground import get_background # créé image de fond (optionel) - -################# Interface Principale ############################## -class MainGui: - """ - Créé un object de classe Guitare qui à l'interaction crée des listes déroulantes. - L'object est placé selon la méthode 'pack()' de tkinter, suivant la position 'pos' - Appelle la classe Guitare, un canvas contenant la grille, TextAccord, une boite - de texte pour afficher le nom de l'accord selectionné, DropList, des listes pour - selectionner l'accord à afficher. - Usage : MainGui(fenetre, position = [x,y]) - """ - - #: crée un grille interactive représentant une guitare - def __init__(self, root, pos=[0,0]): - - mainframe = tk.Frame(root, relief="sunken", borderwidth=3) - - #: Création d'une grille représentant une guitare - frame1=tk.Frame(mainframe) - self.name = TextAccord(frame1) # pour affichage du nom de l'accord - self.guitare = Guitare(frame1, callback=self.on_click) # grille - frame1.pack(side=tk.BOTTOM) - - mainframe.grid(row=pos[0], column=pos[1]) - - root.bind('', lambda e: sys.exit()) - - #: A l'interaction, Création de listes déroulantes pour selection de l'accord - def on_click(self, event): - - self.popup_frame = tk.Toplevel() # popup window - self.accordage = DropList(frame = self.popup_frame, - text = "accordage", - liste = list(CHORDS), - callback = self.change_accords_liste) - self.accord = DropList(frame = self.popup_frame, - text = "accord", - callback = self.change_variantes_liste) - self.variante = DropList(frame = self.popup_frame, - text = "variante", - callback = self.dessine_tablature) - - #: Modification de la liste des accords (appellé par DropList) - def change_accords_liste(self, event): - - accordage = self.accordage.box.get() # accordage selectionné - accords = list( CHORDS[accordage] ) # liste des accords pour cet accordage - - self.accord.box['values'] = accords # on applique au widjet - - #: Modification de la liste des variantes de l'accord (appellé par DropList) - def change_variantes_liste(self, event): - - accordage = self.accordage.box.get() - accord = self.accord.box.get() - variantes = list( CHORDS[accordage][accord] ) - - self.variante.box['values'] = variantes - - #: Affichage de l'accord sur le manche et ferme la popup - def dessine_tablature(self, event): - - accordage = self.accordage.box.get() - accord = self.accord.box.get() - variante = self.variante.box.current() - accord_choisi = CHORDS[accordage][accord][variante] - - self.popup_frame.destroy() # detruit la popup - self.name.display_name(accord) # affiche le nom de l'accord - self.guitare.show_accord(accord_choisi) - - -################# Widgets & Canvas ##################################### - -class TextAccord: - """ - Crée une boite pour l'affichage du nom de l'accord, - appellé à la selection de la variante - """ - - def __init__(self, frame): - self.name = tk.StringVar() - self.box_name = tk.Message(frame, - textvariable=self.name, - font=("Comics", 12), - width=80) - self.box_name.pack(side=tk.TOP) - - #: Affiche le nom de l'accord - def display_name(self, accord): - self.name.set(str(accord)) - -class DropList: - """ - Créé une liste déroulante afin de selectionner les accords à afficher - affiche la liste "values" et excecute "callback" à la selection - Usage : DropList(fenetre, nom_de_la_liste, callback, values) - """ - - def __init__(self, frame, text, callback, liste=None): - - subframe = tk.Frame(frame) - self.value = tk.StringVar() - self.box = ttk.Combobox(subframe, - textvariable=self.value, - width = 11) - self.box.bind('<>', callback) - self.box['values'] = liste - self.box.pack(side=tk.RIGHT) - - self.name = tk.StringVar() - self.name = tk.Message(subframe, text=text, font=("Comics", 12), width=100) - self.name.pack(side=tk.RIGHT) - - subframe.pack(side=tk.TOP) - - -class Guitare: - """ - Crée une grille représentant un manche de guitare et affiche l'accord - selectionné. - Au clique gauche, ouvre un popup permettant de choisir l'accord à afficher - Usage : Guitare(fenetre, callback = on_click) - """ - - #: Création de l'espace de dessin - def __init__(self, frame, callback): - - self.frame = frame - # Espace de dessin - self.canvas1 = tk.Canvas(self.frame, - width = GUITARE_LARGEUR, - height = GUITARE_HAUTEUR) - self.canvas1.bind("", callback) # au clique gauche : callback - - # Listera les objets pour manipulation/suppression - self.accord_precedent = [0]*6 # par défaut, on crée un manche avec 6 cordes - self.numero_frette = [] # indice de la première frette affichée - - # Création du manche de guitare en fonction du nombre de cordes - nb_cordes = len(list(CHORDS)[0]) - self.guitare = self.create_guitare(nb_cordes) - - self.canvas1.pack(side=tk.TOP) - - #: Création du manche (frettes + cordes + background) - def create_guitare(self, cordes_nombre): - - # On supprime tout ce qu'on a pu dessiner précédemment - self.canvas1.delete("all") - - # Obtention des dimensions du manche - self.largeur = (cordes_nombre - 1) * CORDES_ESPACEMENT\ - + 2 * CORDES_OFFSET - self.longueur = FRETTES_NOMBRE * FRETTES_ESPACEMENT - - # Génération procédurale d'une image de manche en bois - if WOOD_BG : - self.canvas1.background = get_background((self.largeur*2, self.longueur*2)) - self.background = self.canvas1.create_image(0, 0, image=self.canvas1.background) - - # Création des frettes - Frette(self.canvas1, 1, self.largeur, width=5) # 1ère plus large - for n in range(FRETTES_NOMBRE) : # puis les autres - Frette(self.canvas1, n, self.largeur) - - # Création des cordes - self.cordes_list=[] # on enregistrera les objects corde - for n in range(cordes_nombre): - corde = Corde(self.canvas1, n) - self.cordes_list.append(corde) - - #: Dessine l'accord sur le manche - def show_accord(self, accord_choisi): - - # On efface l'accord précédent - self.clear_accord() - - # on redessine le manche si le nombre de cordes à changé - if len(accord_choisi) != len(self.accord_precedent) : - self.create_guitare(len(accord_choisi)) - - # On l'affiche à partir de la première frette utilisée - accord_norm, position_frette = self.get_accord_norm(accord_choisi) - - # On dessine, une à une, les notes de l'accord - self.accord_precedent = [] # remise à zero - for n, note in enumerate(accord_norm) : - self.accord_precedent.append(self.cordes_list[n].play(note)) - - # On affiche le numero de frette - self.print_frette_number(position_frette) - - #: Efface l'accord précédent - def clear_accord(self): - - for n in range(len(self.accord_precedent)): - self.canvas1.delete(self.accord_precedent[n]) - - #: Correction de la valeur des notes pour afficher uniquement la zone du manche utilisée - def get_accord_norm(self, accord_choisi): - - note_min = 50 # indice de la note la plus basse sur le manche (ni "0" ni "x") - for i, note in enumerate (accord_choisi): - if isinstance(note, int): # ni x - if note >= 1 : # ni 0 - if note < note_min : - note_min = note - - accord_norm = [0] * len(accord_choisi) # accord abaissé de note_min - for i, note in enumerate (accord_choisi): - if isinstance(note, str): # si étouffée ('x') - accord_norm[i] = note - elif note >= 1 : # si normale - accord_norm[i] = note - note_min + 1 - else : # si jouée à vide (0) - accord_norm[i] = note - - return accord_norm, note_min-1 - - #: Affiche le numéro de frette - def print_frette_number(self, number): - - self.canvas1.delete(self.numero_frette) - self.numero_frette = self.canvas1.create_text(self.largeur+15, - CORDES_ESPACEMENT+20, - text=str(number), - font=("Comics", 16)) - -class Corde : - """ - Crée une corde et affiche la note envoyée - Usage : Corde(fenetre, numero_de_la_corde - """ - - def __init__(self, canvas, number): - - self.canvas1 = canvas - self.num = number # numéro de la corde - self.pos_x = self.num * CORDES_ESPACEMENT + CORDES_OFFSET - self.taille = FRETTES_NOMBRE * FRETTES_ESPACEMENT - - self.draw() - - #: Dessine une corde - def draw(self): - - x = self.pos_x - y0 = 0 - y1 = self.taille - width = (7-self.num)/3 # taille des cordes décroissante - - self.canvas1.create_line(x, y0, x, y1, width=width, fill="darkgray") - - #: Joue/affiche une note sur la corde - def play(self, note): - - color = self.get_color_from_note(note) - if note == 'x' : note = 0 # notes étouffées s'affichent en 0 - r = 7 # rayon de la note affichée - x = self.pos_x - y = (note + 1/2) * FRETTES_ESPACEMENT # 1/2 frette plus loin que la frette - - note_nouvelle = self.canvas1.create_oval(x-r, y-r, x+r, y+r, - fill = color, - width = 2) - return note_nouvelle - - #: Change la couleur de la note suivant la manière de la jouer (ex : étouffée) - def get_color_from_note(self, note) : - - if note == 0 : # à vide - return None - elif note == 'x' : # étouffées - return 'black' - else : # normalement - return 'snow' - - -class Frette: - """ Affiche une frette, pas de méthode particulière""" - def __init__(self, canvas, n, largeur, width=1.5): - x0 = 0 - y = FRETTES_ESPACEMENT * n - x1 = largeur - canvas.create_line(x0, y, x1, y, fill = "black", width = width) - - - -############### Boucle ################################# -if __name__ == '__main__': - root=tk.Tk() - - for i in range(3): - for j in range (6): - guitare = MainGui(root, [i,j]) - root.mainloop() - - diff --git a/Apps_example/GuitarAccord/app/woodenbackground.py b/Apps_example/GuitarAccord/app/woodenbackground.py deleted file mode 100644 index 5b089d8..0000000 --- a/Apps_example/GuitarAccord/app/woodenbackground.py +++ /dev/null @@ -1,91 +0,0 @@ -from numpy import * -from numpy import matlib -from tkinter import * -from matplotlib import pyplot as plt -import matplotlib -from PIL import Image, ImageTk -from scipy import misc -from scipy.interpolate import interp2d -import skimage.transform -#from colormap import Colormap -import numpy as np -#plt.ion() - -def get_background(size=(100,1000)): - - size_x=size[0] - size_y=size[1] - size_turb_x=size[0] - size_turb_y=size[1] - lambdax = 8 - lambday = 200 - xpower = 20 - ypower = 100 - - a=0 - l=0 - - fig=plt.figure() - - while l<2 : - mat0=random.rand(size_turb_x,size_turb_x) - x0=arange(size_turb_x) - y0=arange(size_turb_x) - grids=[] - pts=vstack((x0,y0)) - - for j in arange(1,7,1) : - i=2**j - x1=arange(0,size_turb_x,i) - y1=arange(0,size_turb_x,i) - f = interp2d(x0, y0, mat0) - grid_z1=f(x1,y1) - grids.append(grid_z1) - per=1 - perlin_mat=empty((size_turb_x,size_turb_x)) - - for mat in grids : - mat=skimage.transform.resize(mat,(size_turb_x,size_turb_x)) - per=per/0.7 - perlin_mat = perlin_mat + mat*per - perlin_mat=perlin_mat/amax(perlin_mat) - perlin_cut=perlin_mat.copy() - l=l+1 - perlin_cut=skimage.transform.resize(perlin_cut,(size_y,size_x)) - perlin_cut=perlin_cut/amax(perlin_cut) - - if a == 0 : - turb_x0=perlin_cut - a=1 - else : - turb_y0=perlin_cut - - x0=arange(size_x) - y0=arange(size_y) - X,Y=meshgrid(x0,y0) - mat0=sin(((X+turb_x0*xpower)/lambdax)*2*pi) - cmap = matplotlib.colors.LinearSegmentedColormap.from_list("", ["saddlebrown","maroon"]) - - im_plt = plt.imshow(mat0,cmap=cmap) - image = Image.fromarray(np.uint8( im_plt.get_cmap()(im_plt.get_array())*255)) - im = ImageTk.PhotoImage('RGB', image.size) - im.paste(image) - -# plt.close(fig) - return im - - -if __name__ == '__main__': - - root=Tk() - canvas = Canvas(root) - canvas.pack(expand = YES, fill = BOTH) - - im_plt = get_background() - image = Image.fromarray(np.uint8( im_plt.get_cmap()(im_plt.get_array())*255)) - im = ImageTk.PhotoImage('RGB', image.size) - im.paste(image) - - test = canvas.create_image(0, 0, image=im) - mainloop() - diff --git a/Apps_example/GuitarAccord/requirements.txt b/Apps_example/GuitarAccord/requirements.txt deleted file mode 100644 index 987f837..0000000 --- a/Apps_example/GuitarAccord/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -scipy==1.4.1 -scikit_image==0.16.2 -matplotlib==3.2.1 -numpy==1.17.4 -Pillow==7.1.2 -skimage==0.0 diff --git a/Apps_example/GuitarAccord/show5 b/Apps_example/GuitarAccord/show5 deleted file mode 100755 index a556cdc..0000000 --- a/Apps_example/GuitarAccord/show5 +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/python3 -# -*- coding: utf-8 -*- - -import tkinter as tk - -from app.show_guitar_accord import MainGui - -root=tk.Tk() -for i in range(4): - guitare = MainGui(root, [0,i]) -root.mainloop() diff --git a/Apps_example/GuitarAccord/show_guitar_accord.png b/Apps_example/GuitarAccord/show_guitar_accord.png deleted file mode 100644 index 347469a..0000000 Binary files a/Apps_example/GuitarAccord/show_guitar_accord.png and /dev/null differ diff --git a/Apps_example/OrphelinRAW/delete_orphelin_raw b/Apps_example/OrphelinRAW/delete_orphelin_raw deleted file mode 100755 index e4f43fd..0000000 --- a/Apps_example/OrphelinRAW/delete_orphelin_raw +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -mkdir "raw_to_delete" -for file in *.ARW; do - - f="${file%.*}.JPG" - - if [ -f "$f" ]; then - echo "1" - else - echo "0" - $(mv $file "raw_to_delete/$file") - fi -done diff --git a/Apps_example/OrphelinRAW/requirements.txt b/Apps_example/OrphelinRAW/requirements.txt deleted file mode 100644 index 8b13789..0000000 --- a/Apps_example/OrphelinRAW/requirements.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/Apps_example/QrcoPy/app/qrcopy.py b/Apps_example/QrcoPy/app/qrcopy.py deleted file mode 100755 index ac0d53d..0000000 --- a/Apps_example/QrcoPy/app/qrcopy.py +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/python3 -# -*- coding: utf-8 -*- - -""" -@Author=Daguhh -""" - -import sys -import os - -from PyQt5.QtWidgets import ( - QWidget, - QLabel, - QApplication, - QPushButton, - QLabel, - QGridLayout, - QTextEdit -) -from PyQt5.QtGui import QPixmap -import qrcode -from PIL.ImageQt import ImageQt - -class Example(QWidget): - - def __init__(self): - super().__init__() - self.initUI() - - def initUI(self): - - grid = QGridLayout() - - textqr = QLabel('Enter text to convert') - self.textboxqr = QTextEdit() - grid.addWidget(textqr, 1, 6) - grid.addWidget(self.textboxqr, 2, 6) - - pixmap = QPixmap(200,200) - self.label = QLabel(self) - self.label.setPixmap(pixmap) - grid.addWidget(self.label, 0, 0, 5, 5) - #grid.addItem(pixmap,1,0,4,4) - - btn = QPushButton('Generate', self) - btn.setToolTip('Generate qr code from text') - btn.clicked.connect(self.generate) - grid.addWidget(btn,3,6) - - self.setLayout(grid) - self.setGeometry(300, 300, 350, 200) - self.setWindowTitle('Generate QRcodes') - self.show() - - def generate(self): - text = self.textboxqr.toPlainText() - img = qrcode.make(text) - qim = ImageQt(img) - pixmap = QPixmap.fromImage(qim) - self.label.setPixmap(pixmap) - -if __name__ == '__main__': - - app = QApplication(sys.argv) - ex = Example() - sys.exit(app.exec_()) diff --git a/Apps_example/QrcoPy/qrcode.desktop b/Apps_example/QrcoPy/qrcode.desktop deleted file mode 100755 index d06b8db..0000000 --- a/Apps_example/QrcoPy/qrcode.desktop +++ /dev/null @@ -1,8 +0,0 @@ -[Desktop Entry] -Name=QrcoPy -Type=Application -Comment=instant grcode generation -Exec=Apps_example/QrcoPy/qrcopy -TryExec=Apps_example/QrcoPy/qrcopy -Icon=Apps_example/QrcoPy/qrcode.png -Keywords=qrcode; python3; diff --git a/Apps_example/QrcoPy/qrcode.png b/Apps_example/QrcoPy/qrcode.png deleted file mode 100644 index 8974677..0000000 Binary files a/Apps_example/QrcoPy/qrcode.png and /dev/null differ diff --git a/Apps_example/QrcoPy/requirements.txt b/Apps_example/QrcoPy/requirements.txt deleted file mode 100644 index eb9076c..0000000 --- a/Apps_example/QrcoPy/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -qrcode==6.1 -Pillow==7.1.2 -PyQt5==5.14.2 diff --git a/Apps_example/RofiCalculator/app/rofi_python_calculator.py b/Apps_example/RofiCalculator/app/rofi_python_calculator.py deleted file mode 100755 index 02fc556..0000000 --- a/Apps_example/RofiCalculator/app/rofi_python_calculator.py +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/python3 - -""" -Python numpy calculator imbed in a rofi interface (python-rofi): - - can evaluate all numpy expression - - create a variable containing your result_lists for further usage -""" -from numpy import * -from rofi import Rofi -import string -from itertools import islice -from collections import deque - -MEMORY_SIZE = 20 # number of calculation kept in memory -ALPHABET = list(string.ascii_lowercase) # used for variable name generation -r = Rofi(lines=1) # initiate rofi interface - -# iterable = slicing window of 3 letters lenght over the math expression -def read_by_3(iterable, size=3): - iterable = iter(" " + iterable + " ") - d = deque(islice(iterable, size), size) - yield d - for x in iterable: - d.append(x) - yield d - -# generate variable name by cycling over alphabet -def gen_var_letter(number=20): - ALPHABET = list(string.ascii_lowercase)[0:number] - while 1 : - i=0 - while i - -### Add a launcher -You should have a .desktop file with the following entries: -``` -[Desktop Entry] -Name=My_App_Name -Comment=My App Description -Exec=My/app/path/my_app -Icon=My/icon/path/my_icon.png -``` -Put it under -``` -Apps/your_catergory/my_app.desktop -``` -or drag 'n' drop it to the wanted category tab - -### Usage -Just run -```bash -./pyqtmenu -``` diff --git a/README.rst b/README.rst new file mode 100644 index 0000000..37efd18 --- /dev/null +++ b/README.rst @@ -0,0 +1,42 @@ +******** +PyQtMenu +******** + +A PyQt5 menu to display my apps or any .desktop file + +* Display desktop files into multiple tab, +* Drag'n'Drop desktop file to add it in menu + +new : + +* Reduce mode : reduce launcher to a small floating button at application lauch +* Dual panel view (with i3) : control windows positions from tab "layout" + + .. image:: https://raw.githubusercontent.com/Daguhh/PyQtMenu/reduce_mod/Screenshots/screens.gif + :width: 200px + :align: center + :alt: PyQtMenu preview + +Add a launcher +############### + +You should have a .desktop file with the following entries:: + + [Desktop Entry] + Name=My_App_Name + Comment=My App Description + Exec=My/app/path/my_app + Icon=My/icon/path/my_icon.png + +Put it under:: + + Apps/your_catergory/my_app.desktop + +or drag 'n' drop it to the wanted category tab + +Usage +##### + +Just run:: + + ./pyqtmenu diff --git a/build_instruction.txt b/build_instruction.txt new file mode 100644 index 0000000..39b74f6 --- /dev/null +++ b/build_instruction.txt @@ -0,0 +1,2 @@ +dh_make --indep --createorig +debuild -us -uc diff --git a/debian/.debhelper/generated/pyqtmenu/installed-by-dh_install b/debian/.debhelper/generated/pyqtmenu/installed-by-dh_install new file mode 100644 index 0000000..a42b892 --- /dev/null +++ b/debian/.debhelper/generated/pyqtmenu/installed-by-dh_install @@ -0,0 +1,12 @@ +./pyqtmenu-start +./pyqtmenu.desktop +./pyqtmenu/config.py +./pyqtmenu/dialogs.py +./pyqtmenu/parse_desktop_file.py +./pyqtmenu/pyqtmenu.py +./pyqtmenu/qss.py +./pyqtmenu/window.py +./pyqtmenu/layout_manager/__init__.py +./pyqtmenu/layout_manager/layout_manager.py +./pyqtmenu/layout_manager/layout_manager_tab.py +./pyqtmenu/app_example diff --git a/Apps_example/EmptyApp/app/__init__.py b/debian/.debhelper/generated/pyqtmenu/installed-by-dh_installdocs similarity index 100% rename from Apps_example/EmptyApp/app/__init__.py rename to debian/.debhelper/generated/pyqtmenu/installed-by-dh_installdocs diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..2b155a6 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,5 @@ +pyqtmenu (0.1-1) unstable; urgency=medium + + * Initial release (Closes: #nnnn) + + -- David Wed, 02 Sep 2020 15:27:31 +0200 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..ab2837a --- /dev/null +++ b/debian/control @@ -0,0 +1,19 @@ +Source: pyqtmenu +Section: x11 +Priority: optional +Standards-Version: 4.5.0 +Maintainer: Daguhh +Build-Depends: debhelper-compat (= 13), python3 +Rules-Requires-Root: no + +Package: pyqtmenu +Architecture: any +Homepage: +X-Python3-Version: >=3.6 +Depends: ${python3:Depends}, ${python3-pyqt5:Depends} +Description: A simple menu to display your apps + Un menu pour organiser vos applications et lancer vos scripts. + Configuration simple par fichiers textes ou via l'interface + Avec le module pour i3wm, profitez d'une vue à deux panneaux + et organisez facilement vois fenêtres + diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..2b442d7 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,19 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: pyqtmenu +Upstream-Contact: +Source: https://github.com/Daguhh/PyQtMenu + +Files: * +Copyright: 2020 Daguhh code.daguhh@zaclys.net +License: The MIT License (MIT) +The MIT License (MIT) + +Copyright © 2020 Daguhh + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + diff --git a/debian/debhelper-build-stamp b/debian/debhelper-build-stamp new file mode 100644 index 0000000..ef68b0c --- /dev/null +++ b/debian/debhelper-build-stamp @@ -0,0 +1 @@ +pyqtmenu diff --git a/debian/files b/debian/files new file mode 100644 index 0000000..ad3919c --- /dev/null +++ b/debian/files @@ -0,0 +1,2 @@ +pyqtmenu_0.1-1_amd64.buildinfo x11 optional +pyqtmenu_0.1-1_amd64.deb x11 optional diff --git a/debian/install b/debian/install new file mode 100644 index 0000000..4ec9202 --- /dev/null +++ b/debian/install @@ -0,0 +1,12 @@ +pyqtmenu-start /usr/bin +pyqtmenu.desktop /usr/share/applications/ +pyqtmenu/config.py /usr/share/pyqtmenu +pyqtmenu/dialogs.py /usr/share/pyqtmenu +pyqtmenu/parse_desktop_file.py /usr/share/pyqtmenu +pyqtmenu/pyqtmenu.py /usr/share/pyqtmenu +pyqtmenu/qss.py /usr/share/pyqtmenu +pyqtmenu/window.py /usr/share/pyqtmenu +pyqtmenu/layout_manager/__init__.py /usr/share/pyqtmenu/layout_manager +pyqtmenu/layout_manager/layout_manager.py /usr/share/pyqtmenu/layout_manager +pyqtmenu/layout_manager/layout_manager_tab.py /usr/share/pyqtmenu/layout_manager +pyqtmenu/app_example /usr/share/pyqtmenu/ diff --git a/debian/pyqtmenu-docs.docs b/debian/pyqtmenu-docs.docs new file mode 100644 index 0000000..efea0a6 --- /dev/null +++ b/debian/pyqtmenu-docs.docs @@ -0,0 +1,2 @@ +README.Debian +README.source diff --git a/debian/pyqtmenu.postinst.debhelper b/debian/pyqtmenu.postinst.debhelper new file mode 100644 index 0000000..361f142 --- /dev/null +++ b/debian/pyqtmenu.postinst.debhelper @@ -0,0 +1,17 @@ + +# Automatically added by dh_python3 +if which py3compile >/dev/null 2>&1; then + py3compile -p pyqtmenu +fi +if which pypy3compile >/dev/null 2>&1; then + pypy3compile -p pyqtmenu || true +fi + +if which py3compile >/dev/null 2>&1; then + py3compile -p pyqtmenu /usr/share/pyqtmenu +fi +if which pypy3compile >/dev/null 2>&1; then + pypy3compile -p pyqtmenu /usr/share/pyqtmenu || true +fi + +# End automatically added section diff --git a/debian/pyqtmenu.prerm.debhelper b/debian/pyqtmenu.prerm.debhelper new file mode 100644 index 0000000..cb2b010 --- /dev/null +++ b/debian/pyqtmenu.prerm.debhelper @@ -0,0 +1,10 @@ + +# Automatically added by dh_python3 +if which py3clean >/dev/null 2>&1; then + py3clean -p pyqtmenu +else + dpkg -L pyqtmenu | perl -ne 's,/([^/]*)\.py$,/__pycache__/\1.*, or next; unlink $_ or die $! foreach glob($_)' + find /usr/lib/python3/dist-packages/ -type d -name __pycache__ -empty -print0 | xargs --null --no-run-if-empty rmdir +fi + +# End automatically added section diff --git a/debian/pyqtmenu.substvars b/debian/pyqtmenu.substvars new file mode 100644 index 0000000..13de292 --- /dev/null +++ b/debian/pyqtmenu.substvars @@ -0,0 +1,3 @@ +python3:Depends=python3:any +misc:Depends= +misc:Pre-Depends= diff --git a/debian/pyqtmenu/DEBIAN/control b/debian/pyqtmenu/DEBIAN/control new file mode 100644 index 0000000..bb6db71 --- /dev/null +++ b/debian/pyqtmenu/DEBIAN/control @@ -0,0 +1,14 @@ +Package: pyqtmenu +Version: 0.1-1 +Architecture: amd64 +Maintainer: Daguhh +Installed-Size: 151 +Depends: python3:any +Section: x11 +Priority: optional +Homepage: +Description: A simple menu to display your apps + Un menu pour organiser vos applications et lancer vos scripts. + Configuration simple par fichiers textes ou via l'interface + Avec le module pour i3wm, profitez d'une vue à deux panneaux + et organisez facilement vois fenêtres diff --git a/debian/pyqtmenu/DEBIAN/md5sums b/debian/pyqtmenu/DEBIAN/md5sums new file mode 100644 index 0000000..95f9da1 --- /dev/null +++ b/debian/pyqtmenu/DEBIAN/md5sums @@ -0,0 +1,31 @@ +e06584d4cadd6afbdd6a67711ac31d92 usr/bin/pyqtmenu-start +c157d107d176b38e628b3b076c29f9c4 usr/lib/python3/dist-packages/PyQtMenu-0.1.egg-info +d41d8cd98f00b204e9800998ecf8427e usr/lib/python3/dist-packages/pyqtmenu/__init__.py +4483d36156e19417466efe158c2f0166 usr/lib/python3/dist-packages/pyqtmenu/config.py +df1ca0b28069df5bcba99519f0e686d8 usr/lib/python3/dist-packages/pyqtmenu/dialogs.py +d41d8cd98f00b204e9800998ecf8427e usr/lib/python3/dist-packages/pyqtmenu/layout_manager/__init__.py +54f39cd1b216f7c505af25447d1746a8 usr/lib/python3/dist-packages/pyqtmenu/layout_manager/layout_manager.py +8145eda964506278c3f432b997301cd4 usr/lib/python3/dist-packages/pyqtmenu/layout_manager/layout_manager_tab.py +bdbf4cf47bb6995c0894074d37bff3df usr/lib/python3/dist-packages/pyqtmenu/parse_desktop_file.py +8d1d47e9681c0dceeb5bc05ab7f2e7c0 usr/lib/python3/dist-packages/pyqtmenu/pyqtmenu.py +bfe41f317521d2b218c78da2d7f0b1bc usr/lib/python3/dist-packages/pyqtmenu/qss.py +e6a2b97de4a3989dfc40a182f0b5e8e0 usr/lib/python3/dist-packages/pyqtmenu/window.py +88299e77b6293bb8778cd609267db3be usr/share/applications/pyqtmenu.desktop +0173418dad1a9e654631c9009ddf497f usr/share/doc/pyqtmenu/changelog.Debian.gz +b27a740d024f72850d048ef41e23b20e usr/share/doc/pyqtmenu/copyright +d41d8cd98f00b204e9800998ecf8427e usr/share/pyqtmenu/app_example/app/__init__.py +21ee38620f58c7238b03999cdc244d1e usr/share/pyqtmenu/app_example/app/empty.py +7fb10515d793c0b32ade3119ffa67166 usr/share/pyqtmenu/app_example/empty +eb8d7df44fe01c31c8625cb4574ccdab usr/share/pyqtmenu/app_example/empty.desktop +65993d47902572cb7bef166cd4051e2f usr/share/pyqtmenu/app_example/empty.png +7e42d5db7dcee6e1ab93615a7cc34252 usr/share/pyqtmenu/app_example/tab_example/onglet_1/empty1.desktop +4483d36156e19417466efe158c2f0166 usr/share/pyqtmenu/config.py +df1ca0b28069df5bcba99519f0e686d8 usr/share/pyqtmenu/dialogs.py +d41d8cd98f00b204e9800998ecf8427e usr/share/pyqtmenu/layout_manager/__init__.py +54f39cd1b216f7c505af25447d1746a8 usr/share/pyqtmenu/layout_manager/layout_manager.py +8145eda964506278c3f432b997301cd4 usr/share/pyqtmenu/layout_manager/layout_manager_tab.py +bdbf4cf47bb6995c0894074d37bff3df usr/share/pyqtmenu/parse_desktop_file.py +0383bb7637582fe1f7744ef3abb0a1cc usr/share/pyqtmenu/pyqtmenu.py +bfe41f317521d2b218c78da2d7f0b1bc usr/share/pyqtmenu/qss.py +464538100a121431782f866f72088021 usr/share/pyqtmenu/window.py +ec1d680a9dbe2a63a978a1ca4f9d3281 usr/share/python3/runtime.d/pyqtmenu.rtupdate diff --git a/debian/pyqtmenu/DEBIAN/postinst b/debian/pyqtmenu/DEBIAN/postinst new file mode 100755 index 0000000..0e6b8d9 --- /dev/null +++ b/debian/pyqtmenu/DEBIAN/postinst @@ -0,0 +1,19 @@ +#!/bin/sh +set -e + +# Automatically added by dh_python3 +if which py3compile >/dev/null 2>&1; then + py3compile -p pyqtmenu +fi +if which pypy3compile >/dev/null 2>&1; then + pypy3compile -p pyqtmenu || true +fi + +if which py3compile >/dev/null 2>&1; then + py3compile -p pyqtmenu /usr/share/pyqtmenu +fi +if which pypy3compile >/dev/null 2>&1; then + pypy3compile -p pyqtmenu /usr/share/pyqtmenu || true +fi + +# End automatically added section diff --git a/debian/pyqtmenu/DEBIAN/prerm b/debian/pyqtmenu/DEBIAN/prerm new file mode 100755 index 0000000..0bfa854 --- /dev/null +++ b/debian/pyqtmenu/DEBIAN/prerm @@ -0,0 +1,12 @@ +#!/bin/sh +set -e + +# Automatically added by dh_python3 +if which py3clean >/dev/null 2>&1; then + py3clean -p pyqtmenu +else + dpkg -L pyqtmenu | perl -ne 's,/([^/]*)\.py$,/__pycache__/\1.*, or next; unlink $_ or die $! foreach glob($_)' + find /usr/lib/python3/dist-packages/ -type d -name __pycache__ -empty -print0 | xargs --null --no-run-if-empty rmdir +fi + +# End automatically added section diff --git a/debian/pyqtmenu/usr/bin/pyqtmenu-start b/debian/pyqtmenu/usr/bin/pyqtmenu-start new file mode 100755 index 0000000..e54e972 --- /dev/null +++ b/debian/pyqtmenu/usr/bin/pyqtmenu-start @@ -0,0 +1,21 @@ +#!/bin/bash + +/usr/share/pyqtmenu/pyqtmenu.py + + +##!/usr/bin/env python3 +## -*- coding: utf-8 -*- +# +#import sys +# +#from PyQt5.QtWidgets import QApplication +# +#from ui.window import MainWindow +# +# +# +#if __name__ == '__main__': +# +# app = QApplication(sys.argv) +# ex = MainWindow() +# sys.exit(app.exec_()) diff --git a/debian/pyqtmenu/usr/share/applications/pyqtmenu.desktop b/debian/pyqtmenu/usr/share/applications/pyqtmenu.desktop new file mode 100644 index 0000000..efee14e --- /dev/null +++ b/debian/pyqtmenu/usr/share/applications/pyqtmenu.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Name=PyQtMenu +Comment=Simple menu for debian +Comment[fr]=Menu simple pour debian +Exec=/usr/bin/pyqtmenu-start +Path=/usr/share/pyqtmenu +Icon=pyqtmenu +StartupNotify=true +Terminal=false +Type=Application +Categories=Utility; diff --git a/debian/pyqtmenu/usr/share/doc/pyqtmenu/changelog.Debian.gz b/debian/pyqtmenu/usr/share/doc/pyqtmenu/changelog.Debian.gz new file mode 100644 index 0000000..1d6277a Binary files /dev/null and b/debian/pyqtmenu/usr/share/doc/pyqtmenu/changelog.Debian.gz differ diff --git a/debian/pyqtmenu/usr/share/doc/pyqtmenu/copyright b/debian/pyqtmenu/usr/share/doc/pyqtmenu/copyright new file mode 100644 index 0000000..2b442d7 --- /dev/null +++ b/debian/pyqtmenu/usr/share/doc/pyqtmenu/copyright @@ -0,0 +1,19 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: pyqtmenu +Upstream-Contact: +Source: https://github.com/Daguhh/PyQtMenu + +Files: * +Copyright: 2020 Daguhh code.daguhh@zaclys.net +License: The MIT License (MIT) +The MIT License (MIT) + +Copyright © 2020 Daguhh + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + diff --git a/Apps_example/ExifManipulation/app/__init__.py b/debian/pyqtmenu/usr/share/pyqtmenu/app_example/app/__init__.py similarity index 100% rename from Apps_example/ExifManipulation/app/__init__.py rename to debian/pyqtmenu/usr/share/pyqtmenu/app_example/app/__init__.py diff --git a/debian/pyqtmenu/usr/share/pyqtmenu/app_example/app/empty.py b/debian/pyqtmenu/usr/share/pyqtmenu/app_example/app/empty.py new file mode 100755 index 0000000..940b124 --- /dev/null +++ b/debian/pyqtmenu/usr/share/pyqtmenu/app_example/app/empty.py @@ -0,0 +1,32 @@ +#! /usr/bin/python3 +# -*- coding: utf-8 -*- + +""" +""" + +import sys +from PyQt5.QtWidgets import QWidget, QPushButton, QApplication + +class Example(QWidget): + + def __init__(self): + super(QWidget, self).__init__() + + self.setWindowTitle('Useless app') + self.initUI() + + def initUI(self): + + btn = QPushButton('Quit', self) + btn.clicked.connect(QApplication.instance().quit) + btn.resize(btn.sizeHint()) + + self.setGeometry(300, 300, 250, 150) + self.show() + + +if __name__ == '__main__': + + app = QApplication(sys.argv) + ex = Example() + sys.exit(app.exec_()) diff --git a/Apps_example/ExifManipulation/delete_metadata b/debian/pyqtmenu/usr/share/pyqtmenu/app_example/empty similarity index 73% rename from Apps_example/ExifManipulation/delete_metadata rename to debian/pyqtmenu/usr/share/pyqtmenu/app_example/empty index 52cef3f..851a6d3 100755 --- a/Apps_example/ExifManipulation/delete_metadata +++ b/debian/pyqtmenu/usr/share/pyqtmenu/app_example/empty @@ -1,14 +1,13 @@ -#!/usr/bin/env python3 +#! /usr/bin/python3 # -*- coding: utf-8 -*- import sys - from PyQt5.QtWidgets import QApplication -from app.delete_metadata import Example +from app.empty import Example if __name__ == '__main__': - + app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) diff --git a/Apps_example/EmptyApp/empty.desktop b/debian/pyqtmenu/usr/share/pyqtmenu/app_example/empty.desktop similarity index 100% rename from Apps_example/EmptyApp/empty.desktop rename to debian/pyqtmenu/usr/share/pyqtmenu/app_example/empty.desktop diff --git a/Apps_example/EmptyApp/empty.png b/debian/pyqtmenu/usr/share/pyqtmenu/app_example/empty.png similarity index 100% rename from Apps_example/EmptyApp/empty.png rename to debian/pyqtmenu/usr/share/pyqtmenu/app_example/empty.png diff --git a/debian/pyqtmenu/usr/share/pyqtmenu/app_example/tab_example/onglet_1/empty1.desktop b/debian/pyqtmenu/usr/share/pyqtmenu/app_example/tab_example/onglet_1/empty1.desktop new file mode 100755 index 0000000..379c401 --- /dev/null +++ b/debian/pyqtmenu/usr/share/pyqtmenu/app_example/tab_example/onglet_1/empty1.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Name=Appli-Exemple +Type=Application +Comment=Ceci est un exemple d application +Exec=/usr/share/pyqtmenu/app_example/empty +TryExec=/usr/share/pyqtmenu/app_example/empty +Icon=/usr/share/pyqtmenu/app_example/empty.png +Keywords=NoneA diff --git a/config.py b/debian/pyqtmenu/usr/share/pyqtmenu/config.py similarity index 97% rename from config.py rename to debian/pyqtmenu/usr/share/pyqtmenu/config.py index e15dc67..e241cbf 100644 --- a/config.py +++ b/debian/pyqtmenu/usr/share/pyqtmenu/config.py @@ -3,12 +3,13 @@ import os import configparser - ####### Config paths ###################### HOME = os.getenv("HOME") CONFIG_PATH = f"{HOME}/.config/pyqtmenu" APP_SAVE_FILE = f"{CONFIG_PATH}/app_save.json" USER_CONFIG = f"{CONFIG_PATH}/config.ini" +DESKTOP_FILES_PATH = f"{CONFIG_PATH}/Apps" +APP_TAB_EXAMPLE = "/usr/share/pyqtmenu/app_example/tab_example" ###### User define parameters ############# CONFIG = configparser.ConfigParser() diff --git a/ui/dialogs.py b/debian/pyqtmenu/usr/share/pyqtmenu/dialogs.py similarity index 100% rename from ui/dialogs.py rename to debian/pyqtmenu/usr/share/pyqtmenu/dialogs.py diff --git a/Apps_example/GuitarAccord/app/__init__.py b/debian/pyqtmenu/usr/share/pyqtmenu/layout_manager/__init__.py similarity index 100% rename from Apps_example/GuitarAccord/app/__init__.py rename to debian/pyqtmenu/usr/share/pyqtmenu/layout_manager/__init__.py diff --git a/ui/layout_manager/layout_manager.py b/debian/pyqtmenu/usr/share/pyqtmenu/layout_manager/layout_manager.py similarity index 100% rename from ui/layout_manager/layout_manager.py rename to debian/pyqtmenu/usr/share/pyqtmenu/layout_manager/layout_manager.py diff --git a/ui/layout_manager/layout_manager_tab.py b/debian/pyqtmenu/usr/share/pyqtmenu/layout_manager/layout_manager_tab.py similarity index 100% rename from ui/layout_manager/layout_manager_tab.py rename to debian/pyqtmenu/usr/share/pyqtmenu/layout_manager/layout_manager_tab.py diff --git a/ui/parse_desktop_file.py b/debian/pyqtmenu/usr/share/pyqtmenu/parse_desktop_file.py similarity index 97% rename from ui/parse_desktop_file.py rename to debian/pyqtmenu/usr/share/pyqtmenu/parse_desktop_file.py index 4507749..5f94523 100644 --- a/ui/parse_desktop_file.py +++ b/debian/pyqtmenu/usr/share/pyqtmenu/parse_desktop_file.py @@ -15,7 +15,8 @@ from config import ( ICON_PATHS, ICON_SIZES, CONFIG, - CONFIG_PATH, APP_SAVE_FILE, ICON_DEFAULT + CONFIG_PATH, APP_SAVE_FILE, ICON_DEFAULT, + DESKTOP_FILES_PATH, ) @@ -48,7 +49,7 @@ def get_app_from_desktop(): app_dct = {} # parse .desktop file if it's new - path_desktop = "Apps/*/*.desktop" + path_desktop = f"{DESKTOP_FILES_PATH}/*/*.desktop" for file in glob.iglob(path_desktop): hex_hash = hash_file(file) diff --git a/Apps_example/QrcoPy/qrcopy b/debian/pyqtmenu/usr/share/pyqtmenu/pyqtmenu.py similarity index 64% rename from Apps_example/QrcoPy/qrcopy rename to debian/pyqtmenu/usr/share/pyqtmenu/pyqtmenu.py index 4c10c7a..0cf1e43 100755 --- a/Apps_example/QrcoPy/qrcopy +++ b/debian/pyqtmenu/usr/share/pyqtmenu/pyqtmenu.py @@ -1,17 +1,16 @@ -#!/usr/bin/python3 +#! /usr/bin/python3 # -*- coding: utf-8 -*- -""" -@Author=Daguhh -""" - import sys -from app.qrcopy import Example from PyQt5.QtWidgets import QApplication +from window import MainWindow + + + if __name__ == '__main__': app = QApplication(sys.argv) - ex = Example() + ex = MainWindow() sys.exit(app.exec_()) diff --git a/ui/qss.py b/debian/pyqtmenu/usr/share/pyqtmenu/qss.py similarity index 100% rename from ui/qss.py rename to debian/pyqtmenu/usr/share/pyqtmenu/qss.py diff --git a/debian/pyqtmenu/usr/share/pyqtmenu/window.py b/debian/pyqtmenu/usr/share/pyqtmenu/window.py new file mode 100755 index 0000000..fd1c9e5 --- /dev/null +++ b/debian/pyqtmenu/usr/share/pyqtmenu/window.py @@ -0,0 +1,566 @@ +#! /usr/bin/python3 +# -*- coding: utf-8 -*- + + +""" +A simple menu to display .desktop files. +Powered by PyQt5. + +@Author = Daguhh +""" + +# Standard +import sys +import os +from itertools import product, count +import subprocess +import time +# import sip + +# Installed +from PyQt5.QtCore import QSize +from PyQt5.QtCore import Qt, QByteArray +from PyQt5.QtGui import QPixmap, QIcon, QFont, QImage # QStaticText, QColor, +from PyQt5.QtCore import QThreadPool, QRunnable, pyqtSlot +from PyQt5.QtWidgets import ( + QDialog, + QMainWindow, + QScrollArea, + QWidget, + QTabWidget, + QHBoxLayout, + QVBoxLayout, + QAction, + QLabel, + QApplication, + QPushButton, + QGridLayout, + QSizePolicy, + QGraphicsOpacityEffect, + QFrame, + QCheckBox, + QMessageBox, +) + +# Local +from parse_desktop_file import get_app_from_desktop, parse_desktop_lang +import qss as qss +from layout_manager.layout_manager_tab import LayoutMgr +from dialogs import AskMultipleValues +import config as cf + + +class MainWindow(QMainWindow): + + instance = None + + def __init__(self): + + super().__init__() + self.title = cf.MENU_TITLE + self.setWindowTitle(self.title) + MainWindow.instance = self + + # Create conf files if do not exist + make_configs() + # Load conf files + self.load_config() + + self.initUI() + self.enable_modules() + + def initUI(self): + """Create main window""" + + #### Status bar #### + self.statusBar() + + #### Menubar #### + # Close app + exitAct = QAction(text="&Exit", parent=self) + exitAct.setShortcut("Ctrl+Q") + exitAct.setStatusTip("Exit application") + exitAct.triggered.connect(QApplication.quit) + + saveAct = QAction(text="Save config", parent=self) + saveAct.setStatusTip("Save menu configuration") + saveAct.triggered.connect(self.save_config) + + delnreloadAct = QAction(text="Reset", parent = self) + delnreloadAct.setShortcut('Ctrl+R') + delnreloadAct.setStatusTip("Delete configurations files and reload the menu") + delnreloadAct.triggered.connect(self.del_n_reload) + + #  Resize icons + resizeiconAct = QAction(text="&Resize Icons", parent=self) + resizeiconAct.triggered.connect(self.resize_icons) + + #  Create menubar + menubar = self.menuBar() + fileMenu = menubar.addMenu("&Fichier") + fileMenu.addAction(exitAct) + fileMenu.addAction(saveAct) + fileMenu.addAction(delnreloadAct) + EditMenu = menubar.addMenu("&Edition") + EditMenu.addAction(resizeiconAct) + themeMenu = EditMenu.addMenu("Icon theme") + + # Change icon theme + for theme in cf.CONFIG["Themes"]: + iconAct = QAction(text=theme, parent=self) + iconAct.triggered.connect(self.set_icon_theme) + themeMenu.addAction(iconAct) + + #### control panel #### + window = QWidget() + self.setCentralWidget(window) + + # Reduce mainwindow pushbutton + reduceBtn = QPushButton("M") + reduceBtn.setFixedSize(50, 50) + reduceBtn.setToolTip("Réduire le menu") + reduceBtn.setFont(QFont("Times", 32)) + reduceBtn.clicked.connect(MainWindow.reduce_mainwindow) + + # Toggle two panel view + self.twopanelCb = QCheckBox() # "Vue à deux panneaux") + self.twopanelCb.setToolTip( + "Disposer les fenêtres en deux panneaux séparées verticalement" + ) + self.twopanelCb.setIcon(iconFromBase64(cf.DUAL_PANEL_ICON)) + cf.CONFIG["Options"].getboolean("autoclose") + self.twopanelCb.setChecked(cf.CONFIG["Options"].getboolean("dualpanel")) + + # Toggle reduce mode + self.reduceCb = QCheckBox() # "Réduire le menu") + self.reduceCb.setIcon(QIcon(iconFromBase64(cf.REDUCE_ICON))) + self.reduceCb.setToolTip("Réduire le menu au lancement d'une application") + self.reduceCb.setChecked(cf.CONFIG["Options"].getboolean("autoclose")) + + #### Tabs #### + # Create app launcher tabs + self.table_widget = TabsContainer(parent=self) + + # Add Modules + self.layout_mgr = LayoutMgr() + self.table_widget.addtabmodule(self.layout_mgr, "layout") + + self.twopanelCb.stateChanged.connect(self.layout_mgr.refresh) + + # Window + vbox = QVBoxLayout() + window.setLayout(vbox) + hbox = QHBoxLayout() + vbox.addLayout(hbox) + hbox.addWidget(reduceBtn) + hbox.addStretch(1) + vbox2 = QVBoxLayout() + vbox2.addWidget(self.twopanelCb) + vbox2.addWidget(self.reduceCb) + hbox.addLayout(vbox2) + vbox.addWidget(self.table_widget) + + self.show() + + def load_config(self): + """Load user-defined MainWindow paramerters""" + + x = int(cf.CONFIG["Window"]["x"]) + y = int(cf.CONFIG["Window"]["y"]) + self.resize(x, y) + + def save_config(self): + """Save user preferences in a text file""" + + cf.CONFIG["Options"]["autoclose"] = str(self.reduceCb.isChecked()) + cf.CONFIG["Options"]["dualpanel"] = str(self.twopanelCb.isChecked()) + + with open(cf.USER_CONFIG, "w") as configfile: + cf.CONFIG.write(configfile) + + def del_config(self): + """remove config files""" + + os.system(f"rm -Rf {cf.USER_CONFIG}") + + def del_n_reload(self): + + self.del_config() + restart_program() + + def enable_modules(self): + """Enable optional modules""" + + # check if i3wm is running + cmd = r'wmctrl -m | sed -nr "s/Name: (.*)/\1/p"' + wm_name = subprocess.check_output(cmd, shell=True, text=True).rstrip() + if wm_name != "i3": + self.twopanelCb.setDisabled(True) + self.twopanelCb.setToolTip( + "Dual Panel module : please install and run i3wm" + ) + self.layout_mgr.setToolTip( + "Dual Panel module : please install and run i3wm" + ) + + def get_size_value(self, *args): + """Get new icon size from dialog""" + + dialog = AskMultipleValues(*args) + if dialog.exec_(): + vals = dialog.get_values() + else: + vals = dialog.cancel() + return vals + + @classmethod + def reduce_mainwindow(cls): + """Toggle reduce mode and big picture from button activation""" + + #if cls.instance.reduceCb.isChecked() == False: + # return + dialog = ReduceModButton() + MainWindow.instance.hide() + if dialog.exec_(): + vals = dialog.accept() + cls.instance.show() + else: + QApplication.quit() + return + + def resize_icons(self): + """ resize all launchers icons, resize icon grid too""" + + x, y, test = self.get_size_value("x", "y") + cf.CONFIG["Icon"]["x"] = x + cf.CONFIG["Icon"]["y"] = y + x, y = int(x), int(y) + + if test: + for launcher in AppLauncherBtn.instances.values(): + launcher.resize_icons(x, y) + for tab in Tab.instances.values(): + tab.launcher_size = (x, y) + tab.setMinimumWidth(int(x) + 20) + + def set_icon_theme(self): + """Change all icon theme""" + + theme = self.sender().text() + cf.CONFIG["Icon"]["theme"] = theme + + for launcher in AppLauncherBtn.instances.values(): + launcher.set_icon_theme(theme) + + def resizeEvent(self, event): + """Capture new window size for saving purpose""" + + x, y = self.size().width(), self.size().height() + cf.CONFIG["Window"]["x"] = str(x) + cf.CONFIG["Window"]["y"] = str(y) + + +class ReduceModButton(QDialog): + """ button that reopen main window """ + + def __init__(self): + + super(QDialog, self).__init__() + self.layout = QGridLayout(self) # QVBoxLayout(self) + + # Button properties + reopen_button = QPushButton("M") + reopen_button.setGeometry(0, 0, 100, 100) + reopen_button.setStatusTip("Afficher le menu en plein écran") + reopen_button.clicked.connect(self.accept) + reopen_button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) + reopen_button.setStyleSheet("background-color:rgba(55,55,55,15);") + reopen_button.setFont(QFont("Times", 48)) + self.setGeometry(0, 0, 150, 150) + + # Position on screen + dialog_size = self.geometry().getRect() + desktop_size = QApplication.desktop().screenGeometry().getRect() + *_, x, y = map(lambda x, y: y - x - 30, dialog_size, desktop_size) + self.move(x, y) + + # Add trnasparency + self.layout.addWidget(reopen_button) + op = QGraphicsOpacityEffect(self) + op.setOpacity(0.5) # 0 to 1 will cause the fade effect to kick in + self.setGraphicsEffect(op) + self.setAutoFillBackground(True) + self.setAttribute(Qt.WA_TranslucentBackground) + self.setWindowFlags(Qt.FramelessWindowHint) + + +class TabsContainer(QWidget): + """ + A container (Qwidget) to hold all category tabs + at call it loops over desktop files, create new category tab, + and fill them with launcher for apps + """ + + def __init__(self, parent): + super(QWidget, self).__init__(parent) + self.layout = QVBoxLayout(self) + + # Initialize tab screen + self.tabs = QTabWidget() + x = int(cf.CONFIG["Window"]["x"]) + y = int(cf.CONFIG["Window"]["y"]) + # self.tabs.resize(x, y) + + # get all apps + app_list = get_app_from_desktop() + + # Create tabs and give them a name + categories = set([app["category"] for app in app_list]) + for category in categories: + tab = ScrollTab(category) + name = category + self.tabs.addTab(tab, name) + + # Fill tabs with apps with launchers + for app in app_list: + category = app["category"] + Tab.instances[category].addLauncher(app) + + # Add tabs to widget + self.layout.addWidget(self.tabs) + self.setLayout(self.layout) + + def addtabmodule(self, module, tab_name): + + self.tabs.addTab(module, tab_name) + + +class ScrollTab(QScrollArea): + """ + Make tab vertically scrollable + """ + + def __init__(self, category): + + super(QScrollArea, self).__init__() + self.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) + self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) + self.setWidgetResizable(True) + + self.widget = Tab(category) + self.setWidget(self.widget) + + +class Tab(QWidget): + """ + A tab for each category, + support .desktop files dropEvent + laucnhers are display on a grid that reshapes on window resizeEvent + """ + + instances = {} + + def __init__(self, category): + """ Create an empty tab """ + super(QWidget, self).__init__() + + self.setAcceptDrops(True) + + # max launcher in 1 Tab + + # keep track of all created categories + self.category = category + Tab.instances[category] = self + + # keep track of launchers + self.launcher_list = [] + + # Init grid, its shape and a generator to fill it + self.layout = QGridLayout(self) + + # self.shape = (3,5) # 3x3 squares + self.width = 3 + self.max_launcher = 100 # useless? + self.gen_position = self.genPos() + + x = int(cf.CONFIG["Icon"]["x"]) + y = int(cf.CONFIG["Icon"]["y"]) + self.launcher_size = (x, y) + + self.setMinimumWidth((self.launcher_size[0] * 1.3)) + + def addLauncher(self, app): + """ create a button to launch app, store it as "button" key""" + + app["button"] = AppLauncherBtn( + self.layout, app, next(self.gen_position), size=self.launcher_size + ) + self.launcher_list += [app] + + def genPos(self): + """ + Create a generator that return positions, + line by line, to fill a 2-dimensions grid + args: + shape(tuple) : (x,y) dimensions of the array to fill + return: + generator + """ + + i = 0 + while i <= self.max_launcher: # shape[0] * shape[1]: + x = i // self.width + y = i % self.width + yield (x, y) + i += 1 + + def resizeEvent(self, event): + """ Modify grid shape as window is resized """ + + tab_x = self.size().width() + + new_width = tab_x // self.launcher_size[0] + if self.width != new_width: + self.width = new_width + self.refresh() + + def refresh(self): + + self.gen_position = self.genPos() + + for app in self.launcher_list: + self.layout.removeItem(app["button"].layout) + for app in self.launcher_list: + x, y = next(self.gen_position) + self.layout.addWidget(app["button"], x, y) + + def dragEnterEvent(self, e): + """ A useless method """ + + if e.mimeData().hasFormat("text/uri-list"): + e.accept() + else: + e.ignore() + + def dropEvent(self, e): + """ As desktop file is dropped on a tab, create a new launcher """ + + file_path = e.mimeData().urls()[0].path() # split('//')[1:][0] + app = parse_desktop_lang(file_path) + file_name = file_path.split("/")[-1] + os.system(f"cp {file_path} Apps/{self.category}/{file_name}") + self.addLauncher(app) + + +class AppLauncherBtn(QFrame): + instances = {} + + def __init__(self, parent_tab, app, pos, size): + + super(QFrame, self).__init__() + + self.icon_size = (int(size[0]), int(size[1])) + self.setFixedSize(size[0] + 20, size[1] + 35) + self.setStyleSheet(qss.APP_LAUNCHER_QSS) + + name, self.icons, tooltip = app["Name"], app["Icon"], app["Comment"] + icon = self.icons[cf.CONFIG["Icon"]["theme"]] + + self.btn = QPushButton() + self.btn.setIcon(QIcon(QPixmap(icon))) + self.btn.setIconSize(QSize(*self.icon_size)) + self.btn.setStyleSheet(qss.APP_BUTTON_QSS) + self.btn.setToolTip(tooltip) + self.btn.clicked.connect(self.run_app) + + txt = QLabel(name) + txt.setAlignment(Qt.AlignHCenter) + txt.setStyleSheet(qss.APP_LABEL_QSS) + + self.layout = QVBoxLayout(self) + self.layout.addWidget(self.btn) + self.layout.addWidget(txt) + self.setLayout(self.layout) + + self.threadpool = QThreadPool() + self.app_command = app["Exec"] + + parent_tab.addWidget(self, *pos) + + AppLauncherBtn.instances[name] = self + + def run_app(self): + + app_runner = AppRunner(self.app_command) + self.threadpool.start(app_runner) + MainWindow.reduce_mainwindow() + + # def remove(self): + # + # print('========= removed ================') + # + # self.layout.removeWidget(self.widget_name) + # sip.delete(self.widget_name) + # self.widget_name = None + + def resize_icons(self, size_x, size_y): + + self.setFixedSize(size_x + 20, size_y + 35) + self.btn.setIconSize(QSize(size_x, size_y)) + + def set_icon_theme(self, theme): + + icon = self.icons[theme] + self.btn.setIcon(QIcon(QPixmap(icon))) + + +class AppRunner(QRunnable): + """ Run app in a thread """ + + def __init__(self, app_command): + + super(AppRunner, self).__init__() + self.command = app_command + + @pyqtSlot() + def run(self): + self.command() + + +def iconFromBase64(base64): + """Read menu icon images from base64 string""" + + pixmap = QPixmap() + pixmap.loadFromData(QByteArray.fromBase64(base64)) + icon = QIcon(pixmap) + return icon + +def restart_program(): + """Reload menu""" + + python = sys.executable + os.execl(python, python, *sys.argv) + +def make_configs(): + """Create config dir/files if they don't exist""" + + if not os.path.isdir(cf.CONFIG_PATH): + os.makedirs(cf.CONFIG_PATH) + os.system(f"cp -R {cf.APP_TAB_EXAMPLE} {cf.DESKTOP_FILES_PATH}/") + os.system(f"cp -R {cf.APP_TAB_EXAMPLE} {cf.DESKTOP_FILES_PATH}/") + + if not os.path.exists(cf.USER_CONFIG): + with open(cf.USER_CONFIG, "w") as user_conf: + user_conf.write(cf.DEFAULT_CONF_INI) + print("========= Restarting =================") + restart_program() + if not os.path.exists(cf.APP_SAVE_FILE): + pass + + +if __name__ == "__main__": + + app = QApplication(sys.argv) + ex = MainWindow() + sys.exit(app.exec_()) + diff --git a/debian/pyqtmenu/usr/share/python3/runtime.d/pyqtmenu.rtupdate b/debian/pyqtmenu/usr/share/python3/runtime.d/pyqtmenu.rtupdate new file mode 100755 index 0000000..8b6fb00 --- /dev/null +++ b/debian/pyqtmenu/usr/share/python3/runtime.d/pyqtmenu.rtupdate @@ -0,0 +1,7 @@ +#! /bin/sh +set -e + +if [ "$1" = rtupdate ]; then + py3clean -p pyqtmenu /usr/share/pyqtmenu + py3compile -p pyqtmenu /usr/share/pyqtmenu +fi \ No newline at end of file diff --git a/debian/readme.txt b/debian/readme.txt new file mode 100644 index 0000000..37efd18 --- /dev/null +++ b/debian/readme.txt @@ -0,0 +1,42 @@ +******** +PyQtMenu +******** + +A PyQt5 menu to display my apps or any .desktop file + +* Display desktop files into multiple tab, +* Drag'n'Drop desktop file to add it in menu + +new : + +* Reduce mode : reduce launcher to a small floating button at application lauch +* Dual panel view (with i3) : control windows positions from tab "layout" + + .. image:: https://raw.githubusercontent.com/Daguhh/PyQtMenu/reduce_mod/Screenshots/screens.gif + :width: 200px + :align: center + :alt: PyQtMenu preview + +Add a launcher +############### + +You should have a .desktop file with the following entries:: + + [Desktop Entry] + Name=My_App_Name + Comment=My App Description + Exec=My/app/path/my_app + Icon=My/icon/path/my_icon.png + +Put it under:: + + Apps/your_catergory/my_app.desktop + +or drag 'n' drop it to the wanted category tab + +Usage +##### + +Just run:: + + ./pyqtmenu diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..1cdf645 --- /dev/null +++ b/debian/rules @@ -0,0 +1,25 @@ +#!/usr/bin/make -f +# See debhelper(7) (uncomment to enable) +# output every command that modifies files on the build system. +#export DH_VERBOSE = 1 + + +# see FEATURE AREAS in dpkg-buildflags(1) +#export DEB_BUILD_MAINT_OPTIONS = hardening=+all + +# see ENVIRONMENT in dpkg-buildflags(1) +# package maintainers to append CFLAGS +#export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic +# package maintainers to append LDFLAGS +#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed + + +%: + dh $@ --with=python3 --buildsystem=pybuild + + +# dh_make generated override targets +# This is example for Cmake (See https://bugs.debian.org/641051 ) +#override_dh_auto_configure: +# dh_auto_configure -- \ +# -DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH) diff --git a/debian/source/format b/debian/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/load_config.py b/load_config.py deleted file mode 100644 index 4f66b2d..0000000 --- a/load_config.py +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env python3 - -import configparser - -from config import USER_CONFIG - -CONFIG = configparser.ConfigParser() -CONFIG.read(USER_CONFIG) - - - - diff --git a/pyqtmenu-start b/pyqtmenu-start new file mode 100755 index 0000000..e54e972 --- /dev/null +++ b/pyqtmenu-start @@ -0,0 +1,21 @@ +#!/bin/bash + +/usr/share/pyqtmenu/pyqtmenu.py + + +##!/usr/bin/env python3 +## -*- coding: utf-8 -*- +# +#import sys +# +#from PyQt5.QtWidgets import QApplication +# +#from ui.window import MainWindow +# +# +# +#if __name__ == '__main__': +# +# app = QApplication(sys.argv) +# ex = MainWindow() +# sys.exit(app.exec_()) diff --git a/pyqtmenu.desktop b/pyqtmenu.desktop new file mode 100755 index 0000000..efee14e --- /dev/null +++ b/pyqtmenu.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Name=PyQtMenu +Comment=Simple menu for debian +Comment[fr]=Menu simple pour debian +Exec=/usr/bin/pyqtmenu-start +Path=/usr/share/pyqtmenu +Icon=pyqtmenu +StartupNotify=true +Terminal=false +Type=Application +Categories=Utility; diff --git a/Apps_example/QrcoPy/app/__init__.py b/pyqtmenu/__init__.py similarity index 100% rename from Apps_example/QrcoPy/app/__init__.py rename to pyqtmenu/__init__.py diff --git a/ui/__init__.py b/pyqtmenu/app_example/app/__init__.py similarity index 100% rename from ui/__init__.py rename to pyqtmenu/app_example/app/__init__.py diff --git a/Apps_example/EmptyApp/app/empty.py b/pyqtmenu/app_example/app/empty.py similarity index 100% rename from Apps_example/EmptyApp/app/empty.py rename to pyqtmenu/app_example/app/empty.py diff --git a/Apps_example/EmptyApp/empty b/pyqtmenu/app_example/empty similarity index 100% rename from Apps_example/EmptyApp/empty rename to pyqtmenu/app_example/empty diff --git a/Apps/ExampleTab/empty4.desktop b/pyqtmenu/app_example/empty.desktop similarity index 93% rename from Apps/ExampleTab/empty4.desktop rename to pyqtmenu/app_example/empty.desktop index 1b37020..52259ed 100755 --- a/Apps/ExampleTab/empty4.desktop +++ b/pyqtmenu/app_example/empty.desktop @@ -1,5 +1,5 @@ [Desktop Entry] -Name=EmptyApp4 +Name=EmptyApp Type=Application Comment=this is not an app,\n this is an empty example Exec=Apps_example/EmptyApp/empty diff --git a/pyqtmenu/app_example/empty.png b/pyqtmenu/app_example/empty.png new file mode 100644 index 0000000..41d829f Binary files /dev/null and b/pyqtmenu/app_example/empty.png differ diff --git a/pyqtmenu/app_example/tab_example/onglet_1/empty1.desktop b/pyqtmenu/app_example/tab_example/onglet_1/empty1.desktop new file mode 100755 index 0000000..379c401 --- /dev/null +++ b/pyqtmenu/app_example/tab_example/onglet_1/empty1.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Name=Appli-Exemple +Type=Application +Comment=Ceci est un exemple d application +Exec=/usr/share/pyqtmenu/app_example/empty +TryExec=/usr/share/pyqtmenu/app_example/empty +Icon=/usr/share/pyqtmenu/app_example/empty.png +Keywords=NoneA diff --git a/pyqtmenu/config.py b/pyqtmenu/config.py new file mode 100644 index 0000000..e241cbf --- /dev/null +++ b/pyqtmenu/config.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 + +import os +import configparser + +####### Config paths ###################### +HOME = os.getenv("HOME") +CONFIG_PATH = f"{HOME}/.config/pyqtmenu" +APP_SAVE_FILE = f"{CONFIG_PATH}/app_save.json" +USER_CONFIG = f"{CONFIG_PATH}/config.ini" +DESKTOP_FILES_PATH = f"{CONFIG_PATH}/Apps" +APP_TAB_EXAMPLE = "/usr/share/pyqtmenu/app_example/tab_example" + +###### User define parameters ############# +CONFIG = configparser.ConfigParser() +CONFIG.read(USER_CONFIG) + +###### Icon paths ######################### +ICON_PATHS = [f'{HOME}/.local/share/icons', '/usr/share/icons'] +ICON_SIZES = [512, 310, 256, 192, 150, 128, 96, 72, 64, 48, 44, 42, 36, 32, 24, 22, 16, 8] +ICON_DEFAULT = "/Apps_example/EmptyApp/empty.png" + +###### App names ######################### +MENU_NAME = "pyqtmenu" +MENU_TITLE = "PyQtMenu" + +##### I3 related parameters ############### +I3_RIGHT = "right" +I3_LEFT = "left" + +##### Default user parameters ############ +DEFAULT_CONF_INI = """ +[Icon] +x = 150 +y = 60 +theme = moka + +[Themes] +hicolor = hicolor, oxygen/base, Moka, Faba +moka = Moka, oxygen/base, hicolor, Faba +oxygen = oxygen/base, hicolor +faba = Faba, hicolor + +[Window] +x = 723 +y = 467 + +[Options] +dualpanel = False +autoclose = True +""" + + +########## Base64 Icons ############# + +DUAL_PANEL_ICON = b'iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5AgdDg0xPexkygAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAbjSURBVDgRAdgGJ/kBQEA7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMlM7MlM4AAAC119y119wAAAD7+Yn7+YkAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUBAOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAv7/EAAAAAAAAAAAAAAAAAAAAAAAAAAAAQUE8AAAAv7/EAAAAAAAAAAAAAAAAAAAAAAAAAAAAQUE8AAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQEA7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCyhaH5OwuHQAAAABJRU5ErkJggg==' + +REDUCE_ICON = b'iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABOElEQVRIib2WsW6DMBCGf6MMHtNHSF8h3WCwX6UDEpGqRDxGpEap+kAeyh5lqaJGCs3GFkYPSO4EMjGxTSD9Nk62//u58wFhLFR4IBP9QYjMupjzyFhniwFAMDxHB4yF6lEwFirDwWIRI45fUZaXUQwYAlVV4Xj8QZouRxExBNbrd8xmz8jz090inEdNoQ2B6fQJm82Hl0iSxP0d9BE5HL47DxUia9q2U0Ap1cuJtwMpJaSUvZ04BeqiUEpBKQUhxCmy3+9uHmotchddIln25eWAMBYq1wyqKcsL0nSJPD81MdteziP/WVQUBc7nX8znL75bIETWnqbXJEl8sxUBIAjc+RH9e+D7qnT00axjvQdjMtHVhrDdfgIAVqu3Vvx/HIzBdeY1rZus4xtzMdiBq37k3t8W38b4A7no/T+ULYZFAAAAAElFTkSuQmCC' diff --git a/pyqtmenu/dialogs.py b/pyqtmenu/dialogs.py new file mode 100644 index 0000000..769f3b7 --- /dev/null +++ b/pyqtmenu/dialogs.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 + +from PyQt5.QtCore import Qt +from PyQt5.QtWidgets import ( + QDialog, + QPushButton, + QLabel, + QGridLayout, + QLineEdit, +) + + +class IconThemeChoose(QDialog): + """ Dialog popup to chose an Icon """ + pass + +class AskMultipleValues(QDialog): + """ Dialog to resize icon """ + + def __init__(self, *args, **kwargs): + + super(QDialog, self).__init__() + self.layout = QGridLayout(self) # QVBoxLayout(self) + self.textEdits = [] + + for i, item in enumerate(args): + text = QLabel(item) + textEdit = QLineEdit() + self.textEdits.append(textEdit) + self.layout.addWidget(text, i, 0) + self.layout.addWidget(textEdit, i, 1, 1, 2) + + ok_btn = QPushButton("Ok") + ok_btn.clicked.connect(self.accept) + + cancel_btn = QPushButton("Cancel") + cancel_btn.clicked.connect(self.close) + + self.layout.addWidget(cancel_btn, i + 1, 1) + self.layout.addWidget(ok_btn, i + 1, 2) + + def keyPressEvent(self, e): + if e.key() == Qt.Key_Return: + self.accept() + elif e.key() == Qt.Key_Escape: + self.close() + + def get_values(self): + vals = [] + for textEdit in self.textEdits: + vals.append(textEdit.text()) + try: + if any([int(val) >= 1 for val in vals]): + return (*vals, True) + else: + raise ValueError("Size must be >= 1") + except ValueError as e: + print(f"{e}\nwrong value for icon size") + return 0, 0, False + + def cancel(self): + return 0, 0, False + diff --git a/pyqtmenu/icons/dual_panel.png b/pyqtmenu/icons/dual_panel.png new file mode 100644 index 0000000..d49ecc4 Binary files /dev/null and b/pyqtmenu/icons/dual_panel.png differ diff --git a/pyqtmenu/icons/reduce.png b/pyqtmenu/icons/reduce.png new file mode 100644 index 0000000..cef6491 Binary files /dev/null and b/pyqtmenu/icons/reduce.png differ diff --git a/ui/layout_manager/__init__.py b/pyqtmenu/layout_manager/__init__.py similarity index 100% rename from ui/layout_manager/__init__.py rename to pyqtmenu/layout_manager/__init__.py diff --git a/pyqtmenu/layout_manager/layout_manager.py b/pyqtmenu/layout_manager/layout_manager.py new file mode 100644 index 0000000..565f544 --- /dev/null +++ b/pyqtmenu/layout_manager/layout_manager.py @@ -0,0 +1,86 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'layout_manager.ui' +# +# Created by: PyQt5 UI code generator 5.15.0 +# +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets + + +class Ui_LayoutManagerWidget(object): + def setupUi(self, LayoutManagerWidget): + LayoutManagerWidget.setObjectName("LayoutManagerWidget") + LayoutManagerWidget.setWindowModality(QtCore.Qt.WindowModal) + LayoutManagerWidget.resize(581, 419) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.MinimumExpanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(LayoutManagerWidget.sizePolicy().hasHeightForWidth()) + LayoutManagerWidget.setSizePolicy(sizePolicy) + LayoutManagerWidget.setFocusPolicy(QtCore.Qt.NoFocus) + LayoutManagerWidget.setContextMenuPolicy(QtCore.Qt.NoContextMenu) + self.gridLayout_2 = QtWidgets.QGridLayout(LayoutManagerWidget) + self.gridLayout_2.setObjectName("gridLayout_2") + self.leftlistWidget = QtWidgets.QListWidget(LayoutManagerWidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.MinimumExpanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.leftlistWidget.sizePolicy().hasHeightForWidth()) + self.leftlistWidget.setSizePolicy(sizePolicy) + self.leftlistWidget.setFrameShape(QtWidgets.QFrame.StyledPanel) + self.leftlistWidget.setFrameShadow(QtWidgets.QFrame.Sunken) + self.leftlistWidget.setMidLineWidth(0) + self.leftlistWidget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + self.leftlistWidget.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents) + self.leftlistWidget.setResizeMode(QtWidgets.QListView.Adjust) + self.leftlistWidget.setObjectName("leftlistWidget") + self.gridLayout_2.addWidget(self.leftlistWidget, 0, 0, 7, 1) + self.moveleftBtn = QtWidgets.QPushButton(LayoutManagerWidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.moveleftBtn.sizePolicy().hasHeightForWidth()) + self.moveleftBtn.setSizePolicy(sizePolicy) + self.moveleftBtn.setMaximumSize(QtCore.QSize(30, 16777215)) + self.moveleftBtn.setObjectName("moveleftBtn") + self.gridLayout_2.addWidget(self.moveleftBtn, 2, 1, 1, 1) + self.rightlistWidget = QtWidgets.QListWidget(LayoutManagerWidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.MinimumExpanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.rightlistWidget.sizePolicy().hasHeightForWidth()) + self.rightlistWidget.setSizePolicy(sizePolicy) + self.rightlistWidget.setFocusPolicy(QtCore.Qt.NoFocus) + self.rightlistWidget.setFrameShape(QtWidgets.QFrame.StyledPanel) + self.rightlistWidget.setFrameShadow(QtWidgets.QFrame.Sunken) + self.rightlistWidget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + self.rightlistWidget.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents) + self.rightlistWidget.setResizeMode(QtWidgets.QListView.Adjust) + self.rightlistWidget.setObjectName("rightlistWidget") + self.gridLayout_2.addWidget(self.rightlistWidget, 0, 2, 7, 1) + spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.gridLayout_2.addItem(spacerItem, 4, 1, 1, 1) + spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.gridLayout_2.addItem(spacerItem1, 1, 1, 1, 1) + self.moverightBtn = QtWidgets.QPushButton(LayoutManagerWidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.moverightBtn.sizePolicy().hasHeightForWidth()) + self.moverightBtn.setSizePolicy(sizePolicy) + self.moverightBtn.setMaximumSize(QtCore.QSize(30, 16777215)) + self.moverightBtn.setObjectName("moverightBtn") + self.gridLayout_2.addWidget(self.moverightBtn, 3, 1, 1, 1) + + self.retranslateUi(LayoutManagerWidget) + QtCore.QMetaObject.connectSlotsByName(LayoutManagerWidget) + + def retranslateUi(self, LayoutManagerWidget): + _translate = QtCore.QCoreApplication.translate + LayoutManagerWidget.setWindowTitle(_translate("LayoutManagerWidget", "Form")) + self.moveleftBtn.setText(_translate("LayoutManagerWidget", "<")) + self.moverightBtn.setText(_translate("LayoutManagerWidget", ">")) diff --git a/ui/layout_manager/layout_manager.ui b/pyqtmenu/layout_manager/layout_manager.ui similarity index 100% rename from ui/layout_manager/layout_manager.ui rename to pyqtmenu/layout_manager/layout_manager.ui diff --git a/pyqtmenu/layout_manager/layout_manager_tab.py b/pyqtmenu/layout_manager/layout_manager_tab.py new file mode 100644 index 0000000..c5dba42 --- /dev/null +++ b/pyqtmenu/layout_manager/layout_manager_tab.py @@ -0,0 +1,232 @@ +#!/usr/bin/env python3 + +import subprocess +import os +import time +from itertools import product, chain + +from PyQt5.QtWidgets import ( + QDialog, + QWidget, + QHBoxLayout, + QVBoxLayout, + QLabel, + QPushButton, + QListWidgetItem, + QFrame, +) +from PyQt5.QtCore import Qt + +from .layout_manager import Ui_LayoutManagerWidget + +class LayoutMgr(QWidget): + def __init__(self, parent=None): + super().__init__(parent) + # Create an instance of the GUI + self.ui = Ui_LayoutManagerWidget() + # Run the .setupUi() method to show the GUI + self.ui.setupUi(self) + #self.ui.hbox.setWidgetResizable(True) + + self.tabbed = True + self.setDisabled(True) + + # list list + self.l_Qlist = self.ui.leftlistWidget + self.r_Qlist = self.ui.rightlistWidget + self.l_list = [] + self.r_list = [] + + self.connect_list() + + def enterEvent(self, e): + + if self.tabbed: + return + old_list = self.l_list + self.r_list + new_list = self.list_windows() + for new_w in new_list: + known = False + for old_w in old_list: + if new_w['id'] == old_w['id']: + known = True + break + if not known: + self.mark_window(new_w) + + + id_from = new_w['id'] + mark_to = self.l_list[0]['mark'] + + cmd = f'''i3-msg "[id={id_from}] move to mark "{mark_to}""''' + subprocess.check_output(cmd, shell=True) + + + + #os.system(f"""i3-msg "[con_mark="{self.l_list[0]['mark']}"] focus" """) + #os.system(f""" i3-msg "[con_mark="{new_w['mark']}" move to mark "{self.l_list[0]['mark']}" " """) + #cmd = f'''i3-msg "[id={w['id']}] move to mark "{list_head_l_mark}""''' + self.l_list.append(new_w) + self.l_Qlist.addItem(new_w['name']) + + + def refresh(self): + + if self.sender().isChecked(): + + self.setEnabled(True) + self.tabbed = False + self.l_Qlist.clear() + self.r_Qlist.clear() + self.l_list = [] + self.r_list = [] + + #self.list_windows() + self.make_panels() + print("====== activated =========") + + else: + self.setDisabled(True) + self.tabbed = True + for i in range(len(self.l_list)): + #time.sleep(3) + self.l_Qlist.setCurrentRow(0) + self.moveright() + print('======== deactivate============') + + + @staticmethod + def list_windows(): + + # get window list and their id + # cmd = r"wmctrl -lx | sed -r 's/^(\w*).*?\.(\w*).*/\1,\2/'" + cmd = r"wmctrl -lx | sed -r 's/^(\w*)[^.]*\.(\w*).*/\1,\2/'" + out = subprocess.check_output(cmd, shell=True, text=True) + win_list = [ + {"name": w_name, "id": X11_id} + for X11_id, w_name in [line.split(",") for line in out.split("\n")][:-1] if w_name != "pyqtmenu" + ] + + return win_list + + def make_panels(self): + + self.l_list = self.list_windows() + self.r_list = [] + for win in self.l_list: + self.mark_window(win) + #self.mark_windows(self.l_list) + + #for i, w in enumerate(self.l_list): + #if w["mark"] == "A": # put window with mark A in right list + self.r_list.append(self.l_list.pop(0)) + + self.move_away(self.l_list, self.r_list[0]['mark'], "right") + #self.maketabbedcontainer(self.r_list[0]['mark']) + + print(self.l_list) + print('--------------') + print(self.r_list) + # show list item in QtListWidget + self.l_Qlist.addItems([w["name"] for w in self.l_list]) + self.r_Qlist.addItems([w["name"] for w in self.r_list]) + + def mark_window(self, win): + + mark = win['id'] + win['mark'] = mark + i3_cmd = f"[id={win['id']}] mark {mark}" + cmd = f'i3-msg "{i3_cmd}"' + subprocess.check_output(cmd, shell=True) + + return mark + + def mark_windows(self, w_list): + + # Mark all windows (see i3wm doc for mark) + alph = "ABCDEFGHIJKLMNOPQRSTU" + for mark, win in zip(alph, w_list): + win["mark"] = win['id'] #mark + i3_cmd = f"[id={win['id']}] mark {mark}" + cmd = f'i3-msg "{i3_cmd}"' + subprocess.check_output(cmd, shell=True) + + def move_away(self, el, mark, direction): + """ put window with {mark} out of any container toward {direction} """ + + nb_step = len(el) +3 # jump all window + 1 to get out of container + print(len(el)) + cmd = f'''i3-msg "[con_mark="{mark}"] move {direction}"''' + for i in range(nb_step): + subprocess.check_output(cmd, shell=True) + + def connect_list(self): + + self.ui.moveleftBtn.clicked.connect(self.moveleft) + self.ui.moverightBtn.clicked.connect(self.moveright) + + def maketabbedcontainer(self, mark): + + os.system(f"""i3-msg "[con_mark="{mark}"] split horizontal" """) + os.system(f"""i3-msg "[con_mark="{mark}"] focus, layout tabbed" """) + + def swap_list(self, sQl, eQl, sl, el): + + # sawp Qlist + s_item = sQl.takeItem(0) + while True: + e_item = eQl.takeItem(0) + if e_item == None: + break + sQl.addItem(e_item) + eQl.addItem(s_item) + + # swap list + self.l_list, self.r_list = self.r_list[:], self.l_list[:] + + def moveright(self): + + self.move( + sQl=self.l_Qlist, + eQl=self.r_Qlist, + sl=self.l_list, + el=self.r_list, + direction="right", + ) + + def moveleft(self): + + self.move( + sQl=self.r_Qlist, + eQl=self.l_Qlist, + sl=self.r_list, + el=self.l_list, + direction="left", + ) + + def move(self, sQl, eQl, sl, el, direction, switch_tabbed=False): + + # get selected window + i = sQl.currentRow() + + # if only one window left : swap containers + if len(sl) == 1 and not self.tabbed: + mark = sl[0]["mark"] + self.move_away(el, mark, direction) + self.swap_list(sQl, eQl, sl, el) + #self.maketabbedcontainer(mark) + + else: + w = sl[i] + # update list + el.append(sl.pop(i)) + + # update Qt list + item = sQl.takeItem(i) + eQl.addItem(item) + + # move next to top list window (i3wm mark) + list_head_l_mark = el[0]["mark"] + cmd = f'''i3-msg "[id={w['id']}] move to mark "{list_head_l_mark}""''' + subprocess.check_output(cmd, shell=True) + diff --git a/pyqtmenu/parse_desktop_file.py b/pyqtmenu/parse_desktop_file.py new file mode 100644 index 0000000..5f94523 --- /dev/null +++ b/pyqtmenu/parse_desktop_file.py @@ -0,0 +1,197 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +""" +small desktop file parser +""" + +import os +import glob +import re +from itertools import product +import hashlib +import json + + +from config import ( + ICON_PATHS, ICON_SIZES, CONFIG, + CONFIG_PATH, APP_SAVE_FILE, ICON_DEFAULT, + DESKTOP_FILES_PATH, +) + + +def get_app_for_folder(): + pass + +def hash_file(file): + """hash .desktop file to watch for any change""" + + hasher = hashlib.md5() + with open(file, 'rb') as f: + buf = f.read() + hasher.update(buf) + return hasher.hexdigest() + +def get_app_from_desktop(): + """ + get all app dict and store them in a list + """ + + # Try load previous session + app_config_file = APP_SAVE_FILE + try: + with open(app_config_file) as json_data_file: + saved_app = json.load(json_data_file) + except FileNotFoundError as e: + saved_app = {} + + app_list = [] + app_dct = {} + + # parse .desktop file if it's new + path_desktop = f"{DESKTOP_FILES_PATH}/*/*.desktop" + for file in glob.iglob(path_desktop): + + hex_hash = hash_file(file) + + # if new launcher : parse .desktop + if not hex_hash in list(saved_app.keys()): + + app = parse_desktop_lang(file) + category = file.split('/')[-2] + app['category'] = category + app['Icon'] = icon2paths(app['Icon']).copy() + + # else load from json conf + else: + app = saved_app[hex_hash] + + app_list += [app] + app_dct[hex_hash] = app + + # Save session + with open(app_config_file, "w") as outfile: + json.dump(app_dct, outfile) + + # python function is not serializable so had to be done after loadin json + for app in app_list: + app['Exec'] = txt2fct(app['Exec']) + + return app_list + +def txt2fct(command_path): + """ transform path of a command into a python function """ + + def exec(): + os.system(command_path) + return exec + +def icon2paths(icon_name): + """ + return icon path from icon_name : + - if icon_name is path to icon, do nothing + - if not look for icon in file system + """ + icon_path = {theme:ICON_DEFAULT for theme in CONFIG['Themes']} + if not icon_name: + pass + elif os.path.isfile(icon_name): + for theme in CONFIG['Themes']: + icon_path[theme] = icon_name + else: + for theme in CONFIG['Themes']: + theme_paths = CONFIG['Themes'][theme].replace(' ','').split(',') + for t, s, p in product(theme_paths, ICON_SIZES, ICON_PATHS): + icon_tmp = glob.glob(f'{p}/{t}/{s}x{s}/*/{icon_name}.*') + if icon_tmp: + icon_path[theme] = icon_tmp[0] + break + return icon_path + +def create_pattern(entry, lang=None): + """Return a pattern to parse either or not translated entry in .desktop""" + + if lang != None: + pattern = re.compile(f'^{entry}\[{lang}\]=.*') + else: + pattern = re.compile(f'^{entry}=.*') + return pattern + +def find_in_file(file, pattern): + """return a matched pattern in a file""" + + match = None + with open(file) as f: + for line in f: + temp = pattern.match(line) + if temp != None: + match = temp.string.replace("\n", "").split('=')[-1] + break + return match + +def parse_desktop_lang(file_name, lang='fr'): + """ + parse_desktop("fichier.desktop") => dict + + args: + str : desktop file following freedesktop guidelines + return: + dict : parsed desktop file into dict + """ + + entry_names_lang = ['Name', 'Comment'] + entry_names = ['Exec', 'Icon'] + + app = {} + for name in entry_names_lang: + pattern = create_pattern(name, lang) + match = find_in_file(file_name, pattern) + + if match == None: + pattern = create_pattern(name) + match = find_in_file(file_name, pattern) + + app[name] = match + + for name in entry_names: + pattern = create_pattern(name) + match = find_in_file(file_name, pattern) + + app[name] = match + + return app + +def parse_desktop(file_name): + """ + parse_desktop("fichier.desktop") => dict + + args: + str : desktop file following freedesktop guidelines + return: + dict : parsed desktop file into dict + """ + + entries = ['Name', 'Comment', 'Exec', 'Icon'] + + Name = re.match(f'Name\[{lang}\]') + app = {} + with open(file_name, 'r') as file: + next(file) # forget first line + for line in file: + k, v = [l.strip() for l in line.split('=')] + app[k] = v + + app['Exec'] = txt2fct(app['Exec']) + return app + + +if __name__ == "__main__": + + app = parse_desktop("qrcode.desktop") + for k,v in app.items(): + pass + app_list = get_app_from_desktop() + + + + diff --git a/pyqtmenu b/pyqtmenu/pyqtmenu.py similarity index 86% rename from pyqtmenu rename to pyqtmenu/pyqtmenu.py index 97bad69..1e926f1 100755 --- a/pyqtmenu +++ b/pyqtmenu/pyqtmenu.py @@ -5,7 +5,7 @@ from PyQt5.QtWidgets import QApplication -from ui.window import MainWindow +from window import MainWindow diff --git a/pyqtmenu/qss.py b/pyqtmenu/qss.py new file mode 100644 index 0000000..4dbae2a --- /dev/null +++ b/pyqtmenu/qss.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 + +APP_LAUNCHER_QSS=""" + QFrame:hover { + border: 2px solid green; + border-radius: 4px; + padding: 2px; + } + QFrame:pressed { + border: 50px solid green; + border-radius: 44px; + padding: 2px; + } +""" + +APP_BUTTON_QSS=""" + QPushButton { + border: None; + } + QPushButton:pressed { + border: 50px solid white; + border-radius: 60px; + padding: 4px; + } +""" + +APP_LABEL_QSS=""" + QLabel { + border : None; + } +""" diff --git a/ui/window.py b/pyqtmenu/window.py similarity index 85% rename from ui/window.py rename to pyqtmenu/window.py index fce452a..a85f3d0 100755 --- a/ui/window.py +++ b/pyqtmenu/window.py @@ -42,30 +42,12 @@ QMessageBox, ) -# QLineEdit, -# QSpacerItem, -# QTextEdit, -# QDesktopWidget, -# QListWidgetItem, -# QInputDialog, - # Local -from .parse_desktop_file import get_app_from_desktop, parse_desktop_lang -from .qss import APP_BUTTON_QSS, APP_LABEL_QSS, APP_LAUNCHER_QSS -from .layout_manager.layout_manager_tab import LayoutMgr -from .dialogs import AskMultipleValues -from config import ( - DUAL_PANEL_ICON, - REDUCE_ICON, - MENU_TITLE, - USER_CONFIG, - CONFIG_PATH, - DEFAULT_CONF_INI, - APP_SAVE_FILE, - CONFIG, -) - -# from load_config import CONFIG +from parse_desktop_file import get_app_from_desktop, parse_desktop_lang +import qss as qss +from layout_manager.layout_manager_tab import LayoutMgr +from dialogs import AskMultipleValues +import config as cf class MainWindow(QMainWindow): @@ -75,7 +57,7 @@ class MainWindow(QMainWindow): def __init__(self): super().__init__() - self.title = MENU_TITLE + self.title = cf.MENU_TITLE self.setWindowTitle(self.title) MainWindow.instance = self @@ -104,6 +86,11 @@ def initUI(self): saveAct.setStatusTip("Save menu configuration") saveAct.triggered.connect(self.save_config) + delnreloadAct = QAction(text="Reset", parent = self) + delnreloadAct.setShortcut('Ctrl+R') + delnreloadAct.setStatusTip("Delete configurations files and reload the menu") + delnreloadAct.triggered.connect(self.del_n_reload) + #  Resize icons resizeiconAct = QAction(text="&Resize Icons", parent=self) resizeiconAct.triggered.connect(self.resize_icons) @@ -113,12 +100,13 @@ def initUI(self): fileMenu = menubar.addMenu("&Fichier") fileMenu.addAction(exitAct) fileMenu.addAction(saveAct) + fileMenu.addAction(delnreloadAct) EditMenu = menubar.addMenu("&Edition") EditMenu.addAction(resizeiconAct) themeMenu = EditMenu.addMenu("Icon theme") # Change icon theme - for theme in CONFIG["Themes"]: + for theme in cf.CONFIG["Themes"]: iconAct = QAction(text=theme, parent=self) iconAct.triggered.connect(self.set_icon_theme) themeMenu.addAction(iconAct) @@ -139,15 +127,15 @@ def initUI(self): self.twopanelCb.setToolTip( "Disposer les fenêtres en deux panneaux séparées verticalement" ) - self.twopanelCb.setIcon(iconFromBase64(DUAL_PANEL_ICON)) - CONFIG["Options"].getboolean("autoclose") - self.twopanelCb.setChecked(CONFIG["Options"].getboolean("dualpanel")) + self.twopanelCb.setIcon(iconFromBase64(cf.DUAL_PANEL_ICON)) + cf.CONFIG["Options"].getboolean("autoclose") + self.twopanelCb.setChecked(cf.CONFIG["Options"].getboolean("dualpanel")) # Toggle reduce mode self.reduceCb = QCheckBox() # "Réduire le menu") - self.reduceCb.setIcon(QIcon(iconFromBase64(REDUCE_ICON))) + self.reduceCb.setIcon(QIcon(iconFromBase64(cf.REDUCE_ICON))) self.reduceCb.setToolTip("Réduire le menu au lancement d'une application") - self.reduceCb.setChecked(CONFIG["Options"].getboolean("autoclose")) + self.reduceCb.setChecked(cf.CONFIG["Options"].getboolean("autoclose")) #### Tabs #### # Create app launcher tabs @@ -177,18 +165,28 @@ def initUI(self): def load_config(self): """Load user-defined MainWindow paramerters""" - x = int(CONFIG["Window"]["x"]) - y = int(CONFIG["Window"]["y"]) + x = int(cf.CONFIG["Window"]["x"]) + y = int(cf.CONFIG["Window"]["y"]) self.resize(x, y) def save_config(self): """Save user preferences in a text file""" - CONFIG["Options"]["autoclose"] = str(self.reduceCb.isChecked()) - CONFIG["Options"]["dualpanel"] = str(self.twopanelCb.isChecked()) + cf.CONFIG["Options"]["autoclose"] = str(self.reduceCb.isChecked()) + cf.CONFIG["Options"]["dualpanel"] = str(self.twopanelCb.isChecked()) + + with open(cf.USER_CONFIG, "w") as configfile: + cf.CONFIG.write(configfile) - with open(USER_CONFIG, "w") as configfile: - CONFIG.write(configfile) + def del_config(self): + """remove config files""" + + os.system(f"rm -Rf {cf.USER_CONFIG}") + + def del_n_reload(self): + + self.del_config() + restart_program() def enable_modules(self): """Enable optional modules""" @@ -234,8 +232,8 @@ def resize_icons(self): """ resize all launchers icons, resize icon grid too""" x, y, test = self.get_size_value("x", "y") - CONFIG["Icon"]["x"] = x - CONFIG["Icon"]["y"] = y + cf.CONFIG["Icon"]["x"] = x + cf.CONFIG["Icon"]["y"] = y x, y = int(x), int(y) if test: @@ -249,7 +247,7 @@ def set_icon_theme(self): """Change all icon theme""" theme = self.sender().text() - CONFIG["Icon"]["theme"] = theme + cf.CONFIG["Icon"]["theme"] = theme for launcher in AppLauncherBtn.instances.values(): launcher.set_icon_theme(theme) @@ -258,8 +256,8 @@ def resizeEvent(self, event): """Capture new window size for saving purpose""" x, y = self.size().width(), self.size().height() - CONFIG["Window"]["x"] = str(x) - CONFIG["Window"]["y"] = str(y) + cf.CONFIG["Window"]["x"] = str(x) + cf.CONFIG["Window"]["y"] = str(y) class ReduceModButton(QDialog): @@ -309,8 +307,8 @@ def __init__(self, parent): # Initialize tab screen self.tabs = QTabWidget() - x = int(CONFIG["Window"]["x"]) - y = int(CONFIG["Window"]["y"]) + x = int(cf.CONFIG["Window"]["x"]) + y = int(cf.CONFIG["Window"]["y"]) # self.tabs.resize(x, y) # get all apps @@ -385,8 +383,8 @@ def __init__(self, category): self.max_launcher = 100 # useless? self.gen_position = self.genPos() - x = int(CONFIG["Icon"]["x"]) - y = int(CONFIG["Icon"]["y"]) + x = int(cf.CONFIG["Icon"]["x"]) + y = int(cf.CONFIG["Icon"]["y"]) self.launcher_size = (x, y) self.setMinimumWidth((self.launcher_size[0] * 1.3)) @@ -463,21 +461,21 @@ def __init__(self, parent_tab, app, pos, size): self.icon_size = (int(size[0]), int(size[1])) self.setFixedSize(size[0] + 20, size[1] + 35) - self.setStyleSheet(APP_LAUNCHER_QSS) + self.setStyleSheet(qss.APP_LAUNCHER_QSS) name, self.icons, tooltip = app["Name"], app["Icon"], app["Comment"] - icon = self.icons[CONFIG["Icon"]["theme"]] + icon = self.icons[cf.CONFIG["Icon"]["theme"]] self.btn = QPushButton() self.btn.setIcon(QIcon(QPixmap(icon))) self.btn.setIconSize(QSize(*self.icon_size)) - self.btn.setStyleSheet(APP_BUTTON_QSS) + self.btn.setStyleSheet(qss.APP_BUTTON_QSS) self.btn.setToolTip(tooltip) self.btn.clicked.connect(self.run_app) txt = QLabel(name) txt.setAlignment(Qt.AlignHCenter) - txt.setStyleSheet(APP_LABEL_QSS) + txt.setStyleSheet(qss.APP_LABEL_QSS) self.layout = QVBoxLayout(self) self.layout.addWidget(self.btn) @@ -546,14 +544,17 @@ def restart_program(): def make_configs(): """Create config dir/files if they don't exist""" - if not os.path.isdir(CONFIG_PATH): - os.makedirs(CONFIG_PATH) - if not os.path.exists(USER_CONFIG): - with open(USER_CONFIG, "w") as user_conf: - user_conf.write(DEFAULT_CONF_INI) + if not os.path.isdir(cf.CONFIG_PATH): + os.makedirs(cf.CONFIG_PATH) + os.system(f"cp -R {cf.APP_TAB_EXAMPLE} {cf.DESKTOP_FILES_PATH}/") + os.system(f"cp -R {cf.APP_TAB_EXAMPLE} {cf.DESKTOP_FILES_PATH}/") + + if not os.path.exists(cf.USER_CONFIG): + with open(cf.USER_CONFIG, "w") as user_conf: + user_conf.write(cf.DEFAULT_CONF_INI) print("========= Restarting =================") restart_program() - if not os.path.exists(APP_SAVE_FILE): + if not os.path.exists(cf.APP_SAVE_FILE): pass diff --git a/requirements.txt b/requirements.txt index dd6dd45..62c6f0a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1 @@ PyQt5==5.15.0 -sip==5.3.0