From 67f8800244910c93ce2e6bb194945831e9a0eeac Mon Sep 17 00:00:00 2001 From: Daguhh Date: Wed, 2 Sep 2020 21:14:51 +0200 Subject: [PATCH 01/10] add insctruction for build deb --- Apps/Divertissement/guitar_accord.desktop | 8 - Apps/ExampleTab/firefox-esr.desktop | 104 - Apps/Utilitaires/delete_metadata.desktop | 8 - Apps/Utilitaires/qrcode.desktop | 8 - Apps/Utilitaires/rofi_calculator.desktop | 8 - Apps_example/EmptyApp/requirements.txt | 1 - .../ExifManipulation/app/delete_metadata.py | 116 - .../ExifManipulation/delete_metadata.desktop | 8 - .../ExifManipulation/delete_metadata.png | Bin 6405 -> 0 bytes .../ExifManipulation/requirements.txt | 1 - .../GuitarAccord/app/guitar_accord.desktop | 8 - .../GuitarAccord/app/guitare_parameter.py | 16 - .../GuitarAccord/app/listedesaccords.py | 5655 ----------------- .../GuitarAccord/app/show_guitar_accord.py | 322 - .../GuitarAccord/app/woodenbackground.py | 91 - Apps_example/GuitarAccord/requirements.txt | 6 - Apps_example/GuitarAccord/show5 | 11 - .../GuitarAccord/show_guitar_accord.png | Bin 41469 -> 0 bytes Apps_example/OrphelinRAW/delete_orphelin_raw | 14 - Apps_example/OrphelinRAW/requirements.txt | 1 - Apps_example/QrcoPy/app/qrcopy.py | 66 - Apps_example/QrcoPy/qrcode.desktop | 8 - Apps_example/QrcoPy/qrcode.png | Bin 1044 -> 0 bytes Apps_example/QrcoPy/requirements.txt | 3 - .../app/rofi_python_calculator.py | 76 - Apps_example/RofiCalculator/requirements.txt | 2 - .../RofiCalculator/rofi-python-calculator | 12 - .../RofiCalculator/rofi_calculator.desktop | 8 - .../RofiCalculator/roficalculator.png | Bin 7486 -> 0 bytes Apps_example/update_apps_requirements.sh | 5 - LICENSE.TXT | 10 + License | 10 + .../EmptyApp/app/__init__.py => MANIFEST.in | 0 README | 42 + README.md | 32 - README.rst | 42 + build_instruction.txt | 2 + .../pyqtmenu/installed-by-dh_install | 12 + .../pyqtmenu/installed-by-dh_installdocs | 0 debian/changelog | 5 + debian/control | 19 + debian/copyright | 19 + debian/debhelper-build-stamp | 1 + debian/files | 2 + debian/install | 12 + debian/pyqtmenu-docs.docs | 2 + debian/pyqtmenu.postinst.debhelper | 17 + debian/pyqtmenu.prerm.debhelper | 10 + debian/pyqtmenu.substvars | 3 + debian/pyqtmenu/DEBIAN/control | 14 + debian/pyqtmenu/DEBIAN/md5sums | 31 + debian/pyqtmenu/DEBIAN/postinst | 19 + debian/pyqtmenu/DEBIAN/prerm | 12 + debian/pyqtmenu/usr/bin/pyqtmenu-start | 21 + .../usr/share/applications/pyqtmenu.desktop | 11 + .../share/doc/pyqtmenu/changelog.Debian.gz | Bin 0 -> 174 bytes .../pyqtmenu/usr/share/doc/pyqtmenu/copyright | 19 + .../pyqtmenu/app_example}/app/__init__.py | 0 .../share/pyqtmenu/app_example/app/empty.py | 32 + .../usr/share/pyqtmenu/app_example/empty | 7 +- .../share/pyqtmenu/app_example}/empty.desktop | 0 .../usr/share/pyqtmenu/app_example}/empty.png | Bin .../tab_example/onglet_1/empty1.desktop | 8 + .../pyqtmenu/usr/share/pyqtmenu/config.py | 3 +- .../pyqtmenu/usr/share/pyqtmenu}/dialogs.py | 0 .../pyqtmenu/layout_manager}/__init__.py | 0 .../layout_manager/layout_manager.py | 0 .../layout_manager/layout_manager_tab.py | 0 .../usr/share/pyqtmenu}/parse_desktop_file.py | 5 +- .../pyqtmenu/usr/share/pyqtmenu/pyqtmenu.py | 13 +- .../pyqtmenu/usr/share/pyqtmenu}/qss.py | 0 debian/pyqtmenu/usr/share/pyqtmenu/window.py | 566 ++ .../share/python3/runtime.d/pyqtmenu.rtupdate | 7 + debian/readme.txt | 42 + debian/rules | 25 + debian/source/format | 1 + load_config.py | 12 - pyqtmenu-start | 21 + pyqtmenu.desktop | 11 + {ui => pyqtmenu}/__init__.py | 0 .../app_example/app}/__init__.py | 0 .../app_example}/app/empty.py | 0 .../EmptyApp => pyqtmenu/app_example}/empty | 0 pyqtmenu/app_example/empty.desktop | 8 + pyqtmenu/app_example/empty.png | Bin 0 -> 29028 bytes .../tab_example/onglet_1/empty1.desktop | 8 + pyqtmenu/config.py | 58 + pyqtmenu/dialogs.py | 63 + pyqtmenu/icons/dual_panel.png | Bin 0 -> 1897 bytes pyqtmenu/icons/reduce.png | Bin 0 -> 390 bytes pyqtmenu/layout_manager/__init__.py | 0 pyqtmenu/layout_manager/layout_manager.py | 86 + .../layout_manager/layout_manager.ui | 0 pyqtmenu/layout_manager/layout_manager_tab.py | 232 + pyqtmenu/parse_desktop_file.py | 197 + pyqtmenu => pyqtmenu/pyqtmenu.py | 2 +- pyqtmenu/qss.py | 31 + {ui => pyqtmenu}/window.py | 111 +- requirements.txt | 1 - setup.py | 17 + 100 files changed, 1819 insertions(+), 6681 deletions(-) delete mode 100644 Apps/Divertissement/guitar_accord.desktop delete mode 100644 Apps/ExampleTab/firefox-esr.desktop delete mode 100755 Apps/Utilitaires/delete_metadata.desktop delete mode 100755 Apps/Utilitaires/qrcode.desktop delete mode 100755 Apps/Utilitaires/rofi_calculator.desktop delete mode 100644 Apps_example/EmptyApp/requirements.txt delete mode 100755 Apps_example/ExifManipulation/app/delete_metadata.py delete mode 100755 Apps_example/ExifManipulation/delete_metadata.desktop delete mode 100644 Apps_example/ExifManipulation/delete_metadata.png delete mode 100644 Apps_example/ExifManipulation/requirements.txt delete mode 100644 Apps_example/GuitarAccord/app/guitar_accord.desktop delete mode 100644 Apps_example/GuitarAccord/app/guitare_parameter.py delete mode 100644 Apps_example/GuitarAccord/app/listedesaccords.py delete mode 100644 Apps_example/GuitarAccord/app/show_guitar_accord.py delete mode 100644 Apps_example/GuitarAccord/app/woodenbackground.py delete mode 100644 Apps_example/GuitarAccord/requirements.txt delete mode 100755 Apps_example/GuitarAccord/show5 delete mode 100644 Apps_example/GuitarAccord/show_guitar_accord.png delete mode 100755 Apps_example/OrphelinRAW/delete_orphelin_raw delete mode 100644 Apps_example/OrphelinRAW/requirements.txt delete mode 100755 Apps_example/QrcoPy/app/qrcopy.py delete mode 100755 Apps_example/QrcoPy/qrcode.desktop delete mode 100644 Apps_example/QrcoPy/qrcode.png delete mode 100644 Apps_example/QrcoPy/requirements.txt delete mode 100755 Apps_example/RofiCalculator/app/rofi_python_calculator.py delete mode 100644 Apps_example/RofiCalculator/requirements.txt delete mode 100755 Apps_example/RofiCalculator/rofi-python-calculator delete mode 100755 Apps_example/RofiCalculator/rofi_calculator.desktop delete mode 100644 Apps_example/RofiCalculator/roficalculator.png delete mode 100755 Apps_example/update_apps_requirements.sh create mode 100644 LICENSE.TXT create mode 100644 License rename Apps_example/EmptyApp/app/__init__.py => MANIFEST.in (100%) create mode 100644 README delete mode 100644 README.md create mode 100644 README.rst create mode 100644 build_instruction.txt create mode 100644 debian/.debhelper/generated/pyqtmenu/installed-by-dh_install rename Apps_example/ExifManipulation/app/__init__.py => debian/.debhelper/generated/pyqtmenu/installed-by-dh_installdocs (100%) create mode 100644 debian/changelog create mode 100644 debian/control create mode 100644 debian/copyright create mode 100644 debian/debhelper-build-stamp create mode 100644 debian/files create mode 100644 debian/install create mode 100644 debian/pyqtmenu-docs.docs create mode 100644 debian/pyqtmenu.postinst.debhelper create mode 100644 debian/pyqtmenu.prerm.debhelper create mode 100644 debian/pyqtmenu.substvars create mode 100644 debian/pyqtmenu/DEBIAN/control create mode 100644 debian/pyqtmenu/DEBIAN/md5sums create mode 100755 debian/pyqtmenu/DEBIAN/postinst create mode 100755 debian/pyqtmenu/DEBIAN/prerm create mode 100755 debian/pyqtmenu/usr/bin/pyqtmenu-start create mode 100644 debian/pyqtmenu/usr/share/applications/pyqtmenu.desktop create mode 100644 debian/pyqtmenu/usr/share/doc/pyqtmenu/changelog.Debian.gz create mode 100644 debian/pyqtmenu/usr/share/doc/pyqtmenu/copyright rename {Apps_example/GuitarAccord => debian/pyqtmenu/usr/share/pyqtmenu/app_example}/app/__init__.py (100%) create mode 100755 debian/pyqtmenu/usr/share/pyqtmenu/app_example/app/empty.py rename Apps_example/ExifManipulation/delete_metadata => debian/pyqtmenu/usr/share/pyqtmenu/app_example/empty (73%) rename {Apps_example/EmptyApp => debian/pyqtmenu/usr/share/pyqtmenu/app_example}/empty.desktop (100%) rename {Apps_example/EmptyApp => debian/pyqtmenu/usr/share/pyqtmenu/app_example}/empty.png (100%) create mode 100755 debian/pyqtmenu/usr/share/pyqtmenu/app_example/tab_example/onglet_1/empty1.desktop rename config.py => debian/pyqtmenu/usr/share/pyqtmenu/config.py (97%) rename {ui => debian/pyqtmenu/usr/share/pyqtmenu}/dialogs.py (100%) rename {Apps_example/QrcoPy/app => debian/pyqtmenu/usr/share/pyqtmenu/layout_manager}/__init__.py (100%) rename {ui => debian/pyqtmenu/usr/share/pyqtmenu}/layout_manager/layout_manager.py (100%) rename {ui => debian/pyqtmenu/usr/share/pyqtmenu}/layout_manager/layout_manager_tab.py (100%) rename {ui => debian/pyqtmenu/usr/share/pyqtmenu}/parse_desktop_file.py (97%) rename Apps_example/QrcoPy/qrcopy => debian/pyqtmenu/usr/share/pyqtmenu/pyqtmenu.py (64%) rename {ui => debian/pyqtmenu/usr/share/pyqtmenu}/qss.py (100%) create mode 100755 debian/pyqtmenu/usr/share/pyqtmenu/window.py create mode 100755 debian/pyqtmenu/usr/share/python3/runtime.d/pyqtmenu.rtupdate create mode 100644 debian/readme.txt create mode 100755 debian/rules create mode 100644 debian/source/format delete mode 100644 load_config.py create mode 100755 pyqtmenu-start create mode 100755 pyqtmenu.desktop rename {ui => pyqtmenu}/__init__.py (100%) rename {ui/layout_manager => pyqtmenu/app_example/app}/__init__.py (100%) rename {Apps_example/EmptyApp => pyqtmenu/app_example}/app/empty.py (100%) rename {Apps_example/EmptyApp => pyqtmenu/app_example}/empty (100%) create mode 100755 pyqtmenu/app_example/empty.desktop create mode 100644 pyqtmenu/app_example/empty.png create mode 100755 pyqtmenu/app_example/tab_example/onglet_1/empty1.desktop create mode 100644 pyqtmenu/config.py create mode 100644 pyqtmenu/dialogs.py create mode 100644 pyqtmenu/icons/dual_panel.png create mode 100644 pyqtmenu/icons/reduce.png create mode 100644 pyqtmenu/layout_manager/__init__.py create mode 100644 pyqtmenu/layout_manager/layout_manager.py rename {ui => pyqtmenu}/layout_manager/layout_manager.ui (100%) create mode 100644 pyqtmenu/layout_manager/layout_manager_tab.py create mode 100644 pyqtmenu/parse_desktop_file.py rename pyqtmenu => pyqtmenu/pyqtmenu.py (86%) create mode 100644 pyqtmenu/qss.py rename {ui => pyqtmenu}/window.py (85%) create mode 100644 setup.py 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/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 538ba0209a51b4dc231ad6da4e513182f5bbdb3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6405 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 WXZ#&a3;13G@3E4);ztF`(EkG6+k46Y 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 347469a2c36f717c3ebf02becb6438f044272d13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41469 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 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 897467792c15eead40517e391b1552b9fa38d147..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1044 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 - -### 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/ExifManipulation/app/__init__.py b/debian/.debhelper/generated/pyqtmenu/installed-by-dh_installdocs similarity index 100% rename from Apps_example/ExifManipulation/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 0000000000000000000000000000000000000000..1d6277a8591f17ce556526bd6f6c911889430f9d GIT binary patch literal 174 zcmV;f08#%RiwFP!00002109Ub3W7iwMfX0%g*I9#qY;6b1hsJ&6to_jFCB1ZY<>dY zKJ6^-;cm`2eY_$a5VI^#^8`UV&)b2H2(}~rnof#@3@VC%H5x6w +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/GuitarAccord/app/__init__.py b/debian/pyqtmenu/usr/share/pyqtmenu/app_example/app/__init__.py similarity index 100% rename from Apps_example/GuitarAccord/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/QrcoPy/app/__init__.py b/debian/pyqtmenu/usr/share/pyqtmenu/layout_manager/__init__.py similarity index 100% rename from Apps_example/QrcoPy/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/ui/__init__.py b/pyqtmenu/__init__.py similarity index 100% rename from ui/__init__.py rename to pyqtmenu/__init__.py diff --git a/ui/layout_manager/__init__.py b/pyqtmenu/app_example/app/__init__.py similarity index 100% rename from ui/layout_manager/__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/pyqtmenu/app_example/empty.desktop b/pyqtmenu/app_example/empty.desktop new file mode 100755 index 0000000..52259ed --- /dev/null +++ b/pyqtmenu/app_example/empty.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Name=EmptyApp +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/pyqtmenu/app_example/empty.png b/pyqtmenu/app_example/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..41d829f657b7c5a477775d183ddf3ef4d845643b GIT binary patch literal 29028 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 WkzcBJXfa-!$XH{teswyF6Zn5bvkfNz literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d49ecc4e2b79d9cb545256bdbaf1f27055105976 GIT binary patch literal 1897 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9oCO|{#S9F3${@^GvDCf{D9B#o z>Fdh=ghQ5(*ULV0FMhJw4NZ$Nk>pEv^p z+hb1`#}Era#v5$vKN%eytbzI{2O!5%1(0CSnJMRh2x#lp>vw<%$oT!U6Nn)0Ai*H~ z4j+7B!~%El{{2VbY-EO`qYaRYUlyoQOKjD#O8I5hIRYQI?lc3>X4cRpEI2L7FZ{5itbT>vzm%&&c!B-6EVvO`#2e z>GTPk&4-srlEnQT^bt86zB>;UB5T^VQ$Q)z%ZaxGDJ7(oy`4A(>Y`9eK`8|x#3{1h z?`|GyEpiuKB3bt3<$y32D%T9EDa#AebcsAaH8I;>&LjU>R1^iy=U>d{FTPtKMAn|B z*Ca`NvlRg#2;BJ*{d?g1s&w?xtYf_gV=~dzhOpg!0svO4w^sar9E`zr<~6OGtm7MV kG1!5te&pWY7T?DB1G(t^Ka?$oMF0Q*07*qoM6N<$f)9$KXaE2J literal 0 HcmV?d00001 diff --git a/pyqtmenu/layout_manager/__init__.py b/pyqtmenu/layout_manager/__init__.py new file mode 100644 index 0000000..e69de29 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 diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..dcdc1d1 --- /dev/null +++ b/setup.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python3 + +from distutils.core import setup + +setup( + name='PyQtMenu', + version='0.1', + url='https://github.com/Daguhh/PyQtMenu', + author = 'Daguhh', + author_email = 'code.daguhh@zaclys.net', + maintainer= 'Daguhh', + maintainer_email = 'code.daguhh@zaclys.net', + keywords = 'Menu PyQt5', + packages=['pyqtmenu','pyqtmenu/layout_manager'], + license='The MIT License (MIT)', +) + From b8382c42be95803636120f8e3ca07f7717f2bb45 Mon Sep 17 00:00:00 2001 From: Daguhh <34781373+Daguhh@users.noreply.github.com> Date: Wed, 2 Sep 2020 21:17:17 +0200 Subject: [PATCH 02/10] Delete LICENSE.TXT --- LICENSE.TXT | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 LICENSE.TXT diff --git a/LICENSE.TXT b/LICENSE.TXT deleted file mode 100644 index bd52e47..0000000 --- a/LICENSE.TXT +++ /dev/null @@ -1,10 +0,0 @@ -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. - From 9a926a45591a68c75baad5879e4536960576010e Mon Sep 17 00:00:00 2001 From: Daguhh <34781373+Daguhh@users.noreply.github.com> Date: Wed, 2 Sep 2020 21:17:26 +0200 Subject: [PATCH 03/10] Delete MANIFEST.in --- MANIFEST.in | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 MANIFEST.in diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index e69de29..0000000 From f6ebe98b8a731c975699e4e6d3aeb13066af6c44 Mon Sep 17 00:00:00 2001 From: Daguhh <34781373+Daguhh@users.noreply.github.com> Date: Wed, 2 Sep 2020 21:17:42 +0200 Subject: [PATCH 04/10] Delete README --- README | 42 ------------------------------------------ 1 file changed, 42 deletions(-) delete mode 100644 README diff --git a/README b/README deleted file mode 100644 index 37efd18..0000000 --- a/README +++ /dev/null @@ -1,42 +0,0 @@ -******** -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 From 7d5b239bffece3a13f8edecbc7f039f01c9b353b Mon Sep 17 00:00:00 2001 From: Daguhh <34781373+Daguhh@users.noreply.github.com> Date: Wed, 2 Sep 2020 21:18:14 +0200 Subject: [PATCH 05/10] Delete setup.py --- setup.py | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 setup.py diff --git a/setup.py b/setup.py deleted file mode 100644 index dcdc1d1..0000000 --- a/setup.py +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env python3 - -from distutils.core import setup - -setup( - name='PyQtMenu', - version='0.1', - url='https://github.com/Daguhh/PyQtMenu', - author = 'Daguhh', - author_email = 'code.daguhh@zaclys.net', - maintainer= 'Daguhh', - maintainer_email = 'code.daguhh@zaclys.net', - keywords = 'Menu PyQt5', - packages=['pyqtmenu','pyqtmenu/layout_manager'], - license='The MIT License (MIT)', -) - From 3a6383a6fbb71cd08cc5e98e50723bc60d9ab520 Mon Sep 17 00:00:00 2001 From: Daguhh <34781373+Daguhh@users.noreply.github.com> Date: Wed, 2 Sep 2020 21:19:13 +0200 Subject: [PATCH 06/10] Delete empty7.desktop --- Apps/ExampleTab/empty7.desktop | 8 -------- 1 file changed, 8 deletions(-) delete mode 100755 Apps/ExampleTab/empty7.desktop 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 From 5c23cff7deec8168d1d082e3e07264b1508c0446 Mon Sep 17 00:00:00 2001 From: Daguhh <34781373+Daguhh@users.noreply.github.com> Date: Wed, 2 Sep 2020 21:19:22 +0200 Subject: [PATCH 07/10] Delete empty6.desktop --- Apps/ExampleTab/empty6.desktop | 8 -------- 1 file changed, 8 deletions(-) delete mode 100755 Apps/ExampleTab/empty6.desktop 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 From fca09388f4f429b069203c99dae7c70bc5dc8c89 Mon Sep 17 00:00:00 2001 From: Daguhh <34781373+Daguhh@users.noreply.github.com> Date: Wed, 2 Sep 2020 21:19:54 +0200 Subject: [PATCH 08/10] Delete empty5.desktop --- Apps/ExampleTab/empty5.desktop | 8 -------- 1 file changed, 8 deletions(-) delete mode 100755 Apps/ExampleTab/empty5.desktop 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 From bac7a58d5f61f29435a40f0fe1a57b231a3cf34b Mon Sep 17 00:00:00 2001 From: Daguhh Date: Wed, 2 Sep 2020 21:20:54 +0200 Subject: [PATCH 09/10] -- --- Apps/ExampleTab/empty1.desktop | 8 -------- Apps/ExampleTab/empty2.desktop | 8 -------- Apps/ExampleTab/empty3.desktop | 8 -------- Apps/ExampleTab/empty4.desktop | 8 -------- 4 files changed, 32 deletions(-) delete mode 100755 Apps/ExampleTab/empty1.desktop delete mode 100755 Apps/ExampleTab/empty2.desktop delete mode 100755 Apps/ExampleTab/empty3.desktop delete mode 100755 Apps/ExampleTab/empty4.desktop 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/empty4.desktop b/Apps/ExampleTab/empty4.desktop deleted file mode 100755 index 1b37020..0000000 --- a/Apps/ExampleTab/empty4.desktop +++ /dev/null @@ -1,8 +0,0 @@ -[Desktop Entry] -Name=EmptyApp4 -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 From bb940dce4981dfeb8c933e79f6ffa1628ff57bce Mon Sep 17 00:00:00 2001 From: Daguhh <34781373+Daguhh@users.noreply.github.com> Date: Wed, 2 Sep 2020 21:24:01 +0200 Subject: [PATCH 10/10] Create LICENSE --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..5c2db37 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 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.