├── data ├── midi21.wav ├── midi22.wav ├── midi23.wav ├── midi24.wav ├── midi25.wav ├── midi26.wav ├── midi27.wav ├── midi28.wav ├── midi29.wav ├── midi30.wav ├── midi31.wav ├── midi32.wav ├── midi33.wav ├── midi34.wav ├── midi35.wav ├── midi36.wav ├── midi37.wav ├── midi38.wav ├── midi39.wav ├── midi40.wav ├── midi41.wav ├── midi42.wav ├── midi43.wav ├── midi44.wav ├── midi45.wav ├── midi46.wav ├── midi47.wav ├── midi48.wav ├── midi49.wav ├── midi50.wav ├── midi51.wav ├── midi52.wav ├── midi53.wav ├── midi54.wav ├── midi55.wav ├── midi56.wav ├── midi57.wav ├── midi58.wav ├── midi59.wav ├── midi60.wav ├── midi61.wav ├── midi62.wav ├── midi63.wav ├── midi64.wav ├── midi65.wav ├── midi66.wav ├── midi67.wav ├── midi68.wav ├── midi69.wav ├── midi70.wav ├── midi71.wav ├── midi72.wav ├── midi73.wav ├── midi74.wav ├── midi75.wav ├── midi76.wav ├── midi77.wav ├── midi78.wav ├── midi79.wav ├── midi80.wav ├── midi81.wav ├── midi82.wav ├── midi83.wav ├── midi84.wav ├── midi85.wav ├── midi86.wav ├── midi87.wav ├── midi88.wav ├── midi89.wav ├── midi90.wav ├── midi91.wav ├── midi92.wav ├── midi93.wav ├── midi94.wav ├── midi95.wav ├── midi96.wav ├── midi97.wav ├── midi98.wav ├── midi99.wav ├── midi100.wav ├── midi101.wav ├── midi102.wav ├── midi103.wav ├── midi104.wav ├── midi105.wav ├── midi106.wav ├── midi107.wav ├── midi108.wav ├── silence.wav ├── data_example.mxl └── data_example.csv ├── images ├── BBH4.png ├── tonnetz.gif ├── T1_def_hex.png ├── T4_def_pie.png ├── T6_log_pie.png ├── Tp1_def_hex.png ├── Tp4_def_pie.png ├── Tp6_log_pie.png ├── circle_example.png ├── line_example.png ├── animated_tonnetz.mp4 ├── T2_hex_orange_pc_5.png ├── T3_hex_noduplicate.png ├── T5_red_pie_nofifith.png ├── Tp2_hex_orange_pc_5.png ├── Tp3_hex_noduplicate.png ├── big_blue_hex_8_top.png ├── Tp5_red_pie_nofifith.png ├── animated_circle_example.gif ├── animated_circle_example.mp4 ├── animated_tonnetz_example.gif └── animated_tonnetz_example.mp4 ├── requirements └── requirements.txt ├── magenta ├── magenta_musicxml_code_modifications.md └── magenta_LICENSE.md ├── setup.py ├── LICENCE.txt ├── notebooks ├── parser_doc.ipynb ├── tonnetz_anim_doc.ipynb ├── circle_anim_doc.ipynb └── line_doc.ipynb ├── functions.py ├── README.md ├── reader.py ├── parser.py └── static.py /data/midi21.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi21.wav -------------------------------------------------------------------------------- /data/midi22.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi22.wav -------------------------------------------------------------------------------- /data/midi23.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi23.wav -------------------------------------------------------------------------------- /data/midi24.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi24.wav -------------------------------------------------------------------------------- /data/midi25.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi25.wav -------------------------------------------------------------------------------- /data/midi26.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi26.wav -------------------------------------------------------------------------------- /data/midi27.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi27.wav -------------------------------------------------------------------------------- /data/midi28.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi28.wav -------------------------------------------------------------------------------- /data/midi29.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi29.wav -------------------------------------------------------------------------------- /data/midi30.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi30.wav -------------------------------------------------------------------------------- /data/midi31.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi31.wav -------------------------------------------------------------------------------- /data/midi32.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi32.wav -------------------------------------------------------------------------------- /data/midi33.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi33.wav -------------------------------------------------------------------------------- /data/midi34.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi34.wav -------------------------------------------------------------------------------- /data/midi35.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi35.wav -------------------------------------------------------------------------------- /data/midi36.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi36.wav -------------------------------------------------------------------------------- /data/midi37.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi37.wav -------------------------------------------------------------------------------- /data/midi38.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi38.wav -------------------------------------------------------------------------------- /data/midi39.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi39.wav -------------------------------------------------------------------------------- /data/midi40.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi40.wav -------------------------------------------------------------------------------- /data/midi41.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi41.wav -------------------------------------------------------------------------------- /data/midi42.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi42.wav -------------------------------------------------------------------------------- /data/midi43.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi43.wav -------------------------------------------------------------------------------- /data/midi44.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi44.wav -------------------------------------------------------------------------------- /data/midi45.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi45.wav -------------------------------------------------------------------------------- /data/midi46.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi46.wav -------------------------------------------------------------------------------- /data/midi47.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi47.wav -------------------------------------------------------------------------------- /data/midi48.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi48.wav -------------------------------------------------------------------------------- /data/midi49.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi49.wav -------------------------------------------------------------------------------- /data/midi50.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi50.wav -------------------------------------------------------------------------------- /data/midi51.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi51.wav -------------------------------------------------------------------------------- /data/midi52.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi52.wav -------------------------------------------------------------------------------- /data/midi53.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi53.wav -------------------------------------------------------------------------------- /data/midi54.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi54.wav -------------------------------------------------------------------------------- /data/midi55.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi55.wav -------------------------------------------------------------------------------- /data/midi56.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi56.wav -------------------------------------------------------------------------------- /data/midi57.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi57.wav -------------------------------------------------------------------------------- /data/midi58.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi58.wav -------------------------------------------------------------------------------- /data/midi59.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi59.wav -------------------------------------------------------------------------------- /data/midi60.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi60.wav -------------------------------------------------------------------------------- /data/midi61.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi61.wav -------------------------------------------------------------------------------- /data/midi62.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi62.wav -------------------------------------------------------------------------------- /data/midi63.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi63.wav -------------------------------------------------------------------------------- /data/midi64.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi64.wav -------------------------------------------------------------------------------- /data/midi65.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi65.wav -------------------------------------------------------------------------------- /data/midi66.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi66.wav -------------------------------------------------------------------------------- /data/midi67.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi67.wav -------------------------------------------------------------------------------- /data/midi68.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi68.wav -------------------------------------------------------------------------------- /data/midi69.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi69.wav -------------------------------------------------------------------------------- /data/midi70.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi70.wav -------------------------------------------------------------------------------- /data/midi71.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi71.wav -------------------------------------------------------------------------------- /data/midi72.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi72.wav -------------------------------------------------------------------------------- /data/midi73.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi73.wav -------------------------------------------------------------------------------- /data/midi74.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi74.wav -------------------------------------------------------------------------------- /data/midi75.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi75.wav -------------------------------------------------------------------------------- /data/midi76.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi76.wav -------------------------------------------------------------------------------- /data/midi77.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi77.wav -------------------------------------------------------------------------------- /data/midi78.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi78.wav -------------------------------------------------------------------------------- /data/midi79.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi79.wav -------------------------------------------------------------------------------- /data/midi80.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi80.wav -------------------------------------------------------------------------------- /data/midi81.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi81.wav -------------------------------------------------------------------------------- /data/midi82.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi82.wav -------------------------------------------------------------------------------- /data/midi83.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi83.wav -------------------------------------------------------------------------------- /data/midi84.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi84.wav -------------------------------------------------------------------------------- /data/midi85.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi85.wav -------------------------------------------------------------------------------- /data/midi86.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi86.wav -------------------------------------------------------------------------------- /data/midi87.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi87.wav -------------------------------------------------------------------------------- /data/midi88.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi88.wav -------------------------------------------------------------------------------- /data/midi89.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi89.wav -------------------------------------------------------------------------------- /data/midi90.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi90.wav -------------------------------------------------------------------------------- /data/midi91.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi91.wav -------------------------------------------------------------------------------- /data/midi92.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi92.wav -------------------------------------------------------------------------------- /data/midi93.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi93.wav -------------------------------------------------------------------------------- /data/midi94.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi94.wav -------------------------------------------------------------------------------- /data/midi95.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi95.wav -------------------------------------------------------------------------------- /data/midi96.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi96.wav -------------------------------------------------------------------------------- /data/midi97.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi97.wav -------------------------------------------------------------------------------- /data/midi98.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi98.wav -------------------------------------------------------------------------------- /data/midi99.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi99.wav -------------------------------------------------------------------------------- /images/BBH4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/images/BBH4.png -------------------------------------------------------------------------------- /data/midi100.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi100.wav -------------------------------------------------------------------------------- /data/midi101.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi101.wav -------------------------------------------------------------------------------- /data/midi102.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi102.wav -------------------------------------------------------------------------------- /data/midi103.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi103.wav -------------------------------------------------------------------------------- /data/midi104.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi104.wav -------------------------------------------------------------------------------- /data/midi105.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi105.wav -------------------------------------------------------------------------------- /data/midi106.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi106.wav -------------------------------------------------------------------------------- /data/midi107.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi107.wav -------------------------------------------------------------------------------- /data/midi108.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/midi108.wav -------------------------------------------------------------------------------- /data/silence.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/silence.wav -------------------------------------------------------------------------------- /images/tonnetz.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/images/tonnetz.gif -------------------------------------------------------------------------------- /data/data_example.mxl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/data/data_example.mxl -------------------------------------------------------------------------------- /images/T1_def_hex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/images/T1_def_hex.png -------------------------------------------------------------------------------- /images/T4_def_pie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/images/T4_def_pie.png -------------------------------------------------------------------------------- /images/T6_log_pie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/images/T6_log_pie.png -------------------------------------------------------------------------------- /images/Tp1_def_hex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/images/Tp1_def_hex.png -------------------------------------------------------------------------------- /images/Tp4_def_pie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/images/Tp4_def_pie.png -------------------------------------------------------------------------------- /images/Tp6_log_pie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/images/Tp6_log_pie.png -------------------------------------------------------------------------------- /images/circle_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/images/circle_example.png -------------------------------------------------------------------------------- /images/line_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/images/line_example.png -------------------------------------------------------------------------------- /images/animated_tonnetz.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/images/animated_tonnetz.mp4 -------------------------------------------------------------------------------- /requirements/requirements.txt: -------------------------------------------------------------------------------- 1 | matplotlib>=3.0.1 2 | pandas>=0.23.4 3 | numpy>=1.15.3 4 | moviepy>=1.0.0 5 | -------------------------------------------------------------------------------- /images/T2_hex_orange_pc_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/images/T2_hex_orange_pc_5.png -------------------------------------------------------------------------------- /images/T3_hex_noduplicate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/images/T3_hex_noduplicate.png -------------------------------------------------------------------------------- /images/T5_red_pie_nofifith.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/images/T5_red_pie_nofifith.png -------------------------------------------------------------------------------- /images/Tp2_hex_orange_pc_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/images/Tp2_hex_orange_pc_5.png -------------------------------------------------------------------------------- /images/Tp3_hex_noduplicate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/images/Tp3_hex_noduplicate.png -------------------------------------------------------------------------------- /images/big_blue_hex_8_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/images/big_blue_hex_8_top.png -------------------------------------------------------------------------------- /images/Tp5_red_pie_nofifith.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/images/Tp5_red_pie_nofifith.png -------------------------------------------------------------------------------- /images/animated_circle_example.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/images/animated_circle_example.gif -------------------------------------------------------------------------------- /images/animated_circle_example.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/images/animated_circle_example.mp4 -------------------------------------------------------------------------------- /images/animated_tonnetz_example.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/images/animated_tonnetz_example.gif -------------------------------------------------------------------------------- /images/animated_tonnetz_example.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DCMLab/pitchplots/HEAD/images/animated_tonnetz_example.mp4 -------------------------------------------------------------------------------- /magenta/magenta_musicxml_code_modifications.md: -------------------------------------------------------------------------------- 1 | # List of modifications in modified_musicxml_parser.py 2 | 3 | the following constants were in a separate file and have been added: 4 | 5 | ``` 6 | STANDARD_PPQ = 220 7 | DEFAULT_QUARTERS_PER_MINUTE = 120.0 8 | ``` 9 | 10 | The indent size was 2 spaces and have been changed to 4 spaces. 11 | The 79 caracters per line is no more respected. 12 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | import setuptools 2 | 3 | with open("README.md", "r") as fh: 4 | long_description = fh.read() 5 | 6 | setuptools.setup( 7 | name="pitchplots", 8 | version="1.2.0", 9 | author="Fabian Moss", 10 | author_email="fabian.moss@epfl.ch", 11 | description="A package containing representation tools for musical purposes", 12 | long_description=long_description, 13 | long_description_content_type="text/markdown", 14 | url="https://github.com/DCMLab/pitchplots", 15 | packages=setuptools.find_packages(), 16 | package_data={ 17 | 'pitchplots': ['data/data_example.mxl'], 18 | }, 19 | classifiers=[ 20 | "Programming Language :: Python :: 3", 21 | "License :: OSI Approved :: MIT License", 22 | "Operating System :: OS Independent", 23 | ], 24 | ) -------------------------------------------------------------------------------- /LICENCE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Fabian Moss, Timothy Loayza 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files ("pitchplots"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /notebooks/parser_doc.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# parser documentation\n", 8 | "\n", 9 | " return the Dataframe, and possbily register it in csv, of the musicxml file\n", 10 | " \n", 11 | " Keyword arguments:\n", 12 | " filepath -- absolute path to the xml file by default goes to the example file\n", 13 | " filename -- give the name of the .csv file, by default give the same name as the .mxl file\n", 14 | " save_cvs -- if True save the csv file in the csv directory or at the given path\n", 15 | " duration -- define of the duration will be in seconds or relative to a whole note\n", 16 | " (possible values: 'seconds' or 'whole_note'(default value))" 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": 1, 22 | "metadata": {}, 23 | "outputs": [], 24 | "source": [ 25 | "import pitchplots.parser as ppp" 26 | ] 27 | }, 28 | { 29 | "cell_type": "code", 30 | "execution_count": null, 31 | "metadata": {}, 32 | "outputs": [], 33 | "source": [ 34 | "# piece is a pandas DataFrame of the list of note of the piece\n", 35 | "piece = ppp.xml_to_csv()" 36 | ] 37 | } 38 | ], 39 | "metadata": { 40 | "kernelspec": { 41 | "display_name": "Python 3", 42 | "language": "python", 43 | "name": "python3" 44 | }, 45 | "language_info": { 46 | "codemirror_mode": { 47 | "name": "ipython", 48 | "version": 3 49 | }, 50 | "file_extension": ".py", 51 | "mimetype": "text/x-python", 52 | "name": "python", 53 | "nbconvert_exporter": "python", 54 | "pygments_lexer": "ipython3", 55 | "version": "3.7.1" 56 | } 57 | }, 58 | "nbformat": 4, 59 | "nbformat_minor": 2 60 | } 61 | -------------------------------------------------------------------------------- /notebooks/tonnetz_anim_doc.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# tonnetz animation documentation\n", 8 | "\n", 9 | " Animation a 2D grid of hexagons, each hexagons being a note\n", 10 | " \n", 11 | " Keyword arguments:\n", 12 | " piece -- the absolute path to the .csv file containing the data or a DataFrame\n", 13 | " pitch_type -- the type of data that you want to be read (default 'tpc'), 'pc' could be use for twelve parts chart tpc\n", 14 | " form (tpc:[A, B#, Gbbb, ...], pc (pitch class):[0, 3, 7, ...])\n", 15 | " measures -- give a set of measures example [5, 18], will display the notes of the measures 5 to 18 included\n", 16 | " sampling_frequency -- the frequency of lecture of the piece, also correspond to the fps of the video\n", 17 | " speed_ratio -- set the speed at which the video is read, for example : 2 accelerate the speed of the video by 2\n", 18 | " pitch_class_display -- if True display the pitch class and no the tpc values and so the grid repeat itself.\n", 19 | " adaptive_scale -- if True, the scale evolve with the video, if not it stays the same\n", 20 | " duplicate -- if False there wont be any duplicate of note in the chart\n", 21 | " duration -- if True the value taking in account is the total duration of the note, if False it's the number of\n", 22 | " appearance\n", 23 | " log -- if True the scale is logarithmic if False it's linear\n", 24 | " colorbar -- if true display the colorbar in the background\n", 25 | " vocabulary -- the conversion dictionary from pitch class to tpc(F#, A, ...) format,\n", 26 | " radius -- define the number of layers of the hexagonal grid (default 3)\n", 27 | " hex_size -- indicate the size of the hexagons (default 1)\n", 28 | " fontsize -- indicate the size of the typo for the labels (default 1)\n", 29 | " figsize -- indicate the size of the produced figure in inches (default [14, 9])\n", 30 | " cmap -- indicate the type of color to use for the heatmap, see matplotlib color documentation (default 'Blues')\n", 31 | " nan_color -- give the possibility to set a color for the note that do not appear in the piece\n", 32 | " center -- you can set the note that will be in the center of the grid,\n", 33 | " by default it put the most recurent note in the center\n", 34 | " edgecolor -- the color of the edges of the hexagons\n", 35 | " filename -- the name of the file you want to save, the animation is in the format of filename\n", 36 | " **kwargs -- these arguments are redirected to matplotlib.patches.RegularPolygon, see informations at\n", 37 | " https://matplotlib.org/api/_as_gen/matplotlib.patches.RegularPolygon.html" 38 | ] 39 | }, 40 | { 41 | "cell_type": "code", 42 | "execution_count": 1, 43 | "metadata": {}, 44 | "outputs": [], 45 | "source": [ 46 | "import pitchplots.dynamic as ppd" 47 | ] 48 | }, 49 | { 50 | "cell_type": "code", 51 | "execution_count": 2, 52 | "metadata": {}, 53 | "outputs": [], 54 | "source": [ 55 | "#piece = '../data/data_example.csv'\n", 56 | "import pitchplots.parser as ppp\n", 57 | "piece = ppp.xml_to_csv()" 58 | ] 59 | }, 60 | { 61 | "cell_type": "code", 62 | "execution_count": null, 63 | "metadata": {}, 64 | "outputs": [], 65 | "source": [] 66 | } 67 | ], 68 | "metadata": { 69 | "kernelspec": { 70 | "display_name": "Python 3", 71 | "language": "python", 72 | "name": "python3" 73 | }, 74 | "language_info": { 75 | "codemirror_mode": { 76 | "name": "ipython", 77 | "version": 3 78 | }, 79 | "file_extension": ".py", 80 | "mimetype": "text/x-python", 81 | "name": "python", 82 | "nbconvert_exporter": "python", 83 | "pygments_lexer": "ipython3", 84 | "version": "3.7.1" 85 | } 86 | }, 87 | "nbformat": 4, 88 | "nbformat_minor": 2 89 | } 90 | -------------------------------------------------------------------------------- /notebooks/circle_anim_doc.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# circle animation documentation\n", 8 | "\n", 9 | " return the figure of a piechart with importance of the notes that are represented by the colour as a heatmap\n", 10 | "\n", 11 | " Keyword arguments:\n", 12 | " piece -- the absolute path to the .csv file containing the data or a DataFrame\n", 13 | " pitch_type -- the type of data that you want to be read (default 'tpc'), 'pc' could be use for twelve parts chart tpc\n", 14 | " form (tpc:[A, B#, Gbbb, ...], pc (pitch class):[0, 3, 7, ...])\n", 15 | " measures -- give a set of measures example [5, 18], will display the notes of the measures 5 to 18 included\n", 16 | " log -- if True the colors are distributed on a log scale, by default it's a lineare scale (default False)\n", 17 | " vocabulary -- the conversion dictionary from pitch class to tpc(F#, A, ...) format,\n", 18 | " pitch_class_display -- if True display the pitch class and no the tpc values and so the grid repeat itself.\n", 19 | " colorbar -- if true display the colorbar aside of the pie chart\n", 20 | " adaptive_scale -- if True, the scale evolve with the video, if not it stays the same\n", 21 | " duration -- tell him if he has to class the notes by their total duration or their number of appearance\n", 22 | " sampling_frequency -- the frequency of lecture of the piece, also correspond to the fps of the video\n", 23 | " speed_ratio -- set the speed at which the video is read, for example : 2 accelerate the speed of the video by 2\n", 24 | " fifths -- if True class the notes by fifths order, if not class by the chromatic order\n", 25 | " figsize -- tell the size of the figure in inches [x, y]\n", 26 | " top -- tell which note should be on the top of the piechart, different for tpc or pc\n", 27 | " rotation -- allows to rotate the piechart, int angle in degrees\n", 28 | " clockwise -- if True the piechart is displayed clockwise if not counter-clockwise\n", 29 | " cmap -- indicate the type of color to use for the heatmap, see matplotlib color documentation (default 'Blues')\n", 30 | " nan_color -- give the possibility to set a color for the note that do not appear in the piece (default 'nan')\n", 31 | " filename -- the name of the file you want to save, the animation is in the format of filename\n", 32 | " **kwargs -- these arguments are redirected to the matplotlib.pyplot.pie function, see informations at\n", 33 | " https://matplotlib.org/api/_as_gen/matplotlib.pyplot.pie.html" 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": 1, 39 | "metadata": {}, 40 | "outputs": [], 41 | "source": [ 42 | "import pitchplots.dynamic as ppd" 43 | ] 44 | }, 45 | { 46 | "cell_type": "code", 47 | "execution_count": 2, 48 | "metadata": {}, 49 | "outputs": [], 50 | "source": [ 51 | "def circle_animation(\n", 52 | " piece,\n", 53 | " pitch_type='tpc',\n", 54 | " measures=None,\n", 55 | " log=False,\n", 56 | " vocabulary={0:'C', 1:'Db', 2:'D', 3:'Eb', 4:'E', 5:'F', 6:'Gb', 7:'G', 8:'Ab', 9:'A', 10:'Bb', 11:'B'},\n", 57 | " pitch_class_display=False,\n", 58 | " colorbar=True,\n", 59 | " adaptive_scale=True,\n", 60 | " duration=False,\n", 61 | " sampling_frequency=25,\n", 62 | " speed_ratio=1,\n", 63 | " fifths=True,\n", 64 | " figsize=[14, 9],\n", 65 | " top=None,\n", 66 | " rotation=0,\n", 67 | " clockwise=True,\n", 68 | " cmap='Blues',\n", 69 | " nan_color='white',\n", 70 | " filename='animated_circle.mp4',\n", 71 | " **kwargs):\n", 72 | " pass" 73 | ] 74 | }, 75 | { 76 | "cell_type": "code", 77 | "execution_count": null, 78 | "metadata": {}, 79 | "outputs": [], 80 | "source": [] 81 | } 82 | ], 83 | "metadata": { 84 | "kernelspec": { 85 | "display_name": "Python 3", 86 | "language": "python", 87 | "name": "python3" 88 | }, 89 | "language_info": { 90 | "codemirror_mode": { 91 | "name": "ipython", 92 | "version": 3 93 | }, 94 | "file_extension": ".py", 95 | "mimetype": "text/x-python", 96 | "name": "python", 97 | "nbconvert_exporter": "python", 98 | "pygments_lexer": "ipython3", 99 | "version": "3.7.1" 100 | } 101 | }, 102 | "nbformat": 4, 103 | "nbformat_minor": 2 104 | } 105 | -------------------------------------------------------------------------------- /functions.py: -------------------------------------------------------------------------------- 1 | """ 2 | stack of functions for the program 3 | """ 4 | import numpy as np 5 | import pandas as pd 6 | 7 | def get_dic_nei(pitch_class_display): 8 | """for musical_plot_hex it need the neighbouring notes in the hexagonal shape, return dictionary 9 | ref is the list of note that we are refering to 10 | pos is the position of the neighbouring note that we want to know 11 | note is the note at the position from the refering note 12 | sup is the accidental of the note at the given position 13 | """ 14 | if pitch_class_display: 15 | # for every note there is a row 16 | dic_nei = {'ref':[i for sublist in [[i]*6 for i in range(12)] for i in sublist], 17 | 'pos': [(1,0,-1), (1,-1,0), (0,-1,1), (-1,0,1), (-1,1,0), (0,1,-1)]*12, 18 | 'note': [4, 7, 3, 8, 5, 9, 19 | 5, 8, 4, 9, 6, 10, 20 | 6, 9, 5, 10, 7, 11, 21 | 7, 10, 6, 11, 8, 0, 22 | 8, 11, 7, 0, 9, 1, 23 | 9, 0, 8, 1, 10, 2, 24 | 10, 1, 9, 2, 11, 3, 25 | 11, 2, 10, 3, 0, 4, 26 | 0, 3, 11, 4, 1, 5, 27 | 1, 4, 0, 5, 2, 6, 28 | 2, 5, 1, 6, 3, 7, 29 | 3, 6, 2, 7, 4, 8]} 30 | else: 31 | dic_nei = {'ref':[c for sublist in [[c]*6 for c in 'FCGDAEB'] for c in sublist], 32 | 'pos': [(1,0,-1), (1,-1,0), (0,-1,1), (-1,0,1), (-1,1,0), (0,1,-1)]*7, 33 | 'note': ['A', 'C', 'A', 'D', 'B', 'D', 34 | 'E', 'G', 'E', 'A', 'F', 'A', 35 | 'B', 'D', 'B', 'E', 'C', 'E', 36 | 'F', 'A', 'F', 'B', 'G', 'B', 37 | 'C', 'E', 'C', 'F', 'D', 'F', 38 | 'G', 'B', 'G', 'C', 'A', 'C', 39 | 'D', 'F', 'D', 'G', 'E', 'G'], 40 | 'acc': [0, 0, -1, -1, -1, 0, 41 | 0, 0, -1, -1, 0, 0, 42 | 0, 0, -1, -1, 0, 0, 43 | 1, 0, 0, -1, 0, 0, 44 | 1, 0, 0, 0, 0, 1, 45 | 1, 0, 0, 0, 0, 1, 46 | 1, 1, 0, 0, 0, 1]} 47 | return dic_nei 48 | 49 | def sampling(value, sampling_frequency): 50 | """return the sampled value at a given sampling frequency""" 51 | ret_value = 0 52 | 53 | if value%(1/sampling_frequency) <= (1/sampling_frequency)/2: 54 | ret_value = value - (value%(1/sampling_frequency)) 55 | else: 56 | ret_value = value - (value%(1/sampling_frequency)) + (1/sampling_frequency) 57 | 58 | return ret_value 59 | 60 | def put_flat_sharp(step, acc): 61 | """get a step and its acc and return the note in tpc notation, return str""" 62 | ret_note = step # not needed 63 | ret_acc = acc 64 | 65 | #put the flats and sharps 66 | if ret_acc > 0: 67 | for l in range(ret_acc): 68 | ret_note = ret_note + '#' 69 | if ret_acc < 0: 70 | ret_acc = abs(ret_acc) 71 | for l in range(ret_acc): 72 | ret_note = ret_note + 'b' 73 | return ret_note # not needed 74 | 75 | def is_tpc(note): 76 | """check if note has the same format as tpc, return boolean""" 77 | s_tpc_values_1 = pd.Series(['F', 'C', 'G', 'D', 'A', 'E', 'B']) 78 | s_tpc_values_2 = pd.Series(['b', '#']) 79 | 80 | correct_format_tpc = True 81 | count = 0 82 | 83 | for i in str(note): 84 | count = count + 1 85 | 86 | #check first character 87 | if (count == 1): 88 | if (i == s_tpc_values_1).any() == False: 89 | correct_format_tpc = False 90 | 91 | #check the flats and sharps 92 | else: 93 | if (i == s_tpc_values_2).any() == False: 94 | correct_format_tpc = False 95 | if correct_format_tpc == False: 96 | break 97 | return correct_format_tpc 98 | 99 | def is_pc(note): 100 | """check if note has the same format as pc, return boolean""" 101 | return note in range(12) 102 | 103 | def get_acc(note): 104 | """get the acc from a tpc format, return int""" 105 | if is_tpc(note): 106 | acc = 0 107 | for i in str(note): 108 | if i == '#': 109 | acc = acc + 1 110 | if i == 'b': 111 | acc = acc - 1 112 | return acc 113 | 114 | def get_step(note): 115 | """get the step from a tpc format, return str""" 116 | if is_tpc(note): 117 | step = '' 118 | step = str(note)[0] 119 | return step 120 | 121 | def get_pc(note): 122 | """get the pitch class from a tpc value, return int""" 123 | pc = np.NaN 124 | s_tpc_pc = pd.Series(data=[0, 2, 4, 5, 7, 9, 11], index=['C', 'D', 'E', 'F', 'G', 'A', 'B']) 125 | if pd.isnull(note) == False: 126 | pc = s_tpc_pc.at[get_step(note)] 127 | pc = pc + get_acc(note) 128 | ###heck modulo 129 | while pc < 0: 130 | pc = pc + 12 131 | while pc > 11: 132 | pc = pc - 12 133 | return pc 134 | 135 | def get_fifth_nb(note): 136 | """return the position of the note in the fifth line""" 137 | step = get_step(note) 138 | acc = get_acc(note) 139 | dic = {'F':0, 'C':1, 'G':2, 'D':3, 'A':4, 'E':5, 'B':6} 140 | return dic[step] + acc * 7 141 | 142 | #change note to fifth_number Use same dictionnary 143 | def get_fifth_note(note): 144 | """return the note after the fifth number""" 145 | count = 0 146 | ret_note = 0 147 | copy_note = int(note) 148 | while copy_note < 0 or copy_note > 6: 149 | if copy_note < 0: 150 | copy_note = copy_note + 7 151 | count = count - 1 152 | if copy_note > 6: 153 | copy_note = copy_note - 7 154 | count = count + 1 155 | if copy_note == 0: ret_note = 'F' 156 | if copy_note == 1: ret_note = 'C' 157 | if copy_note == 2: ret_note = 'G' 158 | if copy_note == 3: ret_note = 'D' 159 | if copy_note == 4: ret_note = 'A' 160 | if copy_note == 5: ret_note = 'E' 161 | if copy_note == 6: ret_note = 'B' 162 | ret_note = put_flat_sharp(ret_note, count) 163 | return ret_note 164 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # pitchplots 2 | 3 | ![header](images/big_blue_hex_8_top.png) 4 | 5 | A python library for plotting note distributions in different tonal spaces. [![DOI](https://zenodo.org/badge/145848867.svg)](https://zenodo.org/badge/latestdoi/145848867) 6 | 7 | ## Getting Started 8 | 9 | The library contains the following files 10 | * `functions.py`, 11 | * `reader.py`, 12 | * `modified_music_xml.py`, 13 | * `parser.py` 14 | * `static.py` 15 | 16 | ### Prerequisites 17 | 18 | In order to use **pitchplots** you need a running Python 3 environment and the following libraries: 19 | * matplotlib 20 | * pandas 21 | * numpy 22 | 23 | to install these libraries, you can do the following command in the prompt: 24 | 25 | ``` 26 | python3 -m pip install matplotlib>=3.0.1 pandas>=0.23.4 numpy>=1.15.3 27 | ``` 28 | 29 | or if you're using the Anaconda prompt 30 | 31 | ``` 32 | pip install matplotlib>=3.0.1 pandas>=0.23.4 numpy>=1.15.3 33 | ``` 34 | 35 | Or you can use the requirements.txt file in the github. 36 | Dont' forget to set the path to the one of the requirements file. 37 | 38 | ``` 39 | python3 -m pip install -r requirements.txt 40 | ``` 41 | 42 | ### Installation 43 | 44 | You can install the pitchplots package on pypi with pip using the following command in the prompt: 45 | 46 | ``` 47 | python3 -m pip install pitchplots 48 | ``` 49 | 50 | or if you're using the Anaconda prompt 51 | 52 | ``` 53 | pip install pitchplots 54 | ``` 55 | ## Functions 56 | 57 | ![1](images/Tp1_def_hex.png) ![2](images/Tp2_hex_orange_pc_5.png) ![2](images/Tp3_hex_noduplicate.png) 58 | ![4](images/Tp4_def_pie.png) ![5](images/Tp5_red_pie_nofifith.png) ![6](images/Tp6_log_pie.png) 59 | 60 | **Pitchplots** has currently three plotting functions 61 | - `tonnetz` uses a `.csv` file or a pandas DataFrame of a piece of music to do a hexagonal 2D representation ("Tonnetz"). 62 | - `circle` uses a csv file or a pandas DataFrame of a piece of music to represent the notes by fifth or chromatic. 63 | - `line` uses a csv file or a pandas DataFrame of a piece of music to represent the notes by fifth or chromatic on a line, the unrolled equivalent to the circle function. 64 | 65 | Two animation functions 66 | - `tonnetz_animation` plot the same graphs as the `tonnetz` function but is animated. 67 | - `circle_animation` plot the same graphs as the `circle` function but is animated. 68 | 69 | and one function to parse (compressed) MusicXML files and uncompressed xml files 70 | - `xml_to_csv` uses a `.mxl` or `.xml` file and parses it into a `.csv` file using the [TensorFlow Magenta](https://github.com/tensorflow/magenta) `musicxml_parser.py`. 71 | 72 | ## Working with files 73 | 74 | ### Parsing 75 | 76 | **Pitchplots** plots note distributions from MusicXML files (`.xml` or `.mxl`). You can either specify your own file or use the [test file](data_example.mxl) `data_example.mxl`. contained in the package. 77 | 78 | The first step is to parse the file into a note list representation that is stored in a pandas DataFrame where each line corresponds to a note or a rest. 79 | 80 | ```python 81 | import pitchplots.parser as ppp 82 | 83 | # If no filepath is specified, will automatically charge data_example.mxl 84 | df_data_example = ppp.xml_to_csv(save_csv=True) 85 | ``` 86 | 87 | To use your own file, add `filepath=` with the location of your file in the parameters of the function `xml_to_csv`. 88 | 89 | ### Plotting 90 | 91 | In order to plot the notes of a piece, import the `pitchplots.static` module and use one of its plotting functions. They take as input the output of the parser, i.e. either a DataFrame object: 92 | 93 | ```python 94 | import pitchplots.static as pps 95 | 96 | pps.tonnetz(df_data_example) 97 | ``` 98 | or a CSV file: 99 | ```python 100 | import pitchplots.static as pps 101 | 102 | pps.tonnetz('csv/data_example.csv') 103 | ``` 104 | In both cases the output should look like the following image (of course, the note distribution depends on the piece you are plotting): 105 | 106 | ![tonnetz_example](images/Tp1_def_hex.png) 107 | 108 | Or if you want to plot a line: 109 | 110 | ```python 111 | import pitchplots.static as pps 112 | 113 | pps.line(df_data_example) 114 | ``` 115 | or a CSV file: 116 | ```python 117 | import pitchplots.static as pps 118 | 119 | pps.line('csv/data_example.csv') 120 | ``` 121 | 122 | In both cases the output should look like the following image (of course, the note distribution depends on the piece you are plotting): 123 | 124 | ![line_example](images/line_example.png) 125 | 126 | Or if you want to plot a circle: 127 | 128 | ```python 129 | import pitchplots.static as pps 130 | 131 | pps.circle(df_data_example) 132 | ``` 133 | or a CSV file: 134 | ```python 135 | import pitchplots.static as pps 136 | 137 | pps.circle('csv/data_example.csv') 138 | ``` 139 | 140 | In both cases the output should look like the following image (of course, the note distribution depends on the piece you are plotting): 141 | 142 | ![circle_example](images/circle_example.png) 143 | 144 | ## detailed functionality 145 | 146 | see the following files for more informations about the functions parser, line, circle, tonnetz, circle_animation and tonnetz_animation. 147 | 148 | [parser documentation](notebooks/parser_doc.ipynb) 149 | [line documentation](notebooks/line_doc.ipynb) 150 | [circle documentation](notebooks/circle_doc.ipynb) 151 | [tonnetz documentation](notebooks/tonnetz_doc.ipynb) 152 | 153 | ## Further Information 154 | ### Authors 155 | * [**Fabian C. Moss**](https://github.com/fabianmoss) 156 | * [**Timothy Loayza**](https://github.com/TimothyLoayza) 157 | * Martin Rohrmeier 158 | 159 | If you use *pitchplots* in academic publications, please cite the library as 160 | 161 | ``` 162 | Moss, Fabian C.; Loayza, Timothy & Rohrmeier Martin. (2019). pitchplots (Version 1.4.2). Zenodo. http://doi.org/10.5281/zenodo.3265393 163 | ``` 164 | 165 | ### Usage of Magenta's code 166 | 167 | The [modified_musicxml_parser.py](modified_musicxml_parser.py) file is taken from the [TensorFlow Magenta](https://github.com/tensorflow/magenta) project and has been modified. See the [modifications](magenta/magenta_musicxml_code_modifications.md) and the [Magenta License](magenta/magenta_LICENSE.md). 168 | 169 | ### License 170 | 171 | Pitchplots is licensed under the MIT License - see the [LICENSE](LICENSE.md) file for details 172 | -------------------------------------------------------------------------------- /reader.py: -------------------------------------------------------------------------------- 1 | """ 2 | module that has to read what is given to the plotting functions 3 | """ 4 | import os 5 | 6 | from pitchplots.functions import get_acc, get_step, get_pc, sampling 7 | 8 | import pandas as pd 9 | import moviepy.editor as mpe 10 | #from midiutil import MIDIFile 11 | #import librosa 12 | #import numpy 13 | 14 | def get_df_short( 15 | piece, 16 | vocabulary={0:'C', 1:'Db', 2:'D', 3:'Eb', 4:'E', 5:'F', 6:'Gb', 7:'G', 8:'Ab', 9:'A', 10:'Bb', 11:'B'}, 17 | pitch_type='tpc', 18 | duration=False, 19 | measures=None): 20 | """return a Dataframe with the condenced information about the piece for static plots 21 | 22 | Function: 23 | Get a file columns and read it to create a dataFrame with the following informations: 24 | pitch class value('pc'), number of appearences('nb'), total duration of the note('duration'), 25 | tpc format note('tpc'), sharps and flats('acc') 26 | Keyword arguments: 27 | piece -- the absolute path to the .csv file containing the data 28 | vocabulary -- the conversion table from pitch class to tpc(F#, A, ...) format, 29 | the position indicate the pitch class value (default [C, Db, D, Eb, E, F, Gb, G, Ab, A, Bb, B]) 30 | pitch_type -- the type of data that contains the file (default 'tpc') 31 | (tpc:[A, B#, Gbbb, ...], pc (pitch class):[0, 3, 7, ...]) 32 | duration -- tell him if he has to class the notes by their total duration or their number of appearance 33 | measures -- give a set of measures example [5, 18], will display the notes of the measures 5 to 18 included 34 | """ 35 | #check if it is a path to .csv or a DataFrame 36 | if isinstance(piece, pd.DataFrame): 37 | df_data = piece.copy() 38 | else: 39 | df_data = pd.read_csv(piece) 40 | 41 | #the column with the pc values is called pitch_class so it rename it to 'pc' 42 | if 'pitch_class' in df_data.columns: 43 | df_data.rename(columns={'pitch_class': 'pc'}, inplace=True) 44 | 45 | if type(measures) is list: 46 | df_data.drop(df_data[df_data.measure_no < measures[0]].index, inplace=True) 47 | df_data.drop(df_data[df_data.measure_no > measures[1]].index, inplace=True) 48 | df_data.reset_index(drop=True, inplace=True) 49 | 50 | #If pitch_type is "tpc" we get a small DataFrame with the the columns: 51 | # tpc, nb, duration (if exist), pc, acc, step 52 | if 'tpc' in df_data.columns and pitch_type == 'tpc': 53 | s_tpc = df_data['tpc'].groupby(df_data['tpc']).size() 54 | if not duration: 55 | s_tpc.sort_values(inplace=True, ascending=False) 56 | df_tpc = pd.DataFrame({'tpc':s_tpc.index, 'nb':s_tpc.values}) 57 | if 'duration' in df_data.columns: 58 | df_duration = pd.DataFrame(df_data.groupby('tpc').duration.sum()) 59 | df_tpc = pd.merge(df_tpc, df_duration, on='tpc') 60 | if duration: 61 | df_tpc.sort_values('duration', inplace=True, ascending=False) 62 | 63 | #get the pc values from tpc 64 | df_tpc['pc'] = df_tpc['tpc'].apply(get_pc) 65 | 66 | #add the sup column 67 | df_tpc['acc'] = df_tpc['tpc'].apply(get_acc) 68 | 69 | df_tpc['step'] = df_tpc['tpc'].apply(get_step) 70 | 71 | return df_tpc 72 | 73 | #If pitch_type is "pc" we get a small DataFrame with the the columns: 74 | # pc, nb, duration (if exist), tpc(from vocabulary), acc, step 75 | if 'pc' in df_data.columns and pitch_type == 'pc': 76 | s_pc = df_data['pc'].groupby(df_data['pc']).size() 77 | if not duration: 78 | s_pc.sort_values(inplace=True, ascending=False) 79 | df_pc = pd.DataFrame({'pc':s_pc.index, 'nb':s_pc.values}) 80 | 81 | #add the duration column 82 | if 'duration' in df_data.columns: 83 | df_duration = pd.DataFrame(df_data.groupby('pc').duration.sum()) 84 | df_pc = pd.merge(df_pc, df_duration, on='pc') 85 | if duration: 86 | df_pc.sort_values('duration', inplace=True, ascending=False) 87 | 88 | #add the tpc column 89 | s_tpc_pc = [] 90 | for i in range(df_pc.shape[0]): 91 | s_tpc_pc.append(vocabulary[int(df_pc.at[i, 'pc'])]) 92 | 93 | df_pc['tpc'] = pd.Series(s_tpc_pc) 94 | 95 | #add the sup column 96 | df_pc['acc'] = df_pc['tpc'].apply(get_acc) 97 | 98 | #keep only the step from tpc 99 | df_pc['step'] = df_pc['tpc'].apply(get_step) 100 | 101 | return df_pc 102 | 103 | def get_df_long( 104 | piece, 105 | vocabulary={0:'C', 1:'Db', 2:'D', 3:'Eb', 4:'E', 5:'F', 6:'Gb', 7:'G', 8:'Ab', 9:'A', 10:'Bb', 11:'B'}, 106 | pitch_type='tpc', 107 | measures=None, 108 | sampling_frequency=50, 109 | speed_ratio=1, 110 | audio=False): 111 | """get the whole columns 112 | need a column 'onset_seconds' that is the onset but in seconds 113 | Keyword arguments: 114 | piece -- the absolute path to the .csv file containing the data 115 | vocabulary -- the conversion table from pitch class to tpc(F#, A, ...) format, 116 | the position indicate the pitch class value (default [C, Db, D, Eb, E, F, Gb, G, Ab, A, Bb, B]) 117 | pitch_type -- the type of data that contains the file (default 'tpc') 118 | (tpc:[A, B#, Gbbb, ...], pc (pitch class):[0, 3, 7, ...]) 119 | measures -- give a set of measures example [5, 18], will display the notes of the measures 5 to 18 included 120 | sampling_frequency -- the frequency of lecture of the piece, also correspond to the fps of the video 121 | speed_ratio -- set the speed at which the video is read, for example : 2 accelerate the speed of the video by 2 122 | audio -- if True render the soundtrack for the animation 123 | """ 124 | if isinstance(piece, pd.DataFrame): 125 | df_data = piece.copy() 126 | else: 127 | df_data = pd.read_csv(piece) 128 | 129 | #the column with the pc values is called pitch_class so it rename it to 'pc' 130 | if 'pitch_class' in df_data.columns: 131 | df_data.rename(columns={'pitch_class': 'pc'}, inplace=True) 132 | 133 | #drop the unwanted measures 134 | if type(measures) is list: 135 | df_data.drop(df_data[df_data.measure_no < measures[0]].index, inplace=True) 136 | df_data.drop(df_data[df_data.measure_no > measures[1]].index, inplace=True) 137 | df_data.reset_index(drop=True, inplace=True) 138 | df_data['onset_seconds'] -= df_data['onset_seconds'].min() 139 | df_data['onset'] -= df_data['onset'].min() 140 | 141 | if 'tpc' in df_data.columns and pitch_type=='tpc': 142 | if 'acc' not in df_data.columns: 143 | df_data['acc'] = df_data['tpc'].apply(get_acc) 144 | if 'step' not in df_data.columns: 145 | df_data['step'] = df_data['tpc'].apply(get_step) 146 | if 'pc' in df_data.columns and pitch_type=='pc': 147 | if 'tpc' not in df_data.columns: 148 | df_data['tpc'] = df_data.replace({"pc":vocabulary}) 149 | if 'acc' not in df_data.columns: 150 | df_data['acc'] = df_data['tpc'].apply(get_acc) 151 | if 'step' not in df_data.columns: 152 | df_data['step'] = df_data['tpc'].apply(get_step) 153 | 154 | #the animation functions do not need the rests 155 | if 'type' in df_data.columns: 156 | df_data.drop(df_data[df_data.type == 'rest'].index, inplace=True) 157 | 158 | df_data.sort_values('onset_seconds', inplace = True) 159 | df_data['onset_seconds'] *= (1/speed_ratio) 160 | df_data.reset_index(inplace=True) 161 | 162 | ###AUDIO 163 | if audio: 164 | sound_path = os.path.dirname(os.path.realpath(__file__))+'\\'+'data'+'\\' 165 | soundtrack = mpe.AudioFileClip(sound_path+'silence.wav') 166 | print('Rendering the soundtrack') 167 | for i in range(df_data.shape[0]): 168 | note_sound = mpe.AudioFileClip(sound_path+'midi'+str(int(df_data.at[i, 'pitch']))+'.wav') 169 | #NOTE TO EXPLAIN THAT 170 | if df_data.at[i, 'duration']*4*60/df_data.at[i, 'qpm'] < 4: 171 | note_sound = note_sound.set_duration(df_data.at[i, 'duration']*4*60/df_data.at[i, 'qpm']) 172 | else: 173 | note_sound = note_sound.set_duration(4) 174 | note_sound = note_sound.set_start(df_data.at[i, 'onset_seconds']) 175 | soundtrack = mpe.CompositeAudioClip([soundtrack, note_sound]) 176 | print('The soundtrack is done') 177 | 178 | # soundtrack.write_audiofile("test1.wav", fps=44100) 179 | 180 | df_data['onset_seconds'] = df_data['onset_seconds'].apply(sampling, sampling_frequency=sampling_frequency) 181 | 182 | # if midi: 183 | # midi_track = 0 184 | # midi_channel = 0 185 | # midi_time = 0 # In beats 186 | # midi_tempo = df_data.at[0, 'qpm']*speed_ratio # In BPM 187 | # midi_volume = 100 # 0-127, as per the MIDI standard 188 | # 189 | # MyMIDI = MIDIFile(1) # One track, defaults to format 1 (tempo track is created 190 | # # automatically) 191 | # MyMIDI.addTempo(midi_track, midi_time, midi_tempo) 192 | # s_onset = pd.Series(data=(df_data['onset']*df_data['time_sign_num']/df_data['time_sign_den'])*4) 193 | # 194 | # for i in range(df_data.shape[0]): 195 | # MyMIDI.addNote(midi_track, midi_channel, int(df_data.at[i, 'pitch']), s_onset[i], df_data.at[i, 'duration']*4, midi_volume) 196 | # 197 | # with open("pitchplots_midi.mid", "wb") as output_file: 198 | # MyMIDI.writeFile(output_file) 199 | # 200 | # y, sr = librosa.load('pitchplots_midi.mid') 201 | # librosa.output.write_wav('pitchplots_sound_only.wav', y, sr) 202 | if audio: 203 | return (df_data, soundtrack) 204 | else: 205 | return df_data 206 | -------------------------------------------------------------------------------- /parser.py: -------------------------------------------------------------------------------- 1 | """ 2 | Parse .xml or .mxl files and return a pandas DataFrameself. 3 | """ 4 | import sys 5 | import os 6 | 7 | import numpy as np 8 | import pandas as pd 9 | 10 | # import xml parser from magenta 11 | from pitchplots.modified_musicxml_parser import MusicXMLDocument 12 | 13 | class ParseError(Exception): 14 | """ 15 | Exception thrown when the MusicXML contents cannot be parsed. 16 | """ 17 | pass 18 | 19 | ### DEFINE PARSER 20 | def xml_to_csv(filepath=os.path.dirname(os.path.realpath(__file__))+'\\'+'data'+'\\'+'data_example.mxl', 21 | filename=None, save_csv=True, duration='whole_note'): 22 | """return the Dataframe, and possbily register it in csv, of the musicxml file 23 | 24 | Keyword arguments: 25 | filepath -- absolute path to the xml file by default goes to the example file 26 | filename -- give the name of the .csv file, by default give the same name as the .mxl file 27 | save_cvs -- if True save the csv file in the csv directory or at the given path 28 | duration -- define of the duration will be in seconds or relative to a whole note 29 | (possible values: 'seconds' or 'whole_note'(default value)) 30 | """ 31 | columns = ['filepath', # piece ID or something (TODO) 32 | 'qpm', #add qpm, the beat per minute 33 | 'time_sign_num', #add the time signature numerator 34 | 'time_sign_den', #add the time signature denumerator 35 | 'measure_no', # number of measure 36 | 'no_accs', # number of accidentals 37 | 'mode', # mode of key as defined in XML (not reliable) 38 | 'key_area', # begin of key signature 39 | 'type', # type of event (note or rest) 40 | 'note_name', # note name (e.g. C4, Bb2) 41 | 'tpc', # tonal pitch class: note name w/o octave, e.g. C, F#... 42 | 'step', # diatonic step in A, B, C, D, E, F, G 43 | 'acc', # accidentals 44 | 'octave', # octave number (int) 45 | 'pitch', # MIDI pitch name (i.e. C4 = 60) 46 | 'pitch_class', # pitch modulo 12 47 | 'duration', # note duration in beats as float (i.e. a quarter note is 0.25) ???? IS THIS CORRECT? 48 | 'onset' # onset in seconds 49 | ] 50 | 51 | #add of these variables for control 52 | key_signature_on = False 53 | time_signature_on = False 54 | qpm_on = False 55 | 56 | try: 57 | parsed = MusicXMLDocument(filepath) 58 | except: 59 | raise ParseError('There is a problem with the path to the xml/mxl file or the files are not standard.') 60 | 61 | df = pd.DataFrame(columns=columns) 62 | 63 | for part in parsed.parts: 64 | measure_no = 0 65 | for measure in part.measures: 66 | measure_no += 1 67 | 68 | #keep the previous key signature 69 | #because the key signature appears only if it changes 70 | if pd.isnull(measure.key_signature) == False: 71 | key_signature_on = True 72 | root = measure.key_signature.key 73 | mode = measure.key_signature.mode 74 | key_area = measure.key_signature.time_position 75 | elif key_signature_on == False: 76 | root = np.nan 77 | mode = np.nan 78 | key_area = np.nan 79 | 80 | #adding of the time_signature like the key_signature 81 | if pd.isnull(measure.time_signature) == False: 82 | time_signature_on = True 83 | time_sign_num = measure.time_signature.numerator 84 | time_sign_den = measure.time_signature.denominator 85 | elif time_signature_on == False: 86 | time_sign_num = np.nan 87 | time_sign_den = np.nan 88 | 89 | #adding of qpm 90 | if pd.isnull(measure.state.qpm) == False: 91 | qpm_on = True 92 | qpm = measure.state.qpm 93 | elif qpm_on == False: 94 | qpm = np.nan 95 | 96 | for note in measure.notes: 97 | if note.is_rest: 98 | ntype = 'rest' 99 | else: 100 | ntype = 'note' 101 | if note.pitch is not None: 102 | note_name = note.pitch[0] 103 | tpc = note_name[:-1] 104 | pitch = int(note.pitch[1]) 105 | pitch_class = int(note.pitch[1] % 12) 106 | step = note_name[0] 107 | if '#' in note_name: 108 | acc = 1 109 | elif 'bb' in note_name: 110 | acc = -2 111 | elif 'b' in note_name: 112 | acc = -1 113 | elif 'x' in note_name: 114 | acc = 2 115 | else: 116 | acc = 0 117 | octave = note_name[-1] 118 | else: 119 | note_name = np.nan 120 | tpc = np.nan 121 | pitch = np.nan 122 | step = np.nan 123 | acc = np.nan 124 | pitch_class = np.nan 125 | octave = np.nan 126 | duration = note.note_duration.duration_float() 127 | onset = note.note_duration.time_position 128 | 129 | # final list of of the columns of the dataframe 130 | values = [filepath, 131 | qpm, 132 | time_sign_num, 133 | time_sign_den, 134 | measure_no, 135 | root, 136 | mode, 137 | key_area, 138 | ntype, 139 | note_name, 140 | tpc, 141 | step, 142 | acc, 143 | octave, 144 | pitch, 145 | pitch_class, 146 | duration, 147 | onset] 148 | row = dict(zip(columns, values)) 149 | df = df.append(row, ignore_index=True) 150 | 151 | # correct the onset to be quantized by the measure number 152 | # add the 'onset_seconds' column from the new onset, for the dynamic plotting 153 | df = data_onset_duration_corrector(df, duration) 154 | 155 | if save_csv: 156 | # path to the csv directory 157 | csv_path = os.path.dirname(sys.argv[0])+r'/csv' 158 | # get the name from the xml file and put in csv dir 159 | if pd.isnull(filename): 160 | if not os.path.exists(csv_path): 161 | os.makedirs(csv_path) 162 | filename = os.path.basename(filepath).split('.')[0] + '.csv' 163 | df.to_csv(os.path.join(csv_path,filename), sep=',') 164 | # if filename is a path, register the csv file at the given path 165 | elif "\\" in filename or "/" in filename: 166 | df.to_csv(filename, sep=',') 167 | # get the name and put it in csv folder 168 | else: 169 | # check if the csv folder already exist if not create one 170 | if not os.path.exists(csv_path): 171 | os.makedirs(csv_path) 172 | df.to_csv(os.path.join(csv_path,filename), sep=',') 173 | 174 | return df 175 | 176 | def data_onset_duration_corrector(data, duration): 177 | """ 178 | corrects the duration and onset of the piece and normalize by the measure 179 | 180 | Keyword arguments: 181 | data -- the pandas DataFrame of the piece 182 | duration -- define of the duration will be in seconds or relative to a whole note 183 | (possible values: 'seconds' or 'whole_note'(default value)) 184 | return: 185 | ret_data -- the pandas DataFrame of the the correction of the piece 186 | """ 187 | corr_data = data.copy() 188 | 189 | #get rid of notes and rests that have a 0 duration 190 | #they are more likely falsely parsed notes from musicxml_parser 191 | corr_data.drop(corr_data[corr_data.duration == 0].index, inplace=True) 192 | 193 | min_onset = 0 194 | max_onset = 0 195 | onset_ratio = 0 196 | duration_ratio = 0 197 | current_minimum_time = 0 198 | time_ratio = 0 199 | 200 | #get rid of all the notes that have a zero duration 201 | corr_data.drop(corr_data[corr_data.duration == 0].index, inplace=True) 202 | 203 | #group the notes by measure 204 | gb_mesure_no = corr_data.groupby('measure_no') 205 | 206 | ret_data = pd.DataFrame() 207 | 208 | for i in range(corr_data['measure_no'].max()): 209 | df_group = gb_mesure_no.get_group(i+1).copy() 210 | 211 | #assume that the onset_ratio is the same for the last and before last measure 212 | if i != corr_data['measure_no'].max() - 1: 213 | df_group_next = gb_mesure_no.get_group(i+1+1) 214 | 215 | #it is assumed that the first note of the measure begins at the start of the measure 216 | min_onset = df_group['onset'].min() 217 | max_onset = df_group_next['onset'].min() 218 | onset_ratio = 1/(max_onset-min_onset) 219 | 220 | #set the onset like the first note start at the at the start of the onset 221 | df_group['onset'] *= onset_ratio 222 | df_group['onset'] += (i - df_group['onset'].min()) 223 | 224 | #the time signature is the same for the whole measure 225 | duration_ratio = df_group['time_sign_den'].iloc[0]/df_group['time_sign_num'].iloc[0] 226 | 227 | # if True change the duration to be in seconds using the BPM value 228 | if duration =='seconds': 229 | #so the duration is equal to the number of seconds of the quatized note 230 | df_group['duration'] *= (4*60)/df_group['qpm'].iloc[0] 231 | 232 | #the ratio between the time in second when the note is played and the measure relative timing 233 | time_ratio = (4 * 60)/(duration_ratio * df_group['qpm'].iloc[0]) 234 | 235 | #the adding of the time column using the onset column as base 236 | df_group = df_group.assign(onset_seconds=df_group['onset'].values) 237 | df_group['onset_seconds'] += -i 238 | df_group['onset_seconds'] *= time_ratio 239 | df_group['onset_seconds'] += current_minimum_time 240 | 241 | #the calculation of the time in second when the next measure begins 242 | current_minimum_time = current_minimum_time + time_ratio 243 | 244 | #add the group to the note sequence 245 | ret_data = pd.concat([ret_data, df_group]) 246 | 247 | return ret_data -------------------------------------------------------------------------------- /magenta/magenta_LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright 2016 The Magenta Team. All rights reserved. 2 | 3 | Apache License 4 | Version 2.0, January 2004 5 | http://www.apache.org/licenses/ 6 | 7 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 8 | 9 | 1. Definitions. 10 | 11 | "License" shall mean the terms and conditions for use, reproduction, 12 | and distribution as defined by Sections 1 through 9 of this document. 13 | 14 | "Licensor" shall mean the copyright owner or entity authorized by 15 | the copyright owner that is granting the License. 16 | 17 | "Legal Entity" shall mean the union of the acting entity and all 18 | other entities that control, are controlled by, or are under common 19 | control with that entity. For the purposes of this definition, 20 | "control" means (i) the power, direct or indirect, to cause the 21 | direction or management of such entity, whether by contract or 22 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 23 | outstanding shares, or (iii) beneficial ownership of such entity. 24 | 25 | "You" (or "Your") shall mean an individual or Legal Entity 26 | exercising permissions granted by this License. 27 | 28 | "Source" form shall mean the preferred form for making modifications, 29 | including but not limited to software source code, documentation 30 | source, and configuration files. 31 | 32 | "Object" form shall mean any form resulting from mechanical 33 | transformation or translation of a Source form, including but 34 | not limited to compiled object code, generated documentation, 35 | and conversions to other media types. 36 | 37 | "Work" shall mean the work of authorship, whether in Source or 38 | Object form, made available under the License, as indicated by a 39 | copyright notice that is included in or attached to the work 40 | (an example is provided in the Appendix below). 41 | 42 | "Derivative Works" shall mean any work, whether in Source or Object 43 | form, that is based on (or derived from) the Work and for which the 44 | editorial revisions, annotations, elaborations, or other modifications 45 | represent, as a whole, an original work of authorship. For the purposes 46 | of this License, Derivative Works shall not include works that remain 47 | separable from, or merely link (or bind by name) to the interfaces of, 48 | the Work and Derivative Works thereof. 49 | 50 | "Contribution" shall mean any work of authorship, including 51 | the original version of the Work and any modifications or additions 52 | to that Work or Derivative Works thereof, that is intentionally 53 | submitted to Licensor for inclusion in the Work by the copyright owner 54 | or by an individual or Legal Entity authorized to submit on behalf of 55 | the copyright owner. For the purposes of this definition, "submitted" 56 | means any form of electronic, verbal, or written communication sent 57 | to the Licensor or its representatives, including but not limited to 58 | communication on electronic mailing lists, source code control systems, 59 | and issue tracking systems that are managed by, or on behalf of, the 60 | Licensor for the purpose of discussing and improving the Work, but 61 | excluding communication that is conspicuously marked or otherwise 62 | designated in writing by the copyright owner as "Not a Contribution." 63 | 64 | "Contributor" shall mean Licensor and any individual or Legal Entity 65 | on behalf of whom a Contribution has been received by Licensor and 66 | subsequently incorporated within the Work. 67 | 68 | 2. Grant of Copyright License. Subject to the terms and conditions of 69 | this License, each Contributor hereby grants to You a perpetual, 70 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 71 | copyright license to reproduce, prepare Derivative Works of, 72 | publicly display, publicly perform, sublicense, and distribute the 73 | Work and such Derivative Works in Source or Object form. 74 | 75 | 3. Grant of Patent License. Subject to the terms and conditions of 76 | this License, each Contributor hereby grants to You a perpetual, 77 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 78 | (except as stated in this section) patent license to make, have made, 79 | use, offer to sell, sell, import, and otherwise transfer the Work, 80 | where such license applies only to those patent claims licensable 81 | by such Contributor that are necessarily infringed by their 82 | Contribution(s) alone or by combination of their Contribution(s) 83 | with the Work to which such Contribution(s) was submitted. If You 84 | institute patent litigation against any entity (including a 85 | cross-claim or counterclaim in a lawsuit) alleging that the Work 86 | or a Contribution incorporated within the Work constitutes direct 87 | or contributory patent infringement, then any patent licenses 88 | granted to You under this License for that Work shall terminate 89 | as of the date such litigation is filed. 90 | 91 | 4. Redistribution. You may reproduce and distribute copies of the 92 | Work or Derivative Works thereof in any medium, with or without 93 | modifications, and in Source or Object form, provided that You 94 | meet the following conditions: 95 | 96 | (a) You must give any other recipients of the Work or 97 | Derivative Works a copy of this License; and 98 | 99 | (b) You must cause any modified files to carry prominent notices 100 | stating that You changed the files; and 101 | 102 | (c) You must retain, in the Source form of any Derivative Works 103 | that You distribute, all copyright, patent, trademark, and 104 | attribution notices from the Source form of the Work, 105 | excluding those notices that do not pertain to any part of 106 | the Derivative Works; and 107 | 108 | (d) If the Work includes a "NOTICE" text file as part of its 109 | distribution, then any Derivative Works that You distribute must 110 | include a readable copy of the attribution notices contained 111 | within such NOTICE file, excluding those notices that do not 112 | pertain to any part of the Derivative Works, in at least one 113 | of the following places: within a NOTICE text file distributed 114 | as part of the Derivative Works; within the Source form or 115 | documentation, if provided along with the Derivative Works; or, 116 | within a display generated by the Derivative Works, if and 117 | wherever such third-party notices normally appear. The contents 118 | of the NOTICE file are for informational purposes only and 119 | do not modify the License. You may add Your own attribution 120 | notices within Derivative Works that You distribute, alongside 121 | or as an addendum to the NOTICE text from the Work, provided 122 | that such additional attribution notices cannot be construed 123 | as modifying the License. 124 | 125 | You may add Your own copyright statement to Your modifications and 126 | may provide additional or different license terms and conditions 127 | for use, reproduction, or distribution of Your modifications, or 128 | for any such Derivative Works as a whole, provided Your use, 129 | reproduction, and distribution of the Work otherwise complies with 130 | the conditions stated in this License. 131 | 132 | 5. Submission of Contributions. Unless You explicitly state otherwise, 133 | any Contribution intentionally submitted for inclusion in the Work 134 | by You to the Licensor shall be under the terms and conditions of 135 | this License, without any additional terms or conditions. 136 | Notwithstanding the above, nothing herein shall supersede or modify 137 | the terms of any separate license agreement you may have executed 138 | with Licensor regarding such Contributions. 139 | 140 | 6. Trademarks. This License does not grant permission to use the trade 141 | names, trademarks, service marks, or product names of the Licensor, 142 | except as required for reasonable and customary use in describing the 143 | origin of the Work and reproducing the content of the NOTICE file. 144 | 145 | 7. Disclaimer of Warranty. Unless required by applicable law or 146 | agreed to in writing, Licensor provides the Work (and each 147 | Contributor provides its Contributions) on an "AS IS" BASIS, 148 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 149 | implied, including, without limitation, any warranties or conditions 150 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 151 | PARTICULAR PURPOSE. You are solely responsible for determining the 152 | appropriateness of using or redistributing the Work and assume any 153 | risks associated with Your exercise of permissions under this License. 154 | 155 | 8. Limitation of Liability. In no event and under no legal theory, 156 | whether in tort (including negligence), contract, or otherwise, 157 | unless required by applicable law (such as deliberate and grossly 158 | negligent acts) or agreed to in writing, shall any Contributor be 159 | liable to You for damages, including any direct, indirect, special, 160 | incidental, or consequential damages of any character arising as a 161 | result of this License or out of the use or inability to use the 162 | Work (including but not limited to damages for loss of goodwill, 163 | work stoppage, computer failure or malfunction, or any and all 164 | other commercial damages or losses), even if such Contributor 165 | has been advised of the possibility of such damages. 166 | 167 | 9. Accepting Warranty or Additional Liability. While redistributing 168 | the Work or Derivative Works thereof, You may choose to offer, 169 | and charge a fee for, acceptance of support, warranty, indemnity, 170 | or other liability obligations and/or rights consistent with this 171 | License. However, in accepting such obligations, You may act only 172 | on Your own behalf and on Your sole responsibility, not on behalf 173 | of any other Contributor, and only if You agree to indemnify, 174 | defend, and hold each Contributor harmless for any liability 175 | incurred by, or claims asserted against, such Contributor by reason 176 | of your accepting any such warranty or additional liability. 177 | 178 | END OF TERMS AND CONDITIONS 179 | 180 | APPENDIX: How to apply the Apache License to your work. 181 | 182 | To apply the Apache License to your work, attach the following 183 | boilerplate notice, with the fields enclosed by brackets "[]" 184 | replaced with your own identifying information. (Don't include 185 | the brackets!) The text should be enclosed in the appropriate 186 | comment syntax for the file format. We also recommend that a 187 | file or class name and description of purpose be included on the 188 | same "printed page" as the copyright notice for easier 189 | identification within third-party archives. 190 | 191 | Copyright 2015, The TensorFlow Authors. 192 | 193 | Licensed under the Apache License, Version 2.0 (the "License"); 194 | you may not use this file except in compliance with the License. 195 | You may obtain a copy of the License at 196 | 197 | http://www.apache.org/licenses/LICENSE-2.0 198 | 199 | Unless required by applicable law or agreed to in writing, software 200 | distributed under the License is distributed on an "AS IS" BASIS, 201 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 202 | See the License for the specific language governing permissions and 203 | limitations under the License. -------------------------------------------------------------------------------- /notebooks/line_doc.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# line documentation\n", 8 | "\n", 9 | " \"\"\"return the figure of a linechart with the notes in the X axis and their value in the Y axis\n", 10 | "\n", 11 | " Keyword arguments:\n", 12 | " piece -- the absolute path to the .csv file containing the data or a DataFrame\n", 13 | " pitch_type -- the type of data that you want to be read (default 'tpc'), 'pc' could be use for twelve parts chart tpc\n", 14 | " form (tpc:[A, B#, Gbbb, ...], pc (pitch class):[0, 3, 7, ...])\n", 15 | " measures -- give a set of measures example [5, 18], will display the notes of the measures 5 to 18 included\n", 16 | " log -- if True the colors are distributed on a log scale, by default it's a lineare scale (default False)\n", 17 | " vocabulary -- the conversion dictionary from pitch class to tpc(F#, A, ...) format,\n", 18 | " pitch_class_display -- if True display the pitch class and no the tpc values and so the grid repeat itself.\n", 19 | " duration -- tell him if he has to class the notes by their total duration or their number of appearance\n", 20 | " fifths -- if True class the notes by fifths order, if not class by the chromatic order\n", 21 | " figsize -- tell the size of the figure in inches [x, y]\n", 22 | " xmin, xmax -- the notes that will be displayed are in this range according to this values\n", 23 | " {0 : F, 1 : C, 2 : G, 3 : D, 4 : A, 5 : E, 6 : B} and +- 7 for a sharp and a flat\n", 24 | " display -- if True the figure is displayed, if False it is hidden so you can have only the returned figure\n", 25 | " **kwargs -- these arguments are redirected to the matplotlib.pyplot.pie function, see informations at\n", 26 | " https://matplotlib.org/api/_as_gen/matplotlib.pyplot.bar.html" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "execution_count": 1, 32 | "metadata": {}, 33 | "outputs": [], 34 | "source": [ 35 | "import pitchplots.static as pps" 36 | ] 37 | }, 38 | { 39 | "cell_type": "code", 40 | "execution_count": 2, 41 | "metadata": {}, 42 | "outputs": [], 43 | "source": [ 44 | "#piece = '../data/data_example.csv'\n", 45 | "import pitchplots.parser as ppp\n", 46 | "piece = ppp.xml_to_csv()" 47 | ] 48 | }, 49 | { 50 | "cell_type": "code", 51 | "execution_count": 3, 52 | "metadata": {}, 53 | "outputs": [ 54 | { 55 | "data": { 56 | "image/png": "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\n", 57 | "text/plain": [ 58 | "
" 59 | ] 60 | }, 61 | "metadata": { 62 | "needs_background": "light" 63 | }, 64 | "output_type": "display_data" 65 | } 66 | ], 67 | "source": [ 68 | "# fig is a matplotlib.figure.Figure, you can see the corresponding documentation below\n", 69 | "# https://matplotlib.org/api/_as_gen/matplotlib.figure.Figure.html\n", 70 | "fig = pps.line(piece)" 71 | ] 72 | }, 73 | { 74 | "cell_type": "markdown", 75 | "metadata": {}, 76 | "source": [ 77 | "## default parameters" 78 | ] 79 | }, 80 | { 81 | "cell_type": "code", 82 | "execution_count": 4, 83 | "metadata": {}, 84 | "outputs": [], 85 | "source": [ 86 | "def line(\n", 87 | " piece,\n", 88 | " pitch_type='tpc',\n", 89 | " measures=None,\n", 90 | " log=False,\n", 91 | " vocabulary={0:'C', 1:'Db', 2:'D', 3:'Eb', 4:'E', 5:'F', 6:'Gb', 7:'G', 8:'Ab', 9:'A', 10:'Bb', 11:'B'},\n", 92 | " pitch_class_display=False,\n", 93 | " duration=False, #TODO\n", 94 | " fifths=True, #TODO\n", 95 | " color='blue',\n", 96 | " figsize=[14, 9],\n", 97 | " xmin=None,\n", 98 | " xmax=None,\n", 99 | " display=True,\n", 100 | " **kwargs):\n", 101 | " pass" 102 | ] 103 | }, 104 | { 105 | "cell_type": "markdown", 106 | "metadata": {}, 107 | "source": [ 108 | "## Examples" 109 | ] 110 | }, 111 | { 112 | "cell_type": "code", 113 | "execution_count": 7, 114 | "metadata": {}, 115 | "outputs": [ 116 | { 117 | "data": { 118 | "image/png": "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\n", 119 | "text/plain": [ 120 | "
" 121 | ] 122 | }, 123 | "execution_count": 7, 124 | "metadata": {}, 125 | "output_type": "execute_result" 126 | } 127 | ], 128 | "source": [ 129 | "# It is better if pitch_type and pitch_class_display are the same,\n", 130 | "# meaning pitch_type='tpc' with pitch_class_display=False and like the example below\n", 131 | "pps.line(piece, pitch_type='pc', pitch_class_display=True, display=False)" 132 | ] 133 | }, 134 | { 135 | "cell_type": "code", 136 | "execution_count": 11, 137 | "metadata": {}, 138 | "outputs": [ 139 | { 140 | "data": { 141 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzgAAAIMCAYAAAA5EAmNAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvDW2N/gAAGIdJREFUeJzt3W2MrHd53/HfVR8cQ1LKg9euaxuOo7g8lKiYnlgkVEnAUQIkip0WN3ZQYkVOLUWQhlIF3L7Z7os2RK0CfYiCLEhrKmJAJqlRiqiQAaVI1OGYOAXjJnYMGBfXPmkgVJSI2Pr3xcwhy3qfvLN77pnLn490tDv33rNz7c6c/znfve+ZrTFGAAAAOvgrUw8AAABwWAQOAADQhsABAADaEDgAAEAbAgcAAGhD4AAAAG0IHAAAoA2BAwAAtCFwAACANgQOAADQxrGpB0iSc889dxw/fnzqMQAAgCV15513/skYY22v/ZYicI4fP56TJ09OPQYAALCkquoL+9nPKWoAAEAbAgcAAGhD4AAAAG0IHAAAoA2BAwAAtCFwAACANgQOAADQhsABAADaEDgAAEAbAgcAAGhD4AAAAG0IHAAAoA2BAwAAtCFwAACANgQOAADQhsABAADaEDgAAEAbAgcAAGhD4AAAAG0IHAAAoA2BAwAAtHFs6gEAmNnY2Jh6hB2tr69PPQIA7IsjOAAAQBsCBwAAaEPgAAAAbQgcAACgDYEDAAC0IXAAAIA2BA4AANCGwAEAANoQOAAAQBsCBwAAaEPgAAAAbQgcAACgDYEDAAC0IXAAAIA2BA4AANCGwAEAANoQOAAAQBsCBwAAaEPgAAAAbQgcAACgDYEDAAC0IXAAAIA2BA4AANCGwAEAANoQOAAAQBsCBwAAaEPgAAAAbQgcAACgDYEDAAC0IXAAAIA2BA4AANCGwAEAANoQOAAAQBsCBwAAaEPgAAAAbQgcAACgDYEDAAC0IXAAAIA2BA4AANCGwAEAANoQOAAAQBsCBwAAaEPgAAAAbQgcAACgDYEDAAC0sWfgVNVvVNUjVfWZTdueVVUfrqp752+fOd9eVfVvq+q+qvofVfWSoxweAABgs/0cwfmPSV65ZduNSW4fY1ya5Pb55SR5VZJL539uSPLrhzMmAADA3vYMnDHG7yb50y2br0xy8/z9m5NctWn7u8bMf0/yjKq64LCGBQAA2M1Bn4Nz/hjjoSSZvz1vvv3CJF/ctN+D820AAABH7rBfZKC22Ta23bHqhqo6WVUnT506dchjAAAAT0YHDZyHT596Nn/7yHz7g0ku3rTfRUm+tN0nGGPcNMY4McY4sba2dsAxAAAA/tJBA+cDSa6bv39dkts2bf+Z+aupvTTJn50+lQ0AAOCoHdtrh6q6JckPJjm3qh5Msp7kLUneV1XXJ3kgydXz3T+Y5NVJ7kvy/5L87BHMDAAAsK09A2eMce0OH7pim31HktctOhQAAMBBHPaLDAAAAExG4AAAAG0IHAAAoA2BAwAAtCFwAACANgQOAADQhsABAADaEDgAAEAbAgcAAGhD4AAAAG0IHAAAoA2BAwAAtCFwAACANgQOAADQhsABAADaEDgAAEAbAgcAAGhD4AAAAG0IHAAAoA2BAwAAtCFwAACANgQOAADQhsABAADaEDgAAEAbAgcAAGhD4AAAAG0IHAAAoA2BAwAAtCFwAACANgQOAADQhsABAADaEDgAAEAbAgcAAGhD4AAAAG0IHAAAoA2BAwAAtCFwAACANgQOAADQhsABAADaEDgAAEAbAgcAAGhD4AAAAG0IHAAAoA2BAwAAtCFwAACANgQOAADQhsABAADaEDgAAEAbAgcAAGhD4AAAAG0IHAAAoA2BAwAAtCFwAACANgQOAADQhsABAADaEDgAAEAbAgcAAGhD4AAAAG0IHAAAoA2BAwAAtCFwAACANgQOAADQhsABAADaEDgAAEAbAgcAAGhD4AAAAG0IHAAAoA2BAwAAtCFwAACANgQOAADQhsABAADaEDgAAEAbAgcAAGhD4AAAAG0sFDhV9Y+r6u6q+kxV3VJV51TVJVV1R1XdW1XvraqzD2tYAACA3Rw4cKrqwiT/KMmJMcaLkpyV5Jokv5LkrWOMS5N8Ocn1hzEoAADAXhY9Re1YkqdW1bEkT0vyUJJXJLl1/vGbk1y14G0AAADsy4EDZ4zxv5L86yQPZBY2f5bkziRfGWM8Ot/twSQXLjokAADAfixyitozk1yZ5JIkfyPJtyd51Ta7jh2uf0NVnayqk6dOnTroGAAAAN+0yClqP5Tkc2OMU2OMv0jyW0m+L8kz5qesJclFSb603ZXHGDeNMU6MMU6sra0tMAYAAMDMIoHzQJKXVtXTqqqSXJHks0k+muQ1832uS3LbYiMCAADszyLPwbkjsxcT+FSST88/101J3pzkjVV1X5JnJ3nnIcwJAACwp2N777KzMcZ6kvUtm+9PcvkinxcAAOAgFn2ZaAAAgKUhcAAAgDYEDgAA0IbAAQAA2hA4AABAGwIHAABoQ+AAAABtCBwAAKANgQMAALQhcAAAgDYEDgAA0IbAAQAA2hA4AABAGwIHAABoQ+AAAABtCBwAAKANgQMAALQhcAAAgDYEDgAA0IbAAQAA2hA4AABAGwIHAABoQ+AAAABtCBwAAKANgQMAALQhcAAAgDYEDgAA0IbAAQAA2hA4AABAGwIHAABoQ+AAAABtCBwAAKANgQMAALQhcAAAgDYEDgAA0IbAAQAA2hA4AABAGwIHAABoQ+AAAABtCBwAAKANgQMAALRxbOoBAOhhY2Nj6hF2tL6+PvUIAJwhjuAAAABtCBwAAKANgQMAALQhcAAAgDYEDgAA0IbAAQAA2hA4AABAG34PDgAwOb9HCTgsjuAAAABtCBwAAKANgQMAALQhcAAAgDYEDgAA0IbAAQAA2hA4AABAGwIHAABoQ+AAAABtCBwAAKANgQMAALQhcAAAgDYEDgAA0IbAAQAA2hA4AABAGwIHAABoQ+AAAABtCBwAAKANgQMAALQhcAAAgDYEDgAA0IbAAQAA2hA4AABAGwIHAABoY6HAqapnVNWtVfU/q+qeqvreqnpWVX24qu6dv33mYQ0LAACwm0WP4PybJB8aYzw/yd9Ock+SG5PcPsa4NMnt88sAAABH7sCBU1VPT/L9Sd6ZJGOMb4wxvpLkyiQ3z3e7OclViw4JAACwH4scwfnOJKeS/Ieq+v2qekdVfXuS88cYDyXJ/O15hzAnAADAnhYJnGNJXpLk18cYlyX5Wp7A6WhVdUNVnayqk6dOnVpgDAAAgJlFAufBJA+OMe6YX741s+B5uKouSJL520e2u/IY46Yxxokxxom1tbUFxgAAAJg5cOCMMf53ki9W1fPmm65I8tkkH0hy3XzbdUluW2hCAACAfTq24PV/Icm7q+rsJPcn+dnMoul9VXV9kgeSXL3gbQAAAOzLQoEzxrgryYltPnTFIp8XAADgIBb9PTgAAABLQ+AAAABtCBwAAKANgQMAALQhcAAAgDYEDgAA0IbAAQAA2hA4AABAGwIHAABoQ+AAAABtCBwAAKANgQMAALQhcAAAgDYEDgAA0IbAAQAA2hA4AABAGwIHAABoQ+AAAABtCBwAAKANgQMAALQhcAAAgDYEDgAA0IbAAQAA2hA4AABAG8emHgAAWNzGxsbUI+xofX196hGAJxFHcAAAgDYEDgAA0IbAAQAA2vAcHACI57AAdOEIDgAA0IbAAQAA2hA4AABAGwIHAABoQ+AAAABtCBwAAKANgQMAALQhcAAAgDYEDgAA0IbAAQAA2hA4AABAGwIHAABoQ+AAAABtCBwAAKANgQMAALQhcAAAgDYEDgAA0IbAAQAA2hA4AABAGwIHAABoQ+AAAABtCBwAAKANgQMAALQhcAAAgDYEDgAA0IbAAQAA2hA4AABAGwIHAABoQ+AAAABtCBwAAKANgQMAALQhcAAAgDYEDgAA0IbAAQAA2hA4AABAGwIHAABoQ+AAAABtCBwAAKANgQMAALQhcAAAgDYEDgAA0IbAAQAA2hA4AABAGwIHAABoQ+AAAABtCBwAAKCNhQOnqs6qqt+vqt+ZX76kqu6oqnur6r1VdfbiYwIAAOztMI7g/GKSezZd/pUkbx1jXJrky0muP4TbAAAA2NNCgVNVFyX50STvmF+uJK9Icut8l5uTXLXIbQAAAOzXsQWv/7Ykb0ryV+eXn53kK2OMR+eXH0xy4XZXrKobktyQJM95znMWHANgZmNjY+oRtrW+vj71CADwpHDgIzhV9WNJHhlj3Ll58za7ju2uP8a4aYxxYoxxYm1t7aBjAAAAfNMiR3BeluTHq+rVSc5J8vTMjug8o6qOzY/iXJTkS4uPCQAAsLcDH8EZY/zTMcZFY4zjSa5J8pExxmuTfDTJa+a7XZfktoWnBAAA2Iej+D04b07yxqq6L7Pn5LzzCG4DAADgcRZ9kYEkyRjjY0k+Nn///iSXH8bnBQAAeCKO4ggOAADAJAQOAADQhsABAADaEDgAAEAbAgcAAGhD4AAAAG0IHAAAoA2BAwAAtCFwAACANgQOAADQhsABAADaEDgAAEAbAgcAAGhD4AAAAG0IHAAAoA2BAwAAtCFwAACANgQOAADQhsABAADaEDgAAEAbAgcAAGhD4AAAAG0IHAAAoA2BAwAAtHFs6gEAAFbdxsbG1CPsaH19feoR4IxyBAcAAGhD4AAAAG0IHAAAoA2BAwAAtCFwAACANgQOAADQhsABAADaEDgAAEAbAgcAAGhD4AAAAG0IHAAAoI1jUw8ALJeNjY2pR9jW+vr61CMAACvAERwAAKANgQMAALQhcAAAgDYEDgAA0IbAAQAA2hA4AABAGwIHAABoQ+AAAABtCBwAAKANgQMAALQhcAAAgDYEDgAA0IbAAQAA2hA4AABAGwIHAABoQ+AAAABtCBwAAKANgQMAALQhcAAAgDYEDgAA0IbAAQAA2hA4AABAGwIHAABoQ+AAAABtCBwAAKANgQMAALQhcAAAgDYEDgAA0IbAAQAA2hA4AABAGwIHAABoQ+AAAABtCBwAAKANgQMAALQhcAAAgDYEDgAA0IbAAQAA2jhw4FTVxVX10aq6p6rurqpfnG9/VlV9uKrunb995uGNCwAAsLNFjuA8muSfjDFekOSlSV5XVS9McmOS28cYlya5fX4ZAADgyB04cMYYD40xPjV///8muSfJhUmuTHLzfLebk1y16JAAAAD7cSjPwamq40kuS3JHkvPHGA8lswhKct5h3AYAAMBeFg6cqvqOJO9P8oYxxlefwPVuqKqTVXXy1KlTi44BAACwWOBU1VMyi5t3jzF+a7754aq6YP7xC5I8st11xxg3jTFOjDFOrK2tLTIGAABAksVeRa2SvDPJPWOMX930oQ8kuW7+/nVJbjv4eAAAAPt3bIHrvizJTyf5dFXdNd/2z5K8Jcn7qur6JA8kuXqxEQEAAPbnwIEzxvh4ktrhw1cc9PMCAAAc1KG8ihoAAMAyEDgAAEAbAgcAAGhD4AAAAG0IHAAAoA2BAwAAtCFwAACANgQOAADQhsABAADaEDgAAEAbAgcAAGhD4AAAAG0IHAAAoA2BAwAAtCFwAACANgQOAADQhsABAADaEDgAAEAbAgcAAGhD4AAAAG0IHAAAoA2BAwAAtCFwAACANgQOAADQxrGpB4BuNjY2ph5hW+vr61OPAABw5BzBAQAA2hA4AABAGwIHAABoQ+AAAABtCBwAAKANgQMAALQhcAAAgDYEDgAA0IbAAQAA2hA4AABAGwIHAABoQ+AAAABtCBwAAKANgQMAALQhcAAAgDYEDgAA0IbAAQAA2hA4AABAGwIHAABoQ+AAAABtCBwAAKANgQMAALQhcAAAgDYEDgAA0IbAAQAA2hA4AABAGwIHAABoQ+AAAABtCBwAAKANgQMAALQhcAAAgDYEDgAA0IbAAQAA2hA4AABAGwIHAABoQ+AAAABtCBwAAKANgQMAALQhcAAAgDYEDgAA0IbAAQAA2hA4AABAGwIHAABoQ+AAAABtCBwAAKANgQMAALQhcAAAgDYEDgAA0IbAAQAA2jiSwKmqV1bVH1bVfVV141HcBgAAwFaHHjhVdVaSX0vyqiQvTHJtVb3wsG8HAABgq6M4gnN5kvvGGPePMb6R5D1JrjyC2wEAAPgWRxE4Fyb54qbLD863AQAAHKkaYxzuJ6y6OsmPjDF+bn75p5NcPsb4hS373ZDkhvnF5yX5w0MdZHmcm+RPph5iAeaflvmnZf5pmX9a5p+W+adl/uX03DHG2l47HTuCG34wycWbLl+U5Etbdxpj3JTkpiO4/aVSVSfHGCemnuOgzD8t80/L/NMy/7TMPy3zT8v8q+0oTlH7ZJJLq+qSqjo7yTVJPnAEtwMAAPAtDv0Izhjj0ap6fZL/muSsJL8xxrj7sG8HAABgq6M4RS1jjA8m+eBRfO4VtOqn4Zl/WuaflvmnZf5pmX9a5p+W+VfYob/IAAAAwFSO4jk4AAAAkxA4h6iqfqKqRlU9f375B6vqd6aea7+q6rGqumvTnxvn2z9fVedOPd9uNs3+B1X1qar6vvn2lboPTtvmvjg+9UxPRFX99ap6T1X9cVV9tqo+WFV/c+q59qOqzq+q36yq+6vqzqr6RFX9xNRz7demx87d878Pb6yqlVrrt66lq2antXQV7LSWLrO91suq+lhVnVNVb6uql04z5fb2Wiur6paqOl5Vb6iqa6acdTv7WS+X/Pu/r/Vyyb+GHdfLZX/8HKUjeQ7Ok9i1ST6e2SvH/fNpRzmQr48xXjz1EAf0zdmr6keS/HKSH5h2pIWs7H1RVZXkt5PcPMa4Zr7txUnOT/JHU862l/ns/zmz2X9qvu25SX580sGemM1/F85L8ptJ/lqS9UmnemKspdNZxbV0x+93VT01yWNjjD+vqu9J8ktndrSd7XOtvGSM8fmq+oEkr59m0u3tZ71c5u//3J7r5Qp8Dbutl0v7+DlqK/VTvWVWVd+R5GVJrs/sQXba06vqt+c/mXn7qv0kdZNfqqrfm//5rqmH2cPTk3x58+Um98GqeHmSvxhjvP30hjHGXWOM/zbhTPv1iiTf2DL7F8YY/27CmQ5sjPFIZr9Q+fXz/4wsvV3WUs68rWvpSqmqjyb5dJIXVdWnk3x3kk9W1aunneybdlwrq+rdVfXZJM+rqruS/HCS/1JVPzfVsNvYdb1cge//t9huvVz2r2Gn9XJFHj9HyhGcw3NVkg+NMf6oqv60ql4y3355khcm+UKSDyX5e0lunWjGvTx1/hfhtF8eY7x3/v5XxxiXV9XPJHlbkh878+Pt6vTs5yS5ILOF97RVug9O23xffG6MsTKnSCV5UZI7px7igP5Wkk9NPcRhGmPcP4/685I8PPU8+/C4tXSMsWr3yW5r6bLbbS1dVtuul2OMl1fVm5L8cZL/k+RHxxjL9NP3HdfKMcZrq+ofZPaL09+f5F+NMa4+k8Ptw67r5Qp8/x9n63q5Al/Dtuvlijx+jpSfZB+ea5O8Z/7+e+aXk+T3xhj3jzEeS3JLkr87xXD79PUxxos3/dn8D/Itm95+7wSz7eX07M9P8sok79r0E+tVug9O23xfrFLctFJVvzY/L/uTU8+yoJU4ejO301q6SnZbS5fdbmvpstptvbwsyV2Z/eT9rsdfdamt1Ow7rJcr9TXMbX28L/PXsNt6ucxzHzlHcA5BVT07s59yvaiqRma/4HRk9ruAtr4O96q+LvfY4f2lM8b4RM1eFGHt9Katu5zhkZ5s7k7ymqmHOKC7k/z90xfGGK+bP5ZOTjfSYqrqO5M8luSRqWfZy05raVW9afidBmfclrV06R8/m81PxXl9ku9K8oIkz0nycFW9eozx2kmH+0vbrpXz05/+ZZJLMjtbYi3J16rqh8YYLz+zI+5qx/VyRb7/j7N5vVz2r2GX9fJjSf5Flv/xc6QcwTkcr0nyrjHGc8cYx8cYFyf5XGZHCi6vqkvmhzx/MrMngq2in9z09hNTDrKX+SuJnJXZ4eSkz32wKj6S5Nuq6h+e3lBV3zN/kuOy+0iSc6rq5zdte9pUwyyqqtaSvD3Jv1+RQNhtLeUM22YtXRljjHdk9ryDj8yfRH7fGOMFy/Af0022XSuTfC3J30nymTHGd2cWEpct4X9Od1wvV+T7/y22rpcr8DXstF5+Navx+DlSjuAcjmuTvGXLtvcn+fnMYuAtmR0i/N3MXjFlWW09b/xDY4zTL2/6bVV1R2ZRvIynjGyevZJcN8Z4bH5mxSrdBytvjDFq9jKhb6vZy+P+eZLPJ3nDpIPtw3z2q5K8dX7e9anM/rPx5mkne0JO/114SpJHk/ynJL867Uj7ttNa+lNJVuFFKk7bbS1ddtuupVMOtIDvT/Lxqro4s+dgLpU91srLkvxBVZ2d5CljjK9ON+n29rFeLvX3f26v9XKZv4bd1suvZ8kfP0etVuOHegAAAHtzihoAANCGwAEAANoQOAAAQBsCBwAAaEPgAAAAbQgcAACgDYEDAAC0IXAAAIA2/j+gVD8mHYC5yAAAAABJRU5ErkJggg==\n", 142 | "text/plain": [ 143 | "
" 144 | ] 145 | }, 146 | "execution_count": 11, 147 | "metadata": {}, 148 | "output_type": "execute_result" 149 | } 150 | ], 151 | "source": [ 152 | "# xmin and xmax indicate the limit notes on the X axis in the line of fifths\n", 153 | "pps.line(piece, color='grey', display=False, xmin=-3, xmax=11)" 154 | ] 155 | }, 156 | { 157 | "cell_type": "code", 158 | "execution_count": null, 159 | "metadata": {}, 160 | "outputs": [], 161 | "source": [] 162 | } 163 | ], 164 | "metadata": { 165 | "kernelspec": { 166 | "display_name": "Python 3", 167 | "language": "python", 168 | "name": "python3" 169 | }, 170 | "language_info": { 171 | "codemirror_mode": { 172 | "name": "ipython", 173 | "version": 3 174 | }, 175 | "file_extension": ".py", 176 | "mimetype": "text/x-python", 177 | "name": "python", 178 | "nbconvert_exporter": "python", 179 | "pygments_lexer": "ipython3", 180 | "version": "3.7.1" 181 | } 182 | }, 183 | "nbformat": 4, 184 | "nbformat_minor": 2 185 | } 186 | -------------------------------------------------------------------------------- /static.py: -------------------------------------------------------------------------------- 1 | """ 2 | Functions for none moving charts 3 | """ 4 | import math 5 | 6 | import pandas as pd 7 | import numpy as np 8 | import matplotlib.pyplot as plt 9 | import matplotlib.patches as patches 10 | import matplotlib 11 | 12 | from pitchplots.reader import get_df_short 13 | from pitchplots.functions import get_acc, get_step, get_pc, get_dic_nei, put_flat_sharp, get_fifth_nb, get_fifth_note, is_tpc, is_pc 14 | 15 | class StaticError(Exception): 16 | """Exception thrown when the static module cannot plot.""" 17 | pass 18 | 19 | class InvalidDataTypeTypeError(StaticError): 20 | """Exception thrown when pitch_type is not pc or tpc""" 21 | pass 22 | 23 | class InvalidSetMeasureTypeError(StaticError): 24 | """Exception thrown when set_measure is not a list of 2 numbers with the first and last measures to take in count""" 25 | pass 26 | 27 | class InvalidConvertTableTypeError(StaticError): 28 | """Exception thrown when vocabulary does not have 12 elements or its elements are not tpc notes""" 29 | pass 30 | 31 | def line( 32 | piece, 33 | pitch_type='tpc', 34 | measures=None, 35 | log=False, 36 | normalize=False, 37 | vocabulary={0:'C', 1:'Db', 2:'D', 3:'Eb', 4:'E', 5:'F', 6:'Gb', 7:'G', 8:'Ab', 9:'A', 10:'Bb', 11:'B'}, 38 | pitch_class_display=False, 39 | duration=False, 40 | color='blue', 41 | figsize=[6, 4], 42 | xmin=None, 43 | xmax=None, 44 | start=0, 45 | show=False, 46 | **kwargs): 47 | """return the figure of a linechart with the notes in the X axis and their value in the Y axis 48 | 49 | Keyword arguments: 50 | piece -- the absolute path to the .csv file containing the data or a DataFrame 51 | pitch_type -- the type of data that you want to be read (default 'tpc'), 'pc' could be use for twelve parts chart tpc form 52 | (tpc:[A, B#, Gbbb, ...], pc (pitch class):[0, 3, 7, ...]) 53 | measures -- give a set of measures example [5, 18], will display the notes of the measures 5 to 18 included 54 | log -- if True the colors are distributed on a log scale, by default it's a lineare scale (default False) 55 | vocabulary -- the conversion dictionary from pitch class to tpc(F#, A, ...) format, 56 | pitch_class_display -- if True display the pitch class and no the tpc values and so the grid repeat itself. 57 | duration -- tell him if he has to class the notes by their total duration or their number of appearance 58 | figsize -- tell the size of the figure in inches [x, y] 59 | xmin, xmax -- the notes that will be displayed are in this range according to this values 60 | {0 : F, 1 : C, 2 : G, 3 : D, 4 : A, 5 : E, 6 : B} and +- 7 for a sharp and a flat 61 | display -- if True the figure is displayed, if False it is hidden so you can have only the returned figure 62 | **kwargs -- these arguments are redirected to the matplotlib.pyplot.pie function, see informations at 63 | https://matplotlib.org/api/_as_gen/matplotlib.pyplot.bar.html 64 | """ 65 | #get the df 66 | if pitch_class_display: 67 | df = get_df_short(piece, vocabulary=vocabulary, pitch_type='pc', measures=measures) 68 | else: 69 | df = get_df_short(piece, vocabulary=vocabulary, pitch_type=pitch_type, measures=measures) 70 | #create the figure and close it so it wont be display 71 | fig = plt.figure(figsize=figsize) 72 | if not show: 73 | plt.close(fig) 74 | ax = fig.add_subplot(111) 75 | 76 | if not pitch_class_display: 77 | df['fifth_number'] = df['tpc'].apply(get_fifth_nb) 78 | xmin = df['fifth_number'].min() if xmin == None else xmin+1 79 | xmax = df['fifth_number'].max() if xmax == None else xmax+1 80 | labels = [get_fifth_note(i) for i in range(xmin, xmax+1)] 81 | # Give the value to the notes, for their number of appearance 82 | if normalize: 83 | s = pd.Series(df['duration']/df['duration'].sum()) if duration else pd.Series(df['nb']/df['nb'].sum()) 84 | else: 85 | s = pd.Series(df['duration']) if duration else pd.Series(df['nb']) 86 | s.index = df['pc'] if pitch_class_display else df['tpc'] 87 | if pitch_class_display: 88 | #reindex with integers to be compatible with the 'pc' value 89 | pc_labels = np.roll([0, 7, 2, 9, 4, 11, 6, 1, 8, 3, 10, 5], 90 | -([0, 7, 2, 9, 4, 11, 6, 1, 8, 3, 10, 5].index(start))) 91 | s = s.reindex(pc_labels).fillna(0) 92 | #get the index in strings so it wont be reorder by the bar function 93 | s.index = np.roll(['0', '7', '2', '9', '4', '11', '6', '1', '8', '3', '10', '5'], 94 | -([0, 7, 2, 9, 4, 11, 6, 1, 8, 3, 10, 5].index(start))) 95 | else: 96 | s = s.reindex(labels).fillna(0) 97 | # Do the bar plot 98 | ax.bar(x=s.index, color=color, height = s.values, log=log, **kwargs) 99 | 100 | return fig 101 | 102 | def circle( 103 | piece, 104 | pitch_type='tpc', 105 | measures=None, # need documentation 106 | log=False, 107 | vocabulary={0:'C', 1:'Db', 2:'D', 3:'Eb', 4:'E', 5:'F', 6:'Gb', 7:'G', 8:'Ab', 9:'A', 10:'Bb', 11:'B'}, 108 | pitch_class_display=False, 109 | colorbar=True, 110 | duration=False, 111 | fifths=True, 112 | figsize=[7, 4], 113 | top=None, 114 | rotation=0, 115 | clockwise=True, 116 | cmap='Blues', 117 | nan_color=None, 118 | show=False, 119 | **kwargs): 120 | """return the figure of a piechart with importance of the notes that are represented by the colour as a heatmap 121 | 122 | Keyword arguments: 123 | piece -- the absolute path to the .csv file containing the data or a DataFrame 124 | pitch_type -- the type of data that you want to be read (default 'tpc'), 'pc' could be use for twelve parts chart tpc form 125 | (tpc:[A, B#, Gbbb, ...], pc (pitch class):[0, 3, 7, ...]) 126 | measures -- give a set of measures example [5, 18], will display the notes of the measures 5 to 18 included 127 | log -- if True the colors are distributed on a log scale, by default it's a lineare scale (default False) 128 | vocabulary -- the conversion dictionary from pitch class to tpc(F#, A, ...) format, 129 | pitch_class_display -- if True display the pitch class and no the tpc values and so the grid repeat itself. 130 | colorbar -- if true display the colorbar aside of the pie chart 131 | duration -- tell him if he has to class the notes by their total duration or their number of appearance 132 | fifths -- if True class the notes by fifths order, if not class by the chromatic order 133 | figsize -- tell the size of the figure in inches [x, y] 134 | top -- tell which note should be on the top of the piechart, different for tpc or pc 135 | rotation -- allows to rotate the piechart, int angle in degrees 136 | clockwise -- if True the piechart is displayed clockwise if not counter-clockwise 137 | cmap -- indicate the type of color to use for the heatmap, see matplotlib color documentation (default 'Blues') 138 | nan_color -- give the possibility to set a color for the note that do not appear in the piece (default 'nan') 139 | display -- if True the figure is displayed, if False it is hidden so you can have only the returned figure 140 | **kwargs -- these arguments are redirected to the matplotlib.pyplot.pie function, see informations at 141 | https://matplotlib.org/api/_as_gen/matplotlib.pyplot.pie.html 142 | """ 143 | #settings 144 | df = get_df_short(piece, vocabulary=vocabulary, pitch_type=pitch_type, measures=measures, duration=duration) 145 | 146 | #color map 147 | cmap = matplotlib.cm.get_cmap(cmap) 148 | color_note = [] 149 | 150 | #dataFrame for the plot if tpc 151 | df_tpc_pie = pd.DataFrame(columns=['note', 'part', 'pc']) 152 | 153 | #put top in the right form 154 | if pd.isnull(top) == False: 155 | if is_tpc(top) and pitch_class_display: 156 | top = get_pc(top) 157 | if is_pc(top) and not pitch_class_display: 158 | top = vocabulary[int(top)] 159 | 160 | #remember position of data in Series 161 | s_pos = pd.Series() 162 | count = 0 163 | part = 0 164 | letter = 'nan' 165 | s_fifth = pd.Series() 166 | 167 | fig = plt.figure(figsize=figsize) 168 | if not show: 169 | plt.close(fig) 170 | ax = fig.add_subplot(111, aspect='equal') 171 | 172 | #Set the order in function of fifth 173 | if fifths: 174 | s_tpc_format = pd.Series((0, 7, 2, 9, 4, 11, 6, 1, 8, 3, 10, 5)) 175 | else: 176 | s_tpc_format = pd.Series((0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)) 177 | 178 | #for plot if pitch_class_display 179 | s_twelve_ones = pd.Series((1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), index=s_tpc_format) 180 | 181 | #if it show the tpc values 182 | if pitch_class_display == False: 183 | #put the right values in 'number' 184 | if duration: 185 | df_data = df.copy() 186 | df_data.rename(columns={'duration': 'number'},inplace=True) 187 | else: 188 | df_data = df.copy() 189 | df_data.rename(columns={'nb': 'number'},inplace=True) 190 | 191 | #Normalize the values for the colors 192 | max_value = df_data['number'].max() 193 | min_value = df_data['number'].min() 194 | if log: 195 | norm = matplotlib.colors.LogNorm(vmin=min_value, vmax=max_value) 196 | else: 197 | norm = matplotlib.colors.Normalize(0, vmax=max_value) 198 | 199 | #for chromatic order 200 | if fifths == False: 201 | 202 | #for each pitch class values 203 | for i in range(12): 204 | 205 | #if a pitch class is represented in the data 206 | if df_data['pc'].isin([s_tpc_format[i]]).any(): 207 | count = 0 208 | s_pos.drop(s_pos.index, inplace=True) 209 | 210 | #count how much time there is tpc values for a same pitch class 211 | for j in range(df_data['pc'].isin([s_tpc_format[i]]).shape[0]): 212 | if df_data['pc'].isin([s_tpc_format[i]])[j]: 213 | s_pos.at[count] = j 214 | count = count + 1 215 | 216 | #devide the pie part and set color 217 | for j in range(count): 218 | part = 1/count 219 | letter = df_data.at[s_pos.at[j], 'step'] 220 | 221 | #write the notes 222 | letter = put_flat_sharp(letter, df_data.at[s_pos.at[j], 'acc']) 223 | 224 | #register the informations 225 | df_tpc_pie = df_tpc_pie.append({'note':letter, 'part':part}, 226 | ignore_index=True) 227 | color_note.append(cmap(norm(df_data.at[s_pos.at[j], 'number']))) 228 | 229 | #if the pitch class do no appear in the piece 230 | else: 231 | letter = vocabulary[s_tpc_format[i]] 232 | 233 | df_tpc_pie = df_tpc_pie.append({'note':letter, 'part':1}, ignore_index=True) 234 | if pd.isnull(nan_color): 235 | color_note.append(cmap(0)) 236 | else: 237 | color_note.append(nan_color) 238 | else: 239 | #get the fifth numbers of the notes 240 | for i in range(df_data.shape[0]): 241 | s_fifth.at[i] = get_fifth_nb(df_data.at[i, 'tpc']) 242 | df_data['fifth'] = s_fifth 243 | 244 | #create df_tpc_pie and get the colours 245 | for i in range(df_data['fifth'].max()-df_data['fifth'].min()+1): 246 | #the part are equal for the moment 247 | df_tpc_pie.at[i, 'part'] = 1 248 | df_tpc_pie.at[i, 'note'] = get_fifth_note(i + df_data['fifth'].min()) 249 | df_tpc_pie.at[i, 'pc'] = get_pc(df_tpc_pie.at[i, 'note']) 250 | 251 | if df_data['fifth'].isin([i + df_data['fifth'].min()]).any(): 252 | #get the colour for the note who has the good fifth number 253 | color_note.append(cmap(norm(df_data['number'][df_data['fifth']==(i + df_data['fifth'].min())].iat[0]))) 254 | elif df_data['fifth'].isin([i + df_data['fifth'].min()]).any() == False and pd.isnull(nan_color) == False: 255 | color_note.append(nan_color) 256 | else: 257 | color_note.append(cmap(0)) 258 | 259 | #if clockwise invert the order of the data to be displayed clockwise, inverse also the index 260 | if clockwise: 261 | df_tpc_pie = df_tpc_pie.iloc[::-1] 262 | color_note = list(reversed(color_note)) 263 | 264 | #calculate the angle for the topPitchClass to be at the top 265 | if pd.isnull(top) == False and fifths == False and df_tpc_pie['note'].isin([top]).any() == True: 266 | if clockwise: 267 | rotation = rotation + 90 + df_tpc_pie.at[0, 'part'] * 15 268 | else: 269 | rotation = rotation + 90 - df_tpc_pie.at[0, 'part'] * 15 270 | for i in range(df_tpc_pie.shape[0]): 271 | if top == df_tpc_pie.at[i, 'note']: 272 | if df_tpc_pie.at[i, 'part'] != 1: 273 | if clockwise: 274 | rotation = rotation - 15*df_tpc_pie.at[i, 'part'] 275 | else: 276 | rotation = rotation + 15*df_tpc_pie.at[i, 'part'] 277 | break 278 | else: 279 | if clockwise: 280 | rotation = rotation + 30*df_tpc_pie.at[i, 'part'] 281 | else: 282 | rotation = rotation - 30*df_tpc_pie.at[i, 'part'] 283 | 284 | #put the top note at the top 285 | if pd.isnull(top) == False and fifths == True and df_tpc_pie['note'].isin([top]).any() == True: 286 | if clockwise: 287 | rotation = rotation + 90 + 180/df_tpc_pie.shape[0] 288 | else: 289 | rotation = rotation + 90 - 180/df_tpc_pie.shape[0] 290 | for i in range (df_tpc_pie.shape[0]): 291 | if df_tpc_pie.at[i, 'note'] == top: 292 | break 293 | else: 294 | #the sens of reading depend on the orientation 295 | if clockwise: 296 | rotation = rotation + 360/df_tpc_pie.shape[0] 297 | else: 298 | rotation = rotation - 360/df_tpc_pie.shape[0] 299 | 300 | 301 | #put nice sharps and flats 302 | for i in range(df_tpc_pie.shape[0]): 303 | df_tpc_pie.at[i, 'note'] = df_tpc_pie.at[i, 'note'].replace('b', r'$\flat$')\ 304 | .replace('#', r'$\sharp$') 305 | 306 | #plot the piechart with index 'tpc' 307 | df_tpc_pie.index = df_tpc_pie['note'] 308 | 309 | #do the pie chart 310 | ax.pie(labels=df_tpc_pie.index, x=df_tpc_pie['part'], colors=color_note, startangle=rotation, **kwargs) 311 | 312 | #if asked plot the colorbar left of the piechart 313 | if colorbar: 314 | ax2 = fig.add_subplot(1, 10, 1) 315 | cb1 = matplotlib.colorbar.ColorbarBase(ax2, cmap=cmap, norm=norm, orientation='vertical') 316 | 317 | #display with the pc values 318 | else: 319 | #put the right values in 'number' 320 | if duration: 321 | df_data = pd.concat( 322 | [df['pc'], df['duration']], 323 | axis=1, 324 | keys=['pc', 'number']) 325 | else: 326 | df_data = pd.concat( 327 | [df['pc'], df['nb']], 328 | axis=1, 329 | keys=['pc', 'number']) 330 | 331 | #Normalize the values for the colors 332 | max_value = df_data['number'].max() 333 | min_value = df_data['number'].min() 334 | if log: 335 | norm = matplotlib.colors.LogNorm(vmin=min_value, vmax=max_value) 336 | else: 337 | norm = matplotlib.colors.Normalize(0, vmax=max_value) 338 | 339 | #set data df_data 340 | df_data = (df_data.groupby('pc')).sum() 341 | df_data = df_data.reindex(s_tpc_format) 342 | df_data.fillna(0, inplace=True) 343 | 344 | #set colors 345 | for i in range(0, 12): 346 | if df_data.iat[i, 0] != 0: 347 | color_note.append(cmap(norm(df_data.iat[i, 0]))) 348 | else: 349 | if pd.isnull(nan_color): 350 | color_note.append(cmap(0)) 351 | else: 352 | color_note.append(nan_color) 353 | 354 | #if clockwise invert the order of the data to be displayed clockwise 355 | if clockwise: 356 | s_twelve_ones = s_twelve_ones.iloc[::-1] 357 | color_note = list(reversed(color_note)) 358 | 359 | #calculate the angle for the topPitchClass to be at the top 360 | if pd.isnull(top) == False: 361 | for i in range(s_tpc_format.shape[0]): 362 | if top == (s_twelve_ones.index)[i]: 363 | rotation = rotation + 75 - i * 30 364 | break 365 | ax.pie(labels=s_twelve_ones.index, x=s_twelve_ones, colors=color_note, startangle=rotation, **kwargs) 366 | 367 | #if asked plot the colorbar left of the piechart 368 | if colorbar: 369 | ax2 = fig.add_subplot(1, 10, 1) 370 | cb1 = matplotlib.colorbar.ColorbarBase(ax2, cmap=cmap, norm=norm, orientation='vertical') 371 | return fig 372 | 373 | 374 | def tonnetz( 375 | piece, 376 | pitch_type='tpc', 377 | measures=None, 378 | pitch_class_display=False, 379 | duplicate=True, 380 | duration=False, 381 | log=False, 382 | colorbar=True, 383 | vocabulary={0:'C', 1:'Db', 2:'D', 3:'Eb', 4:'E', 5:'F', 6:'Gb', 7:'G', 8:'Ab', 9:'A', 10:'Bb', 11:'B'}, 384 | radius=3, 385 | hex_size=1, 386 | fontsize=1, 387 | figsize=[7, 4], 388 | cmap='Blues', 389 | nan_color=None, 390 | edgecolor=None, 391 | center=None, 392 | show=False, # CHANGE IT TO SHOW 393 | **kwargs): 394 | """return the figure of a 2D grid of hexagons, each hexagons being a note 395 | 396 | Keyword arguments: 397 | piece -- the absolute path to the .csv file containing the data or a DataFrame 398 | pitch_type -- the type of data that you want to be read (default 'tpc'), 'pc' could be use for twelve parts chart tpc form 399 | (tpc:[A, B#, Gbbb, ...], pc (pitch class):[0, 3, 7, ...]) 400 | measures -- give a set of measures example [5, 18], will display the notes of the measures 5 to 18 included 401 | pitch_class_display -- if True display the pitch class and not the tpc values and so the grid repeat itself. 402 | duplicate -- it False avoid any repetition of the notes in the grid 403 | duration -- if True the values taking account is the duration and not the number of appearence 404 | log -- if True the colors are distributed on a log scale, by default it's a lineare scale (default False) 405 | colorbar -- if true display the colorbar aside of the chart 406 | vocabulary -- the conversion dictionary from pitch class to tpc(F#, A, ...) format, 407 | radius -- define the number of layers of the hexagonal grid (default 3) 408 | hex_size -- indicate the size of the hexagons (default 1) 409 | fontsize -- indicate the size of the typo for the labels (default 1) 410 | figsize -- tell the size of the figure in inches [x, y] 411 | cmap -- indicate the type of color to use for the heatmap, see matplotlib color documentation (default 'Blues') 412 | nan_color -- give the possibility to set a color for the note that do not appear in the piece (default None) 413 | center -- you can set the note that will be in the center of the grid, 414 | by default it put the most recurent note in the center (default None) 415 | display -- if True the figure is displayed, if False it is hidden so you can have only the returned figure 416 | **kwargs -- these arguments are redirected to matplotlib.patches.RegularPolygon, see informations at 417 | https://matplotlib.org/api/_as_gen/matplotlib.patches.RegularPolygon.html 418 | """ 419 | #=================================================================================== 420 | #constant, parameter, variables 421 | #=================================================================================== 422 | 423 | #settings 424 | df_data = get_df_short(piece, vocabulary=vocabulary, pitch_type=pitch_type, measures=measures, duration=duration) 425 | 426 | #constant 427 | HEXEDGE = math.sqrt(3)/2 #math constant 428 | 429 | #intern variables 430 | length = 0.05 * hex_size * 1.5 * 3 / radius#radius and border length of the hexagons 431 | center_pos = [0.5, 0.5] # set the center on the center of the map 432 | size_text = length * 150 * fontsize # parameter fontsize 433 | pos = [0, 0, 0] #x, y, z 434 | pos_ser = (0, 0, 0) #for serching in the data 435 | a_center = ['F', 0] # the center that was define (note, sup) 436 | color_nb = 0 437 | color_text = 'Black' # by default 438 | show_hex = True 439 | 440 | #Normalize the numbers for colours 441 | if duration: 442 | max_val_tpc = df_data['duration'].max() 443 | min_val_tpc = df_data['duration'].min() 444 | else: 445 | max_val_tpc = df_data['nb'].max() 446 | min_val_tpc = df_data['nb'].min() 447 | if log: 448 | norm = matplotlib.colors.LogNorm(vmin=min_val_tpc, vmax=max_val_tpc) 449 | else: 450 | norm = matplotlib.colors.Normalize(vmin=0, vmax=max_val_tpc) 451 | 452 | found = False 453 | 454 | #define figure 455 | fig = plt.figure(figsize=figsize) 456 | if not show: 457 | plt.close(fig) 458 | ax = fig.add_subplot(111, aspect='equal') 459 | 460 | 461 | #colormap for the layout 462 | cmap = matplotlib.cm.get_cmap(cmap) 463 | 464 | #is the list of hexagon already define 465 | if pitch_class_display: 466 | columns = ['pos', 'note'] 467 | else: 468 | columns = ['pos', 'note', 'acc'] 469 | df_pos = pd.DataFrame(columns=columns) 470 | 471 | #give the notes'neighbours 472 | df_nei = pd.DataFrame.from_dict(get_dic_nei(pitch_class_display)) 473 | 474 | #give the direction to look to for the nearest define hexagon 475 | x_list = [-1, 1, 0, 0, 1, -1] 476 | y_list = [1, -1, -1, 1, 0, 0] 477 | z_list = [0, 0, 1, -1, -1, 1] 478 | 479 | #=================================================================================== 480 | #hexgrid 481 | #=================================================================================== 482 | 483 | #do the first hexagon of the center 484 | #if not define it takes the most current note 485 | if pd.isnull(center): 486 | #draw the hexagon 487 | p = patches.RegularPolygon(center_pos, 6, radius=length, color=cmap(1/1), **kwargs) 488 | 489 | if pitch_class_display: 490 | ax.text( 491 | center_pos[0], 492 | center_pos[1], 493 | str(int(df_data['pc'][0])), 494 | color='white', 495 | horizontalalignment='center', 496 | verticalalignment='center', 497 | size=size_text) 498 | df_pos = df_pos.append( 499 | {'pos':(0,0,0), 'note':df_data['pc'][0]}, 500 | ignore_index=True) 501 | else: 502 | ax.text( 503 | center_pos[0], 504 | center_pos[1], 505 | put_flat_sharp(df_data['step'][0], df_data['acc'][0]).replace('#', r'$\sharp$') \ 506 | .replace('b', r'$\flat$'), 507 | color='white', 508 | horizontalalignment='center', 509 | verticalalignment='center', 510 | size=size_text) 511 | df_pos = df_pos.append( 512 | {'pos':(0,0,0), 'note':df_data['step'][0], 'acc':df_data['acc'][0]}, 513 | ignore_index=True) 514 | ax.add_patch(p) 515 | 516 | else: #read the given note and display it 517 | if pitch_class_display: 518 | df_pos = df_pos.append( 519 | {'pos':(0,0,0), 'note':center}, 520 | ignore_index=True) 521 | else: 522 | a_center[0] = get_step(center) 523 | a_center[1] = get_acc(center) 524 | df_pos = df_pos.append( 525 | {'pos':(0,0,0), 'note':a_center[0], 'acc':a_center[1]}, 526 | ignore_index=True) 527 | 528 | #set the color 529 | color = cmap(0) 530 | found = False 531 | color_nb = 0 532 | for l in range(df_data.shape[0]): 533 | if pitch_class_display: 534 | if str(int(df_data.at[l, 'pc'])) == str(center): 535 | if duration: 536 | color = cmap(norm(df_data.at[l, 'duration'])) 537 | color_nb = norm(df_data.at[l, 'duration']) 538 | else: 539 | color = cmap(norm(df_data.at[l, 'nb'])) 540 | color_nb = norm(df_data.at[l, 'nb']) 541 | found = True 542 | else: 543 | if df_data.at[l, 'step'] == a_center[0] and df_data.at[l, 'acc'] == a_center[1]: 544 | if duration: 545 | color = cmap(norm(df_data.at[l, 'duration'])) 546 | color_nb = norm(df_data.at[l, 'duration']) 547 | else: 548 | color = cmap(norm(df_data.at[l, 'nb'])) 549 | color_nb = norm(df_data.at[l, 'nb']) 550 | found = True 551 | 552 | if found == False and pd.isnull(nan_color) == False: 553 | color = nan_color 554 | 555 | #define the color af the label in function of the color of the hexagon 556 | if color_nb > 0.6: 557 | color_text = 'White' 558 | else: 559 | color_text = 'Black' 560 | 561 | if pitch_class_display == False: 562 | a_center[0] = put_flat_sharp(a_center[0], a_center[1]) 563 | 564 | if not edgecolor: 565 | edgecolor = color 566 | #draw and add labels 567 | p = patches.RegularPolygon( 568 | center_pos, 569 | 6, 570 | radius=length, 571 | facecolor=color, 572 | edgecolor=edgecolor, 573 | **kwargs) 574 | if pitch_class_display: 575 | ax.text( 576 | center_pos[0], 577 | center_pos[1], 578 | str(int(center)), 579 | color=color_text, 580 | horizontalalignment='center', 581 | verticalalignment='center', 582 | size=size_text) 583 | else: 584 | ax.text( 585 | center_pos[0], 586 | center_pos[1], 587 | a_center[0].replace('#', r'$\sharp$') \ 588 | .replace('b', r'$\flat$'), 589 | color=color_text, 590 | horizontalalignment='center', 591 | verticalalignment='center', 592 | size=size_text) 593 | ax.add_patch(p) 594 | 595 | #do the rest of the plot except the first hex 596 | for layer in range(radius + 1): #for each layer 597 | for i in range(3): #for x,y,z 598 | for j in range(2): #for negative and positive value 599 | for k in range(layer): #to do the number of hexagon on sides 600 | #set the position of the hexagon 601 | pos[(0 + i) % 3] = layer * ((-1) ** j) 602 | pos[(1 + i) % 3] = (-layer + k) * ((-1) ** j) 603 | pos[(2 + i) % 3] = (-k) * ((-1) ** j) 604 | 605 | #position of the nearest hexagon already defined 606 | pos_ser = ( 607 | pos[0] + x_list[j+i*2], 608 | pos[1] + y_list[j+i*2], 609 | pos[2] + z_list[j+i*2]) 610 | 611 | #position to search in df_nei 612 | pos_ser_n = ( 613 | x_list[j+i*2] * (-1), 614 | y_list[j+i*2] * (-1), 615 | z_list[j+i*2] * (-1)) 616 | 617 | select_data = df_pos['pos'] == pos_ser 618 | 619 | if pitch_class_display == False: 620 | current_sup = df_pos[select_data].iat[0, 2] 621 | 622 | #get df for the note of reference from df_nei 623 | df_nei_gr = df_nei.groupby('ref').get_group(df_pos[select_data].iat[0, 1]) 624 | 625 | #select the name of the note from the hexagone 626 | select_data = df_nei_gr['pos'] == pos_ser_n 627 | 628 | #register the hex in function of the type of value 629 | if pitch_class_display: 630 | current_note = df_nei_gr[select_data].iat[0, 2] 631 | df_pos = df_pos.append( 632 | {'pos':(pos[0], pos[1], pos[2]), 633 | 'note':current_note}, 634 | ignore_index=True) 635 | else: 636 | current_note = df_nei_gr[select_data].iat[0, 2] 637 | current_sup = current_sup + df_nei_gr[select_data].iat[0, 3] 638 | df_pos = df_pos.append( 639 | {'pos':(pos[0], pos[1], pos[2]), 640 | 'note':current_note, 641 | 'acc':current_sup}, 642 | ignore_index=True) 643 | 644 | #set the facecolor of the hex 645 | color = cmap(0) 646 | color_nb = 0 647 | found = False 648 | for l in range(df_data.shape[0]): 649 | if pitch_class_display: 650 | #check if he finds the note in the data and get its value for color 651 | if str(int(df_data.at[l, 'pc'])) == str(current_note): 652 | if duration: 653 | color = cmap(norm(df_data.at[l, 'duration'])) 654 | color_nb = norm(df_data.at[l, 'duration']) 655 | else: 656 | color = cmap(norm(df_data.at[l, 'nb'])) 657 | color_nb = norm(df_data.at[l, 'nb']) 658 | found = True 659 | else: 660 | if df_data.at[l, 'step'] == current_note and df_data.at[l, 'acc'] == current_sup: 661 | if duration: 662 | color = cmap(norm(df_data.at[l, 'duration'])) 663 | color_nb = norm(df_data.at[l, 'duration']) 664 | else: 665 | color = cmap(norm(df_data.at[l, 'nb'])) 666 | color_nb = norm(df_data.at[l, 'nb']) 667 | found = True 668 | 669 | if found == False and pd.isnull(nan_color) == False: 670 | color = nan_color 671 | 672 | #define the color af the label in function of the color of the hexagon 673 | if color_nb > 0.6: 674 | color_text = 'White' 675 | else: 676 | color_text = 'Black' 677 | 678 | if pitch_class_display == False: 679 | current_note = put_flat_sharp(current_note, current_sup) 680 | 681 | #calcul the center position of the hex in function of the coordonnate 682 | center_pos = [0.5 + pos[0] * HEXEDGE * length - pos[1] * HEXEDGE * length, 683 | 0.5 + pos[0] * length / 2 + pos[1] * length / 2 - pos[2] * length] 684 | 685 | show_hex = True 686 | 687 | #if no duplicate then check if the note is already display 688 | if duplicate == False: 689 | for l in range(df_pos.shape[0] - 1): 690 | if pitch_class_display: 691 | if df_pos.at[l, 'note'] == df_pos.at[df_pos.shape[0] - 1, 'note']: 692 | show_hex = False 693 | else: 694 | if df_pos.at[l, 'note'] == df_pos.at[df_pos.shape[0] - 1, 'note'] and\ 695 | df_pos.at[l, 'acc'] == df_pos.at[df_pos.shape[0] - 1, 'acc']: 696 | show_hex = False 697 | 698 | #draw 699 | if show_hex: 700 | if not edgecolor: 701 | edgecolor = color 702 | p = patches.RegularPolygon( 703 | center_pos, 704 | 6, 705 | radius=length, 706 | facecolor=color, 707 | edgecolor=edgecolor, 708 | **kwargs) 709 | if pitch_class_display: 710 | ax.text( 711 | center_pos[0], 712 | center_pos[1], 713 | str(int(current_note)), 714 | color=color_text, 715 | horizontalalignment='center', 716 | verticalalignment='center', 717 | size=size_text) 718 | else: 719 | ax.text( 720 | center_pos[0], 721 | center_pos[1], 722 | current_note.replace('#', r'$\sharp$') \ 723 | .replace('b', r'$\flat$'), 724 | color=color_text, 725 | horizontalalignment='center', 726 | verticalalignment='center', 727 | size=size_text) 728 | ax.add_patch(p) 729 | 730 | #display a colorbar if asked 731 | if colorbar: 732 | ax2 = fig.add_subplot(1, 10, 1) 733 | cb1 = matplotlib.colorbar.ColorbarBase(ax2, cmap=cmap, 734 | norm=norm, 735 | orientation='vertical') 736 | 737 | #display off the axis 738 | ax.axis('off') 739 | 740 | return fig 741 | -------------------------------------------------------------------------------- /data/data_example.csv: -------------------------------------------------------------------------------- 1 | ,filepath,qpm,time_sign_num,time_sign_den,measure_no,no_accs,mode,key_area,type,note_name,tpc,step,acc,octave,pitch,pitch_class,duration,onset 2 | 0,Sati_Gymnopedie.mxl,34.0,3,4,1,2,major,0,rest,,,,,,,,0.25,0 3 | 1,Sati_Gymnopedie.mxl,34.0,3,4,1,2,major,0,rest,,,,,,,,0.25,0.0 4 | 2,Sati_Gymnopedie.mxl,34.0,3,4,1,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,1.1111111111111112 5 | 3,Sati_Gymnopedie.mxl,34.0,3,4,1,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,1.1111111111111112 6 | 4,Sati_Gymnopedie.mxl,34.0,3,4,1,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,1.1111111111111112 7 | 5,Sati_Gymnopedie.mxl,34.0,3,4,1,2,major,0,note,G2,G,G,0.0,2,43.0,7.0,0.75,0.0 8 | 6,Sati_Gymnopedie.mxl,34.0,3,4,2,2,major,0,rest,,,,,,,,0.25,3.3333333333333335 9 | 7,Sati_Gymnopedie.mxl,34.0,3,4,2,2,major,0,rest,,,,,,,,0.25,3.3333333333333335 10 | 8,Sati_Gymnopedie.mxl,34.0,3,4,2,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,4.444444444444445 11 | 9,Sati_Gymnopedie.mxl,34.0,3,4,2,2,major,0,note,C#4,C#,C,1.0,4,61.0,1.0,0.5,4.444444444444445 12 | 10,Sati_Gymnopedie.mxl,34.0,3,4,2,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,4.444444444444445 13 | 11,Sati_Gymnopedie.mxl,34.0,3,4,2,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,3.3333333333333335 14 | 12,Sati_Gymnopedie.mxl,34.0,3,4,3,2,major,0,rest,,,,,,,,0.25,6.666666666666667 15 | 13,Sati_Gymnopedie.mxl,34.0,3,4,3,2,major,0,rest,,,,,,,,0.25,6.666666666666666 16 | 14,Sati_Gymnopedie.mxl,34.0,3,4,3,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,7.777777777777777 17 | 15,Sati_Gymnopedie.mxl,34.0,3,4,3,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,7.777777777777777 18 | 16,Sati_Gymnopedie.mxl,34.0,3,4,3,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,7.777777777777777 19 | 17,Sati_Gymnopedie.mxl,34.0,3,4,3,2,major,0,note,G2,G,G,0.0,2,43.0,7.0,0.75,6.666666666666666 20 | 18,Sati_Gymnopedie.mxl,34.0,3,4,4,2,major,0,rest,,,,,,,,0.25,10.0 21 | 19,Sati_Gymnopedie.mxl,34.0,3,4,4,2,major,0,rest,,,,,,,,0.25,10.0 22 | 20,Sati_Gymnopedie.mxl,34.0,3,4,4,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,11.11111111111111 23 | 21,Sati_Gymnopedie.mxl,34.0,3,4,4,2,major,0,note,C#4,C#,C,1.0,4,61.0,1.0,0.5,11.11111111111111 24 | 22,Sati_Gymnopedie.mxl,34.0,3,4,4,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,11.11111111111111 25 | 23,Sati_Gymnopedie.mxl,34.0,3,4,4,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,9.999999999999998 26 | 24,Sati_Gymnopedie.mxl,34.0,3,4,5,2,major,0,rest,,,,,,,,0.25,13.333333333333332 27 | 25,Sati_Gymnopedie.mxl,34.0,3,4,5,2,major,0,note,F#5,F#,F,1.0,5,78.0,6.0,0.25,14.444444444444443 28 | 26,Sati_Gymnopedie.mxl,34.0,3,4,5,2,major,0,note,A5,A,A,0.0,5,81.0,9.0,0.25,15.555555555555554 29 | 27,Sati_Gymnopedie.mxl,34.0,3,4,5,2,major,0,rest,,,,,,,,0.25,13.33333333333333 30 | 28,Sati_Gymnopedie.mxl,34.0,3,4,5,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,14.444444444444441 31 | 29,Sati_Gymnopedie.mxl,34.0,3,4,5,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,14.444444444444441 32 | 30,Sati_Gymnopedie.mxl,34.0,3,4,5,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,14.444444444444441 33 | 31,Sati_Gymnopedie.mxl,34.0,3,4,5,2,major,0,note,G2,G,G,0.0,2,43.0,7.0,0.75,13.33333333333333 34 | 32,Sati_Gymnopedie.mxl,34.0,3,4,6,2,major,0,note,G5,G,G,0.0,5,79.0,7.0,0.25,16.666666666666664 35 | 33,Sati_Gymnopedie.mxl,34.0,3,4,6,2,major,0,note,F#5,F#,F,1.0,5,78.0,6.0,0.25,17.777777777777775 36 | 34,Sati_Gymnopedie.mxl,34.0,3,4,6,2,major,0,note,C#5,C#,C,1.0,5,73.0,1.0,0.25,18.888888888888886 37 | 35,Sati_Gymnopedie.mxl,34.0,3,4,6,2,major,0,rest,,,,,,,,0.25,16.666666666666664 38 | 36,Sati_Gymnopedie.mxl,34.0,3,4,6,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,17.777777777777775 39 | 37,Sati_Gymnopedie.mxl,34.0,3,4,6,2,major,0,note,C#4,C#,C,1.0,4,61.0,1.0,0.5,17.777777777777775 40 | 38,Sati_Gymnopedie.mxl,34.0,3,4,6,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,17.777777777777775 41 | 39,Sati_Gymnopedie.mxl,34.0,3,4,6,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,16.666666666666664 42 | 40,Sati_Gymnopedie.mxl,34.0,3,4,7,2,major,0,note,B4,B,B,0.0,4,71.0,11.0,0.25,19.999999999999996 43 | 41,Sati_Gymnopedie.mxl,34.0,3,4,7,2,major,0,note,C#5,C#,C,1.0,5,73.0,1.0,0.25,21.111111111111107 44 | 42,Sati_Gymnopedie.mxl,34.0,3,4,7,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.25,22.222222222222218 45 | 43,Sati_Gymnopedie.mxl,34.0,3,4,7,2,major,0,rest,,,,,,,,0.25,19.999999999999996 46 | 44,Sati_Gymnopedie.mxl,34.0,3,4,7,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,21.111111111111107 47 | 45,Sati_Gymnopedie.mxl,34.0,3,4,7,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,21.111111111111107 48 | 46,Sati_Gymnopedie.mxl,34.0,3,4,7,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,21.111111111111107 49 | 47,Sati_Gymnopedie.mxl,34.0,3,4,7,2,major,0,note,G2,G,G,0.0,2,43.0,7.0,0.75,19.999999999999996 50 | 48,Sati_Gymnopedie.mxl,34.0,3,4,8,2,major,0,note,A4,A,A,0.0,4,69.0,9.0,0.75,23.33333333333333 51 | 49,Sati_Gymnopedie.mxl,34.0,3,4,8,2,major,0,rest,,,,,,,,0.25,23.33333333333333 52 | 50,Sati_Gymnopedie.mxl,34.0,3,4,8,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,24.44444444444444 53 | 51,Sati_Gymnopedie.mxl,34.0,3,4,8,2,major,0,note,C#4,C#,C,1.0,4,61.0,1.0,0.5,24.44444444444444 54 | 52,Sati_Gymnopedie.mxl,34.0,3,4,8,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,24.44444444444444 55 | 53,Sati_Gymnopedie.mxl,34.0,3,4,8,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,23.33333333333333 56 | 54,Sati_Gymnopedie.mxl,34.0,3,4,9,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.75,26.66666666666666 57 | 55,Sati_Gymnopedie.mxl,34.0,3,4,9,2,major,0,rest,,,,,,,,0.25,26.66666666666666 58 | 56,Sati_Gymnopedie.mxl,34.0,3,4,9,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,27.77777777777777 59 | 57,Sati_Gymnopedie.mxl,34.0,3,4,9,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,27.77777777777777 60 | 58,Sati_Gymnopedie.mxl,34.0,3,4,9,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,27.77777777777777 61 | 59,Sati_Gymnopedie.mxl,34.0,3,4,9,2,major,0,note,G2,G,G,0.0,2,43.0,7.0,0.75,26.66666666666666 62 | 60,Sati_Gymnopedie.mxl,34.0,3,4,10,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.75,29.999999999999993 63 | 61,Sati_Gymnopedie.mxl,34.0,3,4,10,2,major,0,rest,,,,,,,,0.25,29.999999999999996 64 | 62,Sati_Gymnopedie.mxl,34.0,3,4,10,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,31.111111111111107 65 | 63,Sati_Gymnopedie.mxl,34.0,3,4,10,2,major,0,note,C#4,C#,C,1.0,4,61.0,1.0,0.5,31.111111111111107 66 | 64,Sati_Gymnopedie.mxl,34.0,3,4,10,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,31.111111111111107 67 | 65,Sati_Gymnopedie.mxl,34.0,3,4,10,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,29.999999999999996 68 | 66,Sati_Gymnopedie.mxl,34.0,3,4,11,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.75,33.33333333333333 69 | 67,Sati_Gymnopedie.mxl,34.0,3,4,11,2,major,0,rest,,,,,,,,0.25,33.33333333333333 70 | 68,Sati_Gymnopedie.mxl,34.0,3,4,11,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,34.44444444444444 71 | 69,Sati_Gymnopedie.mxl,34.0,3,4,11,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,34.44444444444444 72 | 70,Sati_Gymnopedie.mxl,34.0,3,4,11,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,34.44444444444444 73 | 71,Sati_Gymnopedie.mxl,34.0,3,4,11,2,major,0,note,G2,G,G,0.0,2,43.0,7.0,0.75,33.33333333333333 74 | 72,Sati_Gymnopedie.mxl,34.0,3,4,12,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.75,36.666666666666664 75 | 73,Sati_Gymnopedie.mxl,34.0,3,4,12,2,major,0,rest,,,,,,,,0.25,36.666666666666664 76 | 74,Sati_Gymnopedie.mxl,34.0,3,4,12,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,37.77777777777778 77 | 75,Sati_Gymnopedie.mxl,34.0,3,4,12,2,major,0,note,C#4,C#,C,1.0,4,61.0,1.0,0.5,37.77777777777778 78 | 76,Sati_Gymnopedie.mxl,34.0,3,4,12,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,37.77777777777778 79 | 77,Sati_Gymnopedie.mxl,34.0,3,4,12,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,36.666666666666664 80 | 78,Sati_Gymnopedie.mxl,34.0,3,4,13,2,major,0,rest,,,,,,,,0.25,40.0 81 | 79,Sati_Gymnopedie.mxl,34.0,3,4,13,2,major,0,note,F#5,F#,F,1.0,5,78.0,6.0,0.25,41.111111111111114 82 | 80,Sati_Gymnopedie.mxl,34.0,3,4,13,2,major,0,note,A5,A,A,0.0,5,81.0,9.0,0.25,42.22222222222223 83 | 81,Sati_Gymnopedie.mxl,34.0,3,4,13,2,major,0,rest,,,,,,,,0.25,40.00000000000001 84 | 82,Sati_Gymnopedie.mxl,34.0,3,4,13,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,41.11111111111112 85 | 83,Sati_Gymnopedie.mxl,34.0,3,4,13,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,41.11111111111112 86 | 84,Sati_Gymnopedie.mxl,34.0,3,4,13,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,41.11111111111112 87 | 85,Sati_Gymnopedie.mxl,34.0,3,4,13,2,major,0,note,G2,G,G,0.0,2,43.0,7.0,0.75,40.00000000000001 88 | 86,Sati_Gymnopedie.mxl,34.0,3,4,14,2,major,0,note,G5,G,G,0.0,5,79.0,7.0,0.25,43.33333333333334 89 | 87,Sati_Gymnopedie.mxl,34.0,3,4,14,2,major,0,note,F#5,F#,F,1.0,5,78.0,6.0,0.25,44.44444444444446 90 | 88,Sati_Gymnopedie.mxl,34.0,3,4,14,2,major,0,note,C#5,C#,C,1.0,5,73.0,1.0,0.25,45.55555555555557 91 | 89,Sati_Gymnopedie.mxl,34.0,3,4,14,2,major,0,rest,,,,,,,,0.25,43.33333333333335 92 | 90,Sati_Gymnopedie.mxl,34.0,3,4,14,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,44.444444444444464 93 | 91,Sati_Gymnopedie.mxl,34.0,3,4,14,2,major,0,note,C#4,C#,C,1.0,4,61.0,1.0,0.5,44.444444444444464 94 | 92,Sati_Gymnopedie.mxl,34.0,3,4,14,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,44.444444444444464 95 | 93,Sati_Gymnopedie.mxl,34.0,3,4,14,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,43.33333333333335 96 | 94,Sati_Gymnopedie.mxl,34.0,3,4,15,2,major,0,note,B4,B,B,0.0,4,71.0,11.0,0.25,46.666666666666686 97 | 95,Sati_Gymnopedie.mxl,34.0,3,4,15,2,major,0,note,C#5,C#,C,1.0,5,73.0,1.0,0.25,47.7777777777778 98 | 96,Sati_Gymnopedie.mxl,34.0,3,4,15,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.25,48.888888888888914 99 | 97,Sati_Gymnopedie.mxl,34.0,3,4,15,2,major,0,rest,,,,,,,,0.25,46.66666666666669 100 | 98,Sati_Gymnopedie.mxl,34.0,3,4,15,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,47.77777777777781 101 | 99,Sati_Gymnopedie.mxl,34.0,3,4,15,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,47.77777777777781 102 | 100,Sati_Gymnopedie.mxl,34.0,3,4,15,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,47.77777777777781 103 | 101,Sati_Gymnopedie.mxl,34.0,3,4,15,2,major,0,note,G2,G,G,0.0,2,43.0,7.0,0.75,46.66666666666669 104 | 102,Sati_Gymnopedie.mxl,34.0,3,4,16,2,major,0,note,A4,A,A,0.0,4,69.0,9.0,0.75,50.00000000000003 105 | 103,Sati_Gymnopedie.mxl,34.0,3,4,16,2,major,0,rest,,,,,,,,0.25,50.00000000000003 106 | 104,Sati_Gymnopedie.mxl,34.0,3,4,16,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,51.11111111111114 107 | 105,Sati_Gymnopedie.mxl,34.0,3,4,16,2,major,0,note,C#4,C#,C,1.0,4,61.0,1.0,0.5,51.11111111111114 108 | 106,Sati_Gymnopedie.mxl,34.0,3,4,16,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,51.11111111111114 109 | 107,Sati_Gymnopedie.mxl,34.0,3,4,16,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,50.00000000000003 110 | 108,Sati_Gymnopedie.mxl,34.0,3,4,17,2,major,0,note,C#5,C#,C,1.0,5,73.0,1.0,0.75,53.333333333333364 111 | 109,Sati_Gymnopedie.mxl,34.0,3,4,17,2,major,0,rest,,,,,,,,0.25,53.333333333333364 112 | 110,Sati_Gymnopedie.mxl,34.0,3,4,17,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,54.44444444444448 113 | 111,Sati_Gymnopedie.mxl,34.0,3,4,17,2,major,0,note,C#4,C#,C,1.0,4,61.0,1.0,0.5,54.44444444444448 114 | 112,Sati_Gymnopedie.mxl,34.0,3,4,17,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,54.44444444444448 115 | 113,Sati_Gymnopedie.mxl,34.0,3,4,17,2,major,0,note,F#2,F#,F,1.0,2,42.0,6.0,0.75,53.333333333333364 116 | 114,Sati_Gymnopedie.mxl,34.0,3,4,18,2,major,0,note,F#5,F#,F,1.0,5,78.0,6.0,0.75,56.6666666666667 117 | 115,Sati_Gymnopedie.mxl,34.0,3,4,18,2,major,0,rest,,,,,,,,0.25,56.6666666666667 118 | 116,Sati_Gymnopedie.mxl,34.0,3,4,18,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,57.777777777777814 119 | 117,Sati_Gymnopedie.mxl,34.0,3,4,18,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,57.777777777777814 120 | 118,Sati_Gymnopedie.mxl,34.0,3,4,18,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,57.777777777777814 121 | 119,Sati_Gymnopedie.mxl,34.0,3,4,18,2,major,0,note,B1,B,B,0.0,1,35.0,11.0,0.75,56.6666666666667 122 | 120,Sati_Gymnopedie.mxl,34.0,3,4,19,2,major,0,note,E4,E,E,0.0,4,64.0,4.0,0.75,60.000000000000036 123 | 121,Sati_Gymnopedie.mxl,34.0,3,4,19,2,major,0,rest,,,,,,,,0.25,60.000000000000036 124 | 122,Sati_Gymnopedie.mxl,34.0,3,4,19,2,major,0,note,G3,G,G,0.0,3,55.0,7.0,0.5,61.11111111111115 125 | 123,Sati_Gymnopedie.mxl,34.0,3,4,19,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,61.11111111111115 126 | 124,Sati_Gymnopedie.mxl,34.0,3,4,19,2,major,0,note,E2,E,E,0.0,2,40.0,4.0,0.75,60.000000000000036 127 | 125,Sati_Gymnopedie.mxl,34.0,3,4,20,2,major,0,note,E4,E,E,0.0,4,64.0,4.0,0.75,63.33333333333337 128 | 126,Sati_Gymnopedie.mxl,34.0,3,4,20,2,major,0,rest,,,,,,,,0.25,63.333333333333364 129 | 127,Sati_Gymnopedie.mxl,34.0,3,4,20,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,64.44444444444447 130 | 128,Sati_Gymnopedie.mxl,34.0,3,4,20,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,64.44444444444447 131 | 129,Sati_Gymnopedie.mxl,34.0,3,4,20,2,major,0,note,G4,G,G,0.0,4,67.0,7.0,0.5,64.44444444444447 132 | 130,Sati_Gymnopedie.mxl,34.0,3,4,20,2,major,0,note,E2,E,E,0.0,2,40.0,4.0,0.75,63.333333333333364 133 | 131,Sati_Gymnopedie.mxl,34.0,3,4,21,2,major,0,note,E4,E,E,0.0,4,64.0,4.0,0.75,66.6666666666667 134 | 132,Sati_Gymnopedie.mxl,34.0,3,4,21,2,major,0,rest,,,,,,,,0.25,66.6666666666667 135 | 133,Sati_Gymnopedie.mxl,34.0,3,4,21,2,major,0,note,F3,F,F,0.0,3,53.0,5.0,0.5,67.77777777777781 136 | 134,Sati_Gymnopedie.mxl,34.0,3,4,21,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,67.77777777777781 137 | 135,Sati_Gymnopedie.mxl,34.0,3,4,21,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,67.77777777777781 138 | 136,Sati_Gymnopedie.mxl,34.0,3,4,21,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,66.66666666666671 139 | 137,Sati_Gymnopedie.mxl,34.0,3,4,22,2,major,0,note,A4,A,A,0.0,4,69.0,9.0,0.25,70.00000000000004 140 | 138,Sati_Gymnopedie.mxl,34.0,3,4,22,2,major,0,note,B4,B,B,0.0,4,71.0,11.0,0.25,71.11111111111116 141 | 139,Sati_Gymnopedie.mxl,34.0,3,4,22,2,major,0,note,C5,C,C,0.0,5,72.0,0.0,0.25,72.22222222222227 142 | 140,Sati_Gymnopedie.mxl,34.0,3,4,22,2,major,0,rest,,,,,,,,0.25,70.00000000000006 143 | 141,Sati_Gymnopedie.mxl,34.0,3,4,22,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,71.11111111111117 144 | 142,Sati_Gymnopedie.mxl,34.0,3,4,22,2,major,0,note,C4,C,C,0.0,4,60.0,0.0,0.5,71.11111111111117 145 | 143,Sati_Gymnopedie.mxl,34.0,3,4,22,2,major,0,note,E4,E,E,0.0,4,64.0,4.0,0.5,71.11111111111117 146 | 144,Sati_Gymnopedie.mxl,34.0,3,4,22,2,major,0,note,A1,A,A,0.0,1,33.0,9.0,0.75,70.00000000000007 147 | 145,Sati_Gymnopedie.mxl,34.0,3,4,23,2,major,0,note,E5,E,E,0.0,5,76.0,4.0,0.25,73.3333333333334 148 | 146,Sati_Gymnopedie.mxl,34.0,3,4,23,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.25,74.44444444444451 149 | 147,Sati_Gymnopedie.mxl,34.0,3,4,23,2,major,0,note,B4,B,B,0.0,4,71.0,11.0,0.25,75.55555555555563 150 | 148,Sati_Gymnopedie.mxl,34.0,3,4,23,2,major,0,rest,,,,,,,,0.25,73.33333333333341 151 | 149,Sati_Gymnopedie.mxl,34.0,3,4,23,2,major,0,note,G3,G,G,0.0,3,55.0,7.0,0.5,74.44444444444453 152 | 150,Sati_Gymnopedie.mxl,34.0,3,4,23,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,74.44444444444453 153 | 151,Sati_Gymnopedie.mxl,34.0,3,4,23,2,major,0,note,E4,E,E,0.0,4,64.0,4.0,0.5,74.44444444444453 154 | 152,Sati_Gymnopedie.mxl,34.0,3,4,23,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,73.33333333333343 155 | 153,Sati_Gymnopedie.mxl,34.0,3,4,24,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.25,76.66666666666676 156 | 154,Sati_Gymnopedie.mxl,34.0,3,4,24,2,major,0,note,C5,C,C,0.0,5,72.0,0.0,0.25,77.77777777777787 157 | 155,Sati_Gymnopedie.mxl,34.0,3,4,24,2,major,0,note,B4,B,B,0.0,4,71.0,11.0,0.25,78.88888888888899 158 | 156,Sati_Gymnopedie.mxl,34.0,3,4,24,2,major,0,rest,,,,,,,,0.25,76.66666666666677 159 | 157,Sati_Gymnopedie.mxl,34.0,3,4,24,2,major,0,note,D3,D,D,0.0,3,50.0,2.0,0.5,77.77777777777789 160 | 158,Sati_Gymnopedie.mxl,34.0,3,4,24,2,major,0,note,G3,G,G,0.0,3,55.0,7.0,0.5,77.77777777777789 161 | 159,Sati_Gymnopedie.mxl,34.0,3,4,24,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,77.77777777777789 162 | 160,Sati_Gymnopedie.mxl,34.0,3,4,24,2,major,0,note,E4,E,E,0.0,4,64.0,4.0,0.5,77.77777777777789 163 | 161,Sati_Gymnopedie.mxl,34.0,3,4,24,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,76.66666666666679 164 | 162,Sati_Gymnopedie.mxl,34.0,3,4,25,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.75,80.00000000000011 165 | 163,Sati_Gymnopedie.mxl,34.0,3,4,25,2,major,0,rest,,,,,,,,0.25,80.00000000000011 166 | 164,Sati_Gymnopedie.mxl,34.0,3,4,25,2,major,0,note,C3,C,C,0.0,3,48.0,0.0,0.5,81.11111111111123 167 | 165,Sati_Gymnopedie.mxl,34.0,3,4,25,2,major,0,note,E3,E,E,0.0,3,52.0,4.0,0.5,81.11111111111123 168 | 166,Sati_Gymnopedie.mxl,34.0,3,4,25,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,81.11111111111123 169 | 167,Sati_Gymnopedie.mxl,34.0,3,4,25,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,81.11111111111123 170 | 168,Sati_Gymnopedie.mxl,34.0,3,4,25,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,80.00000000000013 171 | 169,Sati_Gymnopedie.mxl,34.0,3,4,26,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.5,83.33333333333346 172 | 170,Sati_Gymnopedie.mxl,34.0,3,4,26,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.25,85.55555555555569 173 | 171,Sati_Gymnopedie.mxl,34.0,3,4,26,2,major,0,rest,,,,,,,,0.25,83.33333333333347 174 | 172,Sati_Gymnopedie.mxl,34.0,3,4,26,2,major,0,note,C3,C,C,0.0,3,48.0,0.0,0.5,84.44444444444458 175 | 173,Sati_Gymnopedie.mxl,34.0,3,4,26,2,major,0,note,F#3,F#,F,1.0,3,54.0,6.0,0.5,84.44444444444458 176 | 174,Sati_Gymnopedie.mxl,34.0,3,4,26,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,84.44444444444458 177 | 175,Sati_Gymnopedie.mxl,34.0,3,4,26,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,84.44444444444458 178 | 176,Sati_Gymnopedie.mxl,34.0,3,4,26,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,83.33333333333348 179 | 177,Sati_Gymnopedie.mxl,34.0,3,4,27,2,major,0,note,E5,E,E,0.0,5,76.0,4.0,0.25,86.66666666666681 180 | 178,Sati_Gymnopedie.mxl,34.0,3,4,27,2,major,0,note,F5,F,F,0.0,5,77.0,5.0,0.25,87.77777777777793 181 | 179,Sati_Gymnopedie.mxl,34.0,3,4,27,2,major,0,note,G5,G,G,0.0,5,79.0,7.0,0.25,88.88888888888904 182 | 180,Sati_Gymnopedie.mxl,34.0,3,4,27,2,major,0,rest,,,,,,,,0.25,86.66666666666683 183 | 181,Sati_Gymnopedie.mxl,34.0,3,4,27,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,87.77777777777794 184 | 182,Sati_Gymnopedie.mxl,34.0,3,4,27,2,major,0,note,C4,C,C,0.0,4,60.0,0.0,0.5,87.77777777777794 185 | 183,Sati_Gymnopedie.mxl,34.0,3,4,27,2,major,0,note,F4,F,F,0.0,4,65.0,5.0,0.5,87.77777777777794 186 | 184,Sati_Gymnopedie.mxl,34.0,3,4,27,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,86.66666666666684 187 | 185,Sati_Gymnopedie.mxl,34.0,3,4,28,2,major,0,note,A5,A,A,0.0,5,81.0,9.0,0.25,90.00000000000017 188 | 186,Sati_Gymnopedie.mxl,34.0,3,4,28,2,major,0,note,C5,C,C,0.0,5,72.0,0.0,0.25,91.11111111111128 189 | 187,Sati_Gymnopedie.mxl,34.0,3,4,28,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.25,92.2222222222224 190 | 188,Sati_Gymnopedie.mxl,34.0,3,4,28,2,major,0,rest,,,,,,,,0.25,90.00000000000018 191 | 189,Sati_Gymnopedie.mxl,34.0,3,4,28,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,91.1111111111113 192 | 190,Sati_Gymnopedie.mxl,34.0,3,4,28,2,major,0,note,C4,C,C,0.0,4,60.0,0.0,0.5,91.1111111111113 193 | 191,Sati_Gymnopedie.mxl,34.0,3,4,28,2,major,0,note,E4,E,E,0.0,4,64.0,4.0,0.5,91.1111111111113 194 | 192,Sati_Gymnopedie.mxl,34.0,3,4,28,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,90.0000000000002 195 | 193,Sati_Gymnopedie.mxl,34.0,3,4,29,2,major,0,note,E5,E,E,0.0,5,76.0,4.0,0.25,93.33333333333353 196 | 194,Sati_Gymnopedie.mxl,34.0,3,4,29,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.25,94.44444444444464 197 | 195,Sati_Gymnopedie.mxl,34.0,3,4,29,2,major,0,note,B4,B,B,0.0,4,71.0,11.0,0.25,95.55555555555576 198 | 196,Sati_Gymnopedie.mxl,34.0,3,4,29,2,major,0,rest,,,,,,,,0.25,93.33333333333354 199 | 197,Sati_Gymnopedie.mxl,34.0,3,4,29,2,major,0,note,D3,D,D,0.0,3,50.0,2.0,0.5,94.44444444444466 200 | 198,Sati_Gymnopedie.mxl,34.0,3,4,29,2,major,0,note,G3,G,G,0.0,3,55.0,7.0,0.5,94.44444444444466 201 | 199,Sati_Gymnopedie.mxl,34.0,3,4,29,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,94.44444444444466 202 | 200,Sati_Gymnopedie.mxl,34.0,3,4,29,2,major,0,note,E4,E,E,0.0,4,64.0,4.0,0.5,94.44444444444466 203 | 201,Sati_Gymnopedie.mxl,34.0,3,4,29,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,93.33333333333356 204 | 202,Sati_Gymnopedie.mxl,34.0,3,4,30,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.75,96.66666666666688 205 | 203,Sati_Gymnopedie.mxl,34.0,3,4,30,2,major,0,rest,,,,,,,,0.25,96.66666666666688 206 | 204,Sati_Gymnopedie.mxl,34.0,3,4,30,2,major,0,note,C3,C,C,0.0,3,48.0,0.0,0.5,97.777777777778 207 | 205,Sati_Gymnopedie.mxl,34.0,3,4,30,2,major,0,note,E3,E,E,0.0,3,52.0,4.0,0.5,97.777777777778 208 | 206,Sati_Gymnopedie.mxl,34.0,3,4,30,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,97.777777777778 209 | 207,Sati_Gymnopedie.mxl,34.0,3,4,30,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,97.777777777778 210 | 208,Sati_Gymnopedie.mxl,34.0,3,4,30,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,96.6666666666669 211 | 209,Sati_Gymnopedie.mxl,34.0,3,4,31,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.5,100.00000000000023 212 | 210,Sati_Gymnopedie.mxl,34.0,3,4,31,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.25,102.22222222222246 213 | 211,Sati_Gymnopedie.mxl,34.0,3,4,31,2,major,0,rest,,,,,,,,0.25,100.00000000000024 214 | 212,Sati_Gymnopedie.mxl,34.0,3,4,31,2,major,0,note,C3,C,C,0.0,3,48.0,0.0,0.5,101.11111111111136 215 | 213,Sati_Gymnopedie.mxl,34.0,3,4,31,2,major,0,note,F#3,F#,F,1.0,3,54.0,6.0,0.5,101.11111111111136 216 | 214,Sati_Gymnopedie.mxl,34.0,3,4,31,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,101.11111111111136 217 | 215,Sati_Gymnopedie.mxl,34.0,3,4,31,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,101.11111111111136 218 | 216,Sati_Gymnopedie.mxl,34.0,3,4,31,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,100.00000000000026 219 | 217,Sati_Gymnopedie.mxl,34.0,3,4,32,2,major,0,note,G5,G,G,0.0,5,79.0,7.0,0.75,103.33333333333358 220 | 218,Sati_Gymnopedie.mxl,34.0,3,4,32,2,major,0,rest,,,,,,,,0.25,103.33333333333358 221 | 219,Sati_Gymnopedie.mxl,34.0,3,4,32,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,104.4444444444447 222 | 220,Sati_Gymnopedie.mxl,34.0,3,4,32,2,major,0,note,E4,E,E,0.0,4,64.0,4.0,0.5,104.4444444444447 223 | 221,Sati_Gymnopedie.mxl,34.0,3,4,32,2,major,0,note,G4,G,G,0.0,4,67.0,7.0,0.5,104.4444444444447 224 | 222,Sati_Gymnopedie.mxl,34.0,3,4,32,2,major,0,note,E2,E,E,0.0,2,40.0,4.0,0.75,103.3333333333336 225 | 223,Sati_Gymnopedie.mxl,34.0,3,4,33,2,major,0,note,F#5,F#,F,1.0,5,78.0,6.0,0.75,106.66666666666693 226 | 224,Sati_Gymnopedie.mxl,34.0,3,4,33,2,major,0,rest,,,,,,,,0.25,106.66666666666693 227 | 225,Sati_Gymnopedie.mxl,34.0,3,4,33,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,107.77777777777804 228 | 226,Sati_Gymnopedie.mxl,34.0,3,4,33,2,major,0,note,C#4,C#,C,1.0,4,61.0,1.0,0.5,107.77777777777804 229 | 227,Sati_Gymnopedie.mxl,34.0,3,4,33,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,107.77777777777804 230 | 228,Sati_Gymnopedie.mxl,34.0,3,4,33,2,major,0,note,F#2,F#,F,1.0,2,42.0,6.0,0.75,106.66666666666694 231 | 229,Sati_Gymnopedie.mxl,34.0,3,4,34,2,major,0,note,B4,B,B,0.0,4,71.0,11.0,0.25,110.00000000000027 232 | 230,Sati_Gymnopedie.mxl,34.0,3,4,34,2,major,0,note,A4,A,A,0.0,4,69.0,9.0,0.25,111.11111111111138 233 | 231,Sati_Gymnopedie.mxl,34.0,3,4,34,2,major,0,note,B4,B,B,0.0,4,71.0,11.0,0.25,112.2222222222225 234 | 232,Sati_Gymnopedie.mxl,34.0,3,4,34,2,major,0,rest,,,,,,,,0.25,110.00000000000028 235 | 233,Sati_Gymnopedie.mxl,34.0,3,4,34,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,111.1111111111114 236 | 234,Sati_Gymnopedie.mxl,34.0,3,4,34,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,111.1111111111114 237 | 235,Sati_Gymnopedie.mxl,34.0,3,4,34,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,111.1111111111114 238 | 236,Sati_Gymnopedie.mxl,34.0,3,4,34,2,major,0,note,B1,B,B,0.0,1,35.0,11.0,0.75,110.0000000000003 239 | 237,Sati_Gymnopedie.mxl,34.0,3,4,35,2,major,0,note,C#5,C#,C,1.0,5,73.0,1.0,0.25,113.33333333333363 240 | 238,Sati_Gymnopedie.mxl,34.0,3,4,35,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.25,114.44444444444474 241 | 239,Sati_Gymnopedie.mxl,34.0,3,4,35,2,major,0,note,E5,E,E,0.0,5,76.0,4.0,0.25,115.55555555555586 242 | 240,Sati_Gymnopedie.mxl,34.0,3,4,35,2,major,0,rest,,,,,,,,0.25,113.33333333333364 243 | 241,Sati_Gymnopedie.mxl,34.0,3,4,35,2,major,0,note,C#4,C#,C,1.0,4,61.0,1.0,0.5,114.44444444444476 244 | 242,Sati_Gymnopedie.mxl,34.0,3,4,35,2,major,0,note,E4,E,E,0.0,4,64.0,4.0,0.5,114.44444444444476 245 | 243,Sati_Gymnopedie.mxl,34.0,3,4,35,2,major,0,note,A4,A,A,0.0,4,69.0,9.0,0.5,114.44444444444476 246 | 244,Sati_Gymnopedie.mxl,34.0,3,4,35,2,major,0,note,E2,E,E,0.0,2,40.0,4.0,0.75,113.33333333333366 247 | 245,Sati_Gymnopedie.mxl,34.0,3,4,36,2,major,0,note,C#5,C#,C,1.0,5,73.0,1.0,0.25,116.66666666666698 248 | 246,Sati_Gymnopedie.mxl,34.0,3,4,36,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.25,117.7777777777781 249 | 247,Sati_Gymnopedie.mxl,34.0,3,4,36,2,major,0,note,E5,E,E,0.0,5,76.0,4.0,0.25,118.88888888888921 250 | 248,Sati_Gymnopedie.mxl,34.0,3,4,36,2,major,0,rest,,,,,,,,0.25,116.666666666667 251 | 249,Sati_Gymnopedie.mxl,34.0,3,4,36,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,117.77777777777811 252 | 250,Sati_Gymnopedie.mxl,34.0,3,4,36,2,major,0,note,C#4,C#,C,1.0,4,61.0,1.0,0.5,117.77777777777811 253 | 251,Sati_Gymnopedie.mxl,34.0,3,4,36,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,117.77777777777811 254 | 252,Sati_Gymnopedie.mxl,34.0,3,4,36,2,major,0,note,A4,A,A,0.0,4,69.0,9.0,0.5,117.77777777777811 255 | 253,Sati_Gymnopedie.mxl,34.0,3,4,36,2,major,0,note,E2,E,E,0.0,2,40.0,4.0,0.75,116.66666666666701 256 | 254,Sati_Gymnopedie.mxl,34.0,3,4,37,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.75,120.00000000000034 257 | 255,Sati_Gymnopedie.mxl,34.0,3,4,37,2,major,0,rest,,,,,,,,0.25,120.00000000000034 258 | 256,Sati_Gymnopedie.mxl,34.0,3,4,37,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.25,121.11111111111146 259 | 257,Sati_Gymnopedie.mxl,34.0,3,4,37,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.25,121.11111111111146 260 | 258,Sati_Gymnopedie.mxl,34.0,3,4,37,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.25,122.22222222222257 261 | 259,Sati_Gymnopedie.mxl,34.0,3,4,37,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.25,122.22222222222257 262 | 260,Sati_Gymnopedie.mxl,34.0,3,4,37,2,major,0,note,G4,G,G,0.0,4,67.0,7.0,0.25,122.22222222222257 263 | 261,Sati_Gymnopedie.mxl,34.0,3,4,37,2,major,0,rest,,,,,,,,0.25,120.00000000000036 264 | 262,Sati_Gymnopedie.mxl,34.0,3,4,37,2,major,0,note,B2,B,B,0.0,2,47.0,11.0,0.25,121.11111111111147 265 | 263,Sati_Gymnopedie.mxl,34.0,3,4,37,2,major,0,note,E3,E,E,0.0,3,52.0,4.0,0.25,122.22222222222258 266 | 264,Sati_Gymnopedie.mxl,34.0,3,4,37,2,major,0,note,E2,E,E,0.0,2,40.0,4.0,0.75,120.00000000000037 267 | 265,Sati_Gymnopedie.mxl,34.0,3,4,38,2,major,0,note,C4,C,C,0.0,4,60.0,0.0,0.75,123.3333333333337 268 | 266,Sati_Gymnopedie.mxl,34.0,3,4,38,2,major,0,note,E4,E,E,0.0,4,64.0,4.0,0.75,123.3333333333337 269 | 267,Sati_Gymnopedie.mxl,34.0,3,4,38,2,major,0,note,A4,A,A,0.0,4,69.0,9.0,0.75,123.3333333333337 270 | 268,Sati_Gymnopedie.mxl,34.0,3,4,38,2,major,0,note,C5,C,C,0.0,5,72.0,0.0,0.75,123.3333333333337 271 | 269,Sati_Gymnopedie.mxl,34.0,3,4,38,2,major,0,note,A2,A,A,0.0,2,45.0,9.0,0.75,123.3333333333337 272 | 270,Sati_Gymnopedie.mxl,34.0,3,4,38,2,major,0,note,G3,G,G,0.0,3,55.0,7.0,0.75,123.3333333333337 273 | 271,Sati_Gymnopedie.mxl,34.0,3,4,39,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.75,126.66666666666703 274 | 272,Sati_Gymnopedie.mxl,34.0,3,4,39,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.75,126.66666666666703 275 | 273,Sati_Gymnopedie.mxl,34.0,3,4,39,2,major,0,note,A4,A,A,0.0,4,69.0,9.0,0.75,126.66666666666703 276 | 274,Sati_Gymnopedie.mxl,34.0,3,4,39,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.75,126.66666666666703 277 | 275,Sati_Gymnopedie.mxl,34.0,3,4,39,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,126.66666666666704 278 | 276,Sati_Gymnopedie.mxl,34.0,3,4,39,2,major,0,note,A2,A,A,0.0,2,45.0,9.0,0.75,126.66666666666704 279 | 277,Sati_Gymnopedie.mxl,34.0,3,4,39,2,major,0,note,D3,D,D,0.0,3,50.0,2.0,0.75,126.66666666666704 280 | 278,Sati_Gymnopedie.mxl,34.0,3,4,40,2,major,0,rest,,,,,,,,0.25,130.00000000000037 281 | 279,Sati_Gymnopedie.mxl,34.0,3,4,40,2,major,0,rest,,,,,,,,0.25,130.00000000000037 282 | 280,Sati_Gymnopedie.mxl,34.0,3,4,40,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,131.11111111111148 283 | 281,Sati_Gymnopedie.mxl,34.0,3,4,40,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,131.11111111111148 284 | 282,Sati_Gymnopedie.mxl,34.0,3,4,40,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,131.11111111111148 285 | 283,Sati_Gymnopedie.mxl,34.0,3,4,40,2,major,0,note,G2,G,G,0.0,2,43.0,7.0,0.75,130.00000000000037 286 | 284,Sati_Gymnopedie.mxl,34.0,3,4,41,2,major,0,rest,,,,,,,,0.25,133.3333333333337 287 | 285,Sati_Gymnopedie.mxl,34.0,3,4,41,2,major,0,rest,,,,,,,,0.25,133.3333333333337 288 | 286,Sati_Gymnopedie.mxl,34.0,3,4,41,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,134.44444444444483 289 | 287,Sati_Gymnopedie.mxl,34.0,3,4,41,2,major,0,note,C#4,C#,C,1.0,4,61.0,1.0,0.5,134.44444444444483 290 | 288,Sati_Gymnopedie.mxl,34.0,3,4,41,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,134.44444444444483 291 | 289,Sati_Gymnopedie.mxl,34.0,3,4,41,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,133.3333333333337 292 | 290,Sati_Gymnopedie.mxl,34.0,3,4,42,2,major,0,rest,,,,,,,,0.25,136.66666666666706 293 | 291,Sati_Gymnopedie.mxl,34.0,3,4,42,2,major,0,rest,,,,,,,,0.25,136.66666666666706 294 | 292,Sati_Gymnopedie.mxl,34.0,3,4,42,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,137.77777777777817 295 | 293,Sati_Gymnopedie.mxl,34.0,3,4,42,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,137.77777777777817 296 | 294,Sati_Gymnopedie.mxl,34.0,3,4,42,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,137.77777777777817 297 | 295,Sati_Gymnopedie.mxl,34.0,3,4,42,2,major,0,note,G2,G,G,0.0,2,43.0,7.0,0.75,136.66666666666706 298 | 296,Sati_Gymnopedie.mxl,34.0,3,4,43,2,major,0,rest,,,,,,,,0.25,140.0000000000004 299 | 297,Sati_Gymnopedie.mxl,34.0,3,4,43,2,major,0,rest,,,,,,,,0.25,140.0000000000004 300 | 298,Sati_Gymnopedie.mxl,34.0,3,4,43,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,141.1111111111115 301 | 299,Sati_Gymnopedie.mxl,34.0,3,4,43,2,major,0,note,C#4,C#,C,1.0,4,61.0,1.0,0.5,141.1111111111115 302 | 300,Sati_Gymnopedie.mxl,34.0,3,4,43,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,141.1111111111115 303 | 301,Sati_Gymnopedie.mxl,34.0,3,4,43,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,140.0000000000004 304 | 302,Sati_Gymnopedie.mxl,34.0,3,4,44,2,major,0,rest,,,,,,,,0.25,143.33333333333374 305 | 303,Sati_Gymnopedie.mxl,34.0,3,4,44,2,major,0,note,F#5,F#,F,1.0,5,78.0,6.0,0.25,144.44444444444485 306 | 304,Sati_Gymnopedie.mxl,34.0,3,4,44,2,major,0,note,A5,A,A,0.0,5,81.0,9.0,0.25,145.55555555555597 307 | 305,Sati_Gymnopedie.mxl,34.0,3,4,44,2,major,0,rest,,,,,,,,0.25,143.33333333333374 308 | 306,Sati_Gymnopedie.mxl,34.0,3,4,44,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,144.44444444444485 309 | 307,Sati_Gymnopedie.mxl,34.0,3,4,44,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,144.44444444444485 310 | 308,Sati_Gymnopedie.mxl,34.0,3,4,44,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,144.44444444444485 311 | 309,Sati_Gymnopedie.mxl,34.0,3,4,44,2,major,0,note,G2,G,G,0.0,2,43.0,7.0,0.75,143.33333333333374 312 | 310,Sati_Gymnopedie.mxl,34.0,3,4,45,2,major,0,note,G5,G,G,0.0,5,79.0,7.0,0.25,146.66666666666708 313 | 311,Sati_Gymnopedie.mxl,34.0,3,4,45,2,major,0,note,F#5,F#,F,1.0,5,78.0,6.0,0.25,147.7777777777782 314 | 312,Sati_Gymnopedie.mxl,34.0,3,4,45,2,major,0,note,C#5,C#,C,1.0,5,73.0,1.0,0.25,148.8888888888893 315 | 313,Sati_Gymnopedie.mxl,34.0,3,4,45,2,major,0,rest,,,,,,,,0.25,146.66666666666708 316 | 314,Sati_Gymnopedie.mxl,34.0,3,4,45,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,147.7777777777782 317 | 315,Sati_Gymnopedie.mxl,34.0,3,4,45,2,major,0,note,C#4,C#,C,1.0,4,61.0,1.0,0.5,147.7777777777782 318 | 316,Sati_Gymnopedie.mxl,34.0,3,4,45,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,147.7777777777782 319 | 317,Sati_Gymnopedie.mxl,34.0,3,4,45,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,146.66666666666708 320 | 318,Sati_Gymnopedie.mxl,34.0,3,4,46,2,major,0,note,B4,B,B,0.0,4,71.0,11.0,0.25,150.00000000000043 321 | 319,Sati_Gymnopedie.mxl,34.0,3,4,46,2,major,0,note,C#5,C#,C,1.0,5,73.0,1.0,0.25,151.11111111111154 322 | 320,Sati_Gymnopedie.mxl,34.0,3,4,46,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.25,152.22222222222265 323 | 321,Sati_Gymnopedie.mxl,34.0,3,4,46,2,major,0,rest,,,,,,,,0.25,150.00000000000043 324 | 322,Sati_Gymnopedie.mxl,34.0,3,4,46,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,151.11111111111154 325 | 323,Sati_Gymnopedie.mxl,34.0,3,4,46,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,151.11111111111154 326 | 324,Sati_Gymnopedie.mxl,34.0,3,4,46,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,151.11111111111154 327 | 325,Sati_Gymnopedie.mxl,34.0,3,4,46,2,major,0,note,G2,G,G,0.0,2,43.0,7.0,0.75,150.00000000000043 328 | 326,Sati_Gymnopedie.mxl,34.0,3,4,47,2,major,0,note,A4,A,A,0.0,4,69.0,9.0,0.75,153.33333333333377 329 | 327,Sati_Gymnopedie.mxl,34.0,3,4,47,2,major,0,rest,,,,,,,,0.25,153.33333333333377 330 | 328,Sati_Gymnopedie.mxl,34.0,3,4,47,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,154.44444444444488 331 | 329,Sati_Gymnopedie.mxl,34.0,3,4,47,2,major,0,note,C#4,C#,C,1.0,4,61.0,1.0,0.5,154.44444444444488 332 | 330,Sati_Gymnopedie.mxl,34.0,3,4,47,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,154.44444444444488 333 | 331,Sati_Gymnopedie.mxl,34.0,3,4,47,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,153.33333333333377 334 | 332,Sati_Gymnopedie.mxl,34.0,3,4,48,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.75,156.6666666666671 335 | 333,Sati_Gymnopedie.mxl,34.0,3,4,48,2,major,0,rest,,,,,,,,0.25,156.6666666666671 336 | 334,Sati_Gymnopedie.mxl,34.0,3,4,48,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,157.77777777777823 337 | 335,Sati_Gymnopedie.mxl,34.0,3,4,48,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,157.77777777777823 338 | 336,Sati_Gymnopedie.mxl,34.0,3,4,48,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,157.77777777777823 339 | 337,Sati_Gymnopedie.mxl,34.0,3,4,48,2,major,0,note,G2,G,G,0.0,2,43.0,7.0,0.75,156.6666666666671 340 | 338,Sati_Gymnopedie.mxl,34.0,3,4,49,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.75,160.00000000000045 341 | 339,Sati_Gymnopedie.mxl,34.0,3,4,49,2,major,0,rest,,,,,,,,0.25,160.00000000000045 342 | 340,Sati_Gymnopedie.mxl,34.0,3,4,49,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,161.11111111111157 343 | 341,Sati_Gymnopedie.mxl,34.0,3,4,49,2,major,0,note,C#4,C#,C,1.0,4,61.0,1.0,0.5,161.11111111111157 344 | 342,Sati_Gymnopedie.mxl,34.0,3,4,49,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,161.11111111111157 345 | 343,Sati_Gymnopedie.mxl,34.0,3,4,49,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,160.00000000000045 346 | 344,Sati_Gymnopedie.mxl,34.0,3,4,50,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.75,163.3333333333338 347 | 345,Sati_Gymnopedie.mxl,34.0,3,4,50,2,major,0,rest,,,,,,,,0.25,163.3333333333338 348 | 346,Sati_Gymnopedie.mxl,34.0,3,4,50,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,164.4444444444449 349 | 347,Sati_Gymnopedie.mxl,34.0,3,4,50,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,164.4444444444449 350 | 348,Sati_Gymnopedie.mxl,34.0,3,4,50,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,164.4444444444449 351 | 349,Sati_Gymnopedie.mxl,34.0,3,4,50,2,major,0,note,G2,G,G,0.0,2,43.0,7.0,0.75,163.3333333333338 352 | 350,Sati_Gymnopedie.mxl,34.0,3,4,51,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.75,166.66666666666714 353 | 351,Sati_Gymnopedie.mxl,34.0,3,4,51,2,major,0,rest,,,,,,,,0.25,166.66666666666714 354 | 352,Sati_Gymnopedie.mxl,34.0,3,4,51,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,167.77777777777825 355 | 353,Sati_Gymnopedie.mxl,34.0,3,4,51,2,major,0,note,C#4,C#,C,1.0,4,61.0,1.0,0.5,167.77777777777825 356 | 354,Sati_Gymnopedie.mxl,34.0,3,4,51,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,167.77777777777825 357 | 355,Sati_Gymnopedie.mxl,34.0,3,4,51,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,166.66666666666714 358 | 356,Sati_Gymnopedie.mxl,34.0,3,4,52,2,major,0,rest,,,,,,,,0.25,170.00000000000048 359 | 357,Sati_Gymnopedie.mxl,34.0,3,4,52,2,major,0,note,F#5,F#,F,1.0,5,78.0,6.0,0.25,171.1111111111116 360 | 358,Sati_Gymnopedie.mxl,34.0,3,4,52,2,major,0,note,A5,A,A,0.0,5,81.0,9.0,0.25,172.2222222222227 361 | 359,Sati_Gymnopedie.mxl,34.0,3,4,52,2,major,0,rest,,,,,,,,0.25,170.00000000000048 362 | 360,Sati_Gymnopedie.mxl,34.0,3,4,52,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,171.1111111111116 363 | 361,Sati_Gymnopedie.mxl,34.0,3,4,52,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,171.1111111111116 364 | 362,Sati_Gymnopedie.mxl,34.0,3,4,52,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,171.1111111111116 365 | 363,Sati_Gymnopedie.mxl,34.0,3,4,52,2,major,0,note,G2,G,G,0.0,2,43.0,7.0,0.75,170.00000000000048 366 | 364,Sati_Gymnopedie.mxl,34.0,3,4,53,2,major,0,note,G5,G,G,0.0,5,79.0,7.0,0.25,173.33333333333383 367 | 365,Sati_Gymnopedie.mxl,34.0,3,4,53,2,major,0,note,F#5,F#,F,1.0,5,78.0,6.0,0.25,174.44444444444494 368 | 366,Sati_Gymnopedie.mxl,34.0,3,4,53,2,major,0,note,C#5,C#,C,1.0,5,73.0,1.0,0.25,175.55555555555605 369 | 367,Sati_Gymnopedie.mxl,34.0,3,4,53,2,major,0,rest,,,,,,,,0.25,173.33333333333383 370 | 368,Sati_Gymnopedie.mxl,34.0,3,4,53,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,174.44444444444494 371 | 369,Sati_Gymnopedie.mxl,34.0,3,4,53,2,major,0,note,C#4,C#,C,1.0,4,61.0,1.0,0.5,174.44444444444494 372 | 370,Sati_Gymnopedie.mxl,34.0,3,4,53,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,174.44444444444494 373 | 371,Sati_Gymnopedie.mxl,34.0,3,4,53,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,173.33333333333383 374 | 372,Sati_Gymnopedie.mxl,34.0,3,4,54,2,major,0,note,B4,B,B,0.0,4,71.0,11.0,0.25,176.66666666666717 375 | 373,Sati_Gymnopedie.mxl,34.0,3,4,54,2,major,0,note,C#5,C#,C,1.0,5,73.0,1.0,0.25,177.77777777777828 376 | 374,Sati_Gymnopedie.mxl,34.0,3,4,54,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.25,178.8888888888894 377 | 375,Sati_Gymnopedie.mxl,34.0,3,4,54,2,major,0,rest,,,,,,,,0.25,176.66666666666717 378 | 376,Sati_Gymnopedie.mxl,34.0,3,4,54,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,177.77777777777828 379 | 377,Sati_Gymnopedie.mxl,34.0,3,4,54,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,177.77777777777828 380 | 378,Sati_Gymnopedie.mxl,34.0,3,4,54,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,177.77777777777828 381 | 379,Sati_Gymnopedie.mxl,34.0,3,4,54,2,major,0,note,G2,G,G,0.0,2,43.0,7.0,0.75,176.66666666666717 382 | 380,Sati_Gymnopedie.mxl,34.0,3,4,55,2,major,0,note,A4,A,A,0.0,4,69.0,9.0,0.75,180.0000000000005 383 | 381,Sati_Gymnopedie.mxl,34.0,3,4,55,2,major,0,rest,,,,,,,,0.25,180.0000000000005 384 | 382,Sati_Gymnopedie.mxl,34.0,3,4,55,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,181.11111111111163 385 | 383,Sati_Gymnopedie.mxl,34.0,3,4,55,2,major,0,note,C#4,C#,C,1.0,4,61.0,1.0,0.5,181.11111111111163 386 | 384,Sati_Gymnopedie.mxl,34.0,3,4,55,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,181.11111111111163 387 | 385,Sati_Gymnopedie.mxl,34.0,3,4,55,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,180.0000000000005 388 | 386,Sati_Gymnopedie.mxl,34.0,3,4,56,2,major,0,note,C#5,C#,C,1.0,5,73.0,1.0,0.75,183.33333333333385 389 | 387,Sati_Gymnopedie.mxl,34.0,3,4,56,2,major,0,rest,,,,,,,,0.25,183.33333333333385 390 | 388,Sati_Gymnopedie.mxl,34.0,3,4,56,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,184.44444444444497 391 | 389,Sati_Gymnopedie.mxl,34.0,3,4,56,2,major,0,note,C#4,C#,C,1.0,4,61.0,1.0,0.5,184.44444444444497 392 | 390,Sati_Gymnopedie.mxl,34.0,3,4,56,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,184.44444444444497 393 | 391,Sati_Gymnopedie.mxl,34.0,3,4,56,2,major,0,note,F#2,F#,F,1.0,2,42.0,6.0,0.75,183.33333333333385 394 | 392,Sati_Gymnopedie.mxl,34.0,3,4,57,2,major,0,note,F#5,F#,F,1.0,5,78.0,6.0,0.75,186.6666666666672 395 | 393,Sati_Gymnopedie.mxl,34.0,3,4,57,2,major,0,rest,,,,,,,,0.25,186.6666666666672 396 | 394,Sati_Gymnopedie.mxl,34.0,3,4,57,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,187.7777777777783 397 | 395,Sati_Gymnopedie.mxl,34.0,3,4,57,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,187.7777777777783 398 | 396,Sati_Gymnopedie.mxl,34.0,3,4,57,2,major,0,note,F#4,F#,F,1.0,4,66.0,6.0,0.5,187.7777777777783 399 | 397,Sati_Gymnopedie.mxl,34.0,3,4,57,2,major,0,note,B1,B,B,0.0,1,35.0,11.0,0.75,186.6666666666672 400 | 398,Sati_Gymnopedie.mxl,34.0,3,4,58,2,major,0,note,E4,E,E,0.0,4,64.0,4.0,0.75,190.00000000000054 401 | 399,Sati_Gymnopedie.mxl,34.0,3,4,58,2,major,0,rest,,,,,,,,0.25,190.00000000000054 402 | 400,Sati_Gymnopedie.mxl,34.0,3,4,58,2,major,0,note,G3,G,G,0.0,3,55.0,7.0,0.5,191.11111111111165 403 | 401,Sati_Gymnopedie.mxl,34.0,3,4,58,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,191.11111111111165 404 | 402,Sati_Gymnopedie.mxl,34.0,3,4,58,2,major,0,note,E2,E,E,0.0,2,40.0,4.0,0.75,190.00000000000054 405 | 403,Sati_Gymnopedie.mxl,34.0,3,4,59,2,major,0,note,E4,E,E,0.0,4,64.0,4.0,0.75,193.33333333333388 406 | 404,Sati_Gymnopedie.mxl,34.0,3,4,59,2,major,0,rest,,,,,,,,0.25,193.33333333333388 407 | 405,Sati_Gymnopedie.mxl,34.0,3,4,59,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,194.444444444445 408 | 406,Sati_Gymnopedie.mxl,34.0,3,4,59,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,194.444444444445 409 | 407,Sati_Gymnopedie.mxl,34.0,3,4,59,2,major,0,note,G4,G,G,0.0,4,67.0,7.0,0.5,194.444444444445 410 | 408,Sati_Gymnopedie.mxl,34.0,3,4,59,2,major,0,note,E2,E,E,0.0,2,40.0,4.0,0.75,193.33333333333388 411 | 409,Sati_Gymnopedie.mxl,34.0,3,4,60,2,major,0,note,E4,E,E,0.0,4,64.0,4.0,0.75,196.66666666666723 412 | 410,Sati_Gymnopedie.mxl,34.0,3,4,60,2,major,0,rest,,,,,,,,0.25,196.66666666666723 413 | 411,Sati_Gymnopedie.mxl,34.0,3,4,60,2,major,0,note,F3,F,F,0.0,3,53.0,5.0,0.5,197.77777777777834 414 | 412,Sati_Gymnopedie.mxl,34.0,3,4,60,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,197.77777777777834 415 | 413,Sati_Gymnopedie.mxl,34.0,3,4,60,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,197.77777777777834 416 | 414,Sati_Gymnopedie.mxl,34.0,3,4,60,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,196.66666666666723 417 | 415,Sati_Gymnopedie.mxl,34.0,3,4,61,2,major,0,note,A4,A,A,0.0,4,69.0,9.0,0.25,200.00000000000057 418 | 416,Sati_Gymnopedie.mxl,34.0,3,4,61,2,major,0,note,B4,B,B,0.0,4,71.0,11.0,0.25,201.11111111111168 419 | 417,Sati_Gymnopedie.mxl,34.0,3,4,61,2,major,0,note,C5,C,C,0.0,5,72.0,0.0,0.25,202.2222222222228 420 | 418,Sati_Gymnopedie.mxl,34.0,3,4,61,2,major,0,rest,,,,,,,,0.25,200.00000000000057 421 | 419,Sati_Gymnopedie.mxl,34.0,3,4,61,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,201.11111111111168 422 | 420,Sati_Gymnopedie.mxl,34.0,3,4,61,2,major,0,note,C4,C,C,0.0,4,60.0,0.0,0.5,201.11111111111168 423 | 421,Sati_Gymnopedie.mxl,34.0,3,4,61,2,major,0,note,E4,E,E,0.0,4,64.0,4.0,0.5,201.11111111111168 424 | 422,Sati_Gymnopedie.mxl,34.0,3,4,61,2,major,0,note,A1,A,A,0.0,1,33.0,9.0,0.75,200.00000000000057 425 | 423,Sati_Gymnopedie.mxl,34.0,3,4,62,2,major,0,note,E5,E,E,0.0,5,76.0,4.0,0.25,203.3333333333339 426 | 424,Sati_Gymnopedie.mxl,34.0,3,4,62,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.25,204.44444444444503 427 | 425,Sati_Gymnopedie.mxl,34.0,3,4,62,2,major,0,note,B4,B,B,0.0,4,71.0,11.0,0.25,205.55555555555614 428 | 426,Sati_Gymnopedie.mxl,34.0,3,4,62,2,major,0,rest,,,,,,,,0.25,203.3333333333339 429 | 427,Sati_Gymnopedie.mxl,34.0,3,4,62,2,major,0,note,G3,G,G,0.0,3,55.0,7.0,0.5,204.44444444444503 430 | 428,Sati_Gymnopedie.mxl,34.0,3,4,62,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,204.44444444444503 431 | 429,Sati_Gymnopedie.mxl,34.0,3,4,62,2,major,0,note,E4,E,E,0.0,4,64.0,4.0,0.5,204.44444444444503 432 | 430,Sati_Gymnopedie.mxl,34.0,3,4,62,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,203.3333333333339 433 | 431,Sati_Gymnopedie.mxl,34.0,3,4,63,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.25,206.66666666666725 434 | 432,Sati_Gymnopedie.mxl,34.0,3,4,63,2,major,0,note,C5,C,C,0.0,5,72.0,0.0,0.25,207.77777777777837 435 | 433,Sati_Gymnopedie.mxl,34.0,3,4,63,2,major,0,note,B4,B,B,0.0,4,71.0,11.0,0.25,208.88888888888948 436 | 434,Sati_Gymnopedie.mxl,34.0,3,4,63,2,major,0,rest,,,,,,,,0.25,206.66666666666725 437 | 435,Sati_Gymnopedie.mxl,34.0,3,4,63,2,major,0,note,D3,D,D,0.0,3,50.0,2.0,0.5,207.77777777777837 438 | 436,Sati_Gymnopedie.mxl,34.0,3,4,63,2,major,0,note,G3,G,G,0.0,3,55.0,7.0,0.5,207.77777777777837 439 | 437,Sati_Gymnopedie.mxl,34.0,3,4,63,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,207.77777777777837 440 | 438,Sati_Gymnopedie.mxl,34.0,3,4,63,2,major,0,note,E4,E,E,0.0,4,64.0,4.0,0.5,207.77777777777837 441 | 439,Sati_Gymnopedie.mxl,34.0,3,4,63,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,206.66666666666725 442 | 440,Sati_Gymnopedie.mxl,34.0,3,4,64,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.75,210.0000000000006 443 | 441,Sati_Gymnopedie.mxl,34.0,3,4,64,2,major,0,rest,,,,,,,,0.25,210.0000000000006 444 | 442,Sati_Gymnopedie.mxl,34.0,3,4,64,2,major,0,note,C3,C,C,0.0,3,48.0,0.0,0.5,211.1111111111117 445 | 443,Sati_Gymnopedie.mxl,34.0,3,4,64,2,major,0,note,E3,E,E,0.0,3,52.0,4.0,0.5,211.1111111111117 446 | 444,Sati_Gymnopedie.mxl,34.0,3,4,64,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,211.1111111111117 447 | 445,Sati_Gymnopedie.mxl,34.0,3,4,64,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,211.1111111111117 448 | 446,Sati_Gymnopedie.mxl,34.0,3,4,64,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,210.0000000000006 449 | 447,Sati_Gymnopedie.mxl,34.0,3,4,65,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.5,213.33333333333394 450 | 448,Sati_Gymnopedie.mxl,34.0,3,4,65,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.25,215.55555555555617 451 | 449,Sati_Gymnopedie.mxl,34.0,3,4,65,2,major,0,rest,,,,,,,,0.25,213.33333333333394 452 | 450,Sati_Gymnopedie.mxl,34.0,3,4,65,2,major,0,note,C3,C,C,0.0,3,48.0,0.0,0.5,214.44444444444505 453 | 451,Sati_Gymnopedie.mxl,34.0,3,4,65,2,major,0,note,F#3,F#,F,1.0,3,54.0,6.0,0.5,214.44444444444505 454 | 452,Sati_Gymnopedie.mxl,34.0,3,4,65,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,214.44444444444505 455 | 453,Sati_Gymnopedie.mxl,34.0,3,4,65,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,214.44444444444505 456 | 454,Sati_Gymnopedie.mxl,34.0,3,4,65,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,213.33333333333394 457 | 455,Sati_Gymnopedie.mxl,34.0,3,4,66,2,major,0,note,E5,E,E,0.0,5,76.0,4.0,0.25,216.66666666666728 458 | 456,Sati_Gymnopedie.mxl,34.0,3,4,66,2,major,0,note,F5,F,F,0.0,5,77.0,5.0,0.25,217.7777777777784 459 | 457,Sati_Gymnopedie.mxl,34.0,3,4,66,2,major,0,note,G5,G,G,0.0,5,79.0,7.0,0.25,218.8888888888895 460 | 458,Sati_Gymnopedie.mxl,34.0,3,4,66,2,major,0,rest,,,,,,,,0.25,216.66666666666728 461 | 459,Sati_Gymnopedie.mxl,34.0,3,4,66,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,217.7777777777784 462 | 460,Sati_Gymnopedie.mxl,34.0,3,4,66,2,major,0,note,C4,C,C,0.0,4,60.0,0.0,0.5,217.7777777777784 463 | 461,Sati_Gymnopedie.mxl,34.0,3,4,66,2,major,0,note,F4,F,F,0.0,4,65.0,5.0,0.5,217.7777777777784 464 | 462,Sati_Gymnopedie.mxl,34.0,3,4,66,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,216.66666666666728 465 | 463,Sati_Gymnopedie.mxl,34.0,3,4,67,2,major,0,note,A5,A,A,0.0,5,81.0,9.0,0.25,220.00000000000063 466 | 464,Sati_Gymnopedie.mxl,34.0,3,4,67,2,major,0,note,C5,C,C,0.0,5,72.0,0.0,0.25,221.11111111111174 467 | 465,Sati_Gymnopedie.mxl,34.0,3,4,67,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.25,222.22222222222285 468 | 466,Sati_Gymnopedie.mxl,34.0,3,4,67,2,major,0,rest,,,,,,,,0.25,220.00000000000063 469 | 467,Sati_Gymnopedie.mxl,34.0,3,4,67,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,221.11111111111174 470 | 468,Sati_Gymnopedie.mxl,34.0,3,4,67,2,major,0,note,C4,C,C,0.0,4,60.0,0.0,0.5,221.11111111111174 471 | 469,Sati_Gymnopedie.mxl,34.0,3,4,67,2,major,0,note,E4,E,E,0.0,4,64.0,4.0,0.5,221.11111111111174 472 | 470,Sati_Gymnopedie.mxl,34.0,3,4,67,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,220.00000000000063 473 | 471,Sati_Gymnopedie.mxl,34.0,3,4,68,2,major,0,note,E5,E,E,0.0,5,76.0,4.0,0.25,223.33333333333397 474 | 472,Sati_Gymnopedie.mxl,34.0,3,4,68,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.25,224.44444444444508 475 | 473,Sati_Gymnopedie.mxl,34.0,3,4,68,2,major,0,note,B4,B,B,0.0,4,71.0,11.0,0.25,225.5555555555562 476 | 474,Sati_Gymnopedie.mxl,34.0,3,4,68,2,major,0,rest,,,,,,,,0.25,223.33333333333397 477 | 475,Sati_Gymnopedie.mxl,34.0,3,4,68,2,major,0,note,D3,D,D,0.0,3,50.0,2.0,0.5,224.44444444444508 478 | 476,Sati_Gymnopedie.mxl,34.0,3,4,68,2,major,0,note,G3,G,G,0.0,3,55.0,7.0,0.5,224.44444444444508 479 | 477,Sati_Gymnopedie.mxl,34.0,3,4,68,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,224.44444444444508 480 | 478,Sati_Gymnopedie.mxl,34.0,3,4,68,2,major,0,note,E4,E,E,0.0,4,64.0,4.0,0.5,224.44444444444508 481 | 479,Sati_Gymnopedie.mxl,34.0,3,4,68,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,223.33333333333397 482 | 480,Sati_Gymnopedie.mxl,34.0,3,4,69,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.75,226.6666666666673 483 | 481,Sati_Gymnopedie.mxl,34.0,3,4,69,2,major,0,rest,,,,,,,,0.25,226.6666666666673 484 | 482,Sati_Gymnopedie.mxl,34.0,3,4,69,2,major,0,note,C3,C,C,0.0,3,48.0,0.0,0.5,227.77777777777843 485 | 483,Sati_Gymnopedie.mxl,34.0,3,4,69,2,major,0,note,E3,E,E,0.0,3,52.0,4.0,0.5,227.77777777777843 486 | 484,Sati_Gymnopedie.mxl,34.0,3,4,69,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,227.77777777777843 487 | 485,Sati_Gymnopedie.mxl,34.0,3,4,69,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,227.77777777777843 488 | 486,Sati_Gymnopedie.mxl,34.0,3,4,69,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,226.6666666666673 489 | 487,Sati_Gymnopedie.mxl,34.0,3,4,70,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.5,230.00000000000065 490 | 488,Sati_Gymnopedie.mxl,34.0,3,4,70,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.25,232.22222222222288 491 | 489,Sati_Gymnopedie.mxl,34.0,3,4,70,2,major,0,rest,,,,,,,,0.25,230.00000000000065 492 | 490,Sati_Gymnopedie.mxl,34.0,3,4,70,2,major,0,note,C3,C,C,0.0,3,48.0,0.0,0.5,231.11111111111177 493 | 491,Sati_Gymnopedie.mxl,34.0,3,4,70,2,major,0,note,F#3,F#,F,1.0,3,54.0,6.0,0.5,231.11111111111177 494 | 492,Sati_Gymnopedie.mxl,34.0,3,4,70,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,231.11111111111177 495 | 493,Sati_Gymnopedie.mxl,34.0,3,4,70,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,231.11111111111177 496 | 494,Sati_Gymnopedie.mxl,34.0,3,4,70,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,230.00000000000065 497 | 495,Sati_Gymnopedie.mxl,34.0,3,4,71,2,major,0,note,G5,G,G,0.0,5,79.0,7.0,0.75,233.333333333334 498 | 496,Sati_Gymnopedie.mxl,34.0,3,4,71,2,major,0,rest,,,,,,,,0.25,233.333333333334 499 | 497,Sati_Gymnopedie.mxl,34.0,3,4,71,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.5,234.4444444444451 500 | 498,Sati_Gymnopedie.mxl,34.0,3,4,71,2,major,0,note,E4,E,E,0.0,4,64.0,4.0,0.5,234.4444444444451 501 | 499,Sati_Gymnopedie.mxl,34.0,3,4,71,2,major,0,note,G4,G,G,0.0,4,67.0,7.0,0.5,234.4444444444451 502 | 500,Sati_Gymnopedie.mxl,34.0,3,4,71,2,major,0,note,E2,E,E,0.0,2,40.0,4.0,0.75,233.333333333334 503 | 501,Sati_Gymnopedie.mxl,34.0,3,4,72,2,major,0,note,F5,F,F,0.0,5,77.0,5.0,0.75,236.66666666666734 504 | 502,Sati_Gymnopedie.mxl,34.0,3,4,72,2,major,0,rest,,,,,,,,0.25,236.66666666666734 505 | 503,Sati_Gymnopedie.mxl,34.0,3,4,72,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,237.77777777777845 506 | 504,Sati_Gymnopedie.mxl,34.0,3,4,72,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.5,237.77777777777845 507 | 505,Sati_Gymnopedie.mxl,34.0,3,4,72,2,major,0,note,F4,F,F,0.0,4,65.0,5.0,0.5,237.77777777777845 508 | 506,Sati_Gymnopedie.mxl,34.0,3,4,72,2,major,0,note,A4,A,A,0.0,4,69.0,9.0,0.5,237.77777777777845 509 | 507,Sati_Gymnopedie.mxl,34.0,3,4,72,2,major,0,note,E2,E,E,0.0,2,40.0,4.0,0.75,236.66666666666734 510 | 508,Sati_Gymnopedie.mxl,34.0,3,4,73,2,major,0,note,B4,B,B,0.0,4,71.0,11.0,0.25,240.00000000000068 511 | 509,Sati_Gymnopedie.mxl,34.0,3,4,73,2,major,0,note,C5,C,C,0.0,5,72.0,0.0,0.25,241.1111111111118 512 | 510,Sati_Gymnopedie.mxl,34.0,3,4,73,2,major,0,note,F5,F,F,0.0,5,77.0,5.0,0.25,242.2222222222229 513 | 511,Sati_Gymnopedie.mxl,34.0,3,4,73,2,major,0,rest,,,,,,,,0.25,240.00000000000068 514 | 512,Sati_Gymnopedie.mxl,34.0,3,4,73,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,241.1111111111118 515 | 513,Sati_Gymnopedie.mxl,34.0,3,4,73,2,major,0,note,C4,C,C,0.0,4,60.0,0.0,0.5,241.1111111111118 516 | 514,Sati_Gymnopedie.mxl,34.0,3,4,73,2,major,0,note,F4,F,F,0.0,4,65.0,5.0,0.5,241.1111111111118 517 | 515,Sati_Gymnopedie.mxl,34.0,3,4,73,2,major,0,note,E2,E,E,0.0,2,40.0,4.0,0.75,240.00000000000068 518 | 516,Sati_Gymnopedie.mxl,34.0,3,4,74,2,major,0,note,E5,E,E,0.0,5,76.0,4.0,0.25,243.33333333333402 519 | 517,Sati_Gymnopedie.mxl,34.0,3,4,74,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.25,244.44444444444514 520 | 518,Sati_Gymnopedie.mxl,34.0,3,4,74,2,major,0,note,C5,C,C,0.0,5,72.0,0.0,0.25,245.55555555555625 521 | 519,Sati_Gymnopedie.mxl,34.0,3,4,74,2,major,0,rest,,,,,,,,0.25,243.33333333333402 522 | 520,Sati_Gymnopedie.mxl,34.0,3,4,74,2,major,0,note,C4,C,C,0.0,4,60.0,0.0,0.5,244.44444444444514 523 | 521,Sati_Gymnopedie.mxl,34.0,3,4,74,2,major,0,note,E4,E,E,0.0,4,64.0,4.0,0.5,244.44444444444514 524 | 522,Sati_Gymnopedie.mxl,34.0,3,4,74,2,major,0,note,A4,A,A,0.0,4,69.0,9.0,0.5,244.44444444444514 525 | 523,Sati_Gymnopedie.mxl,34.0,3,4,74,2,major,0,note,E2,E,E,0.0,2,40.0,4.0,0.75,243.33333333333402 526 | 524,Sati_Gymnopedie.mxl,34.0,3,4,75,2,major,0,note,E5,E,E,0.0,5,76.0,4.0,0.25,246.66666666666737 527 | 525,Sati_Gymnopedie.mxl,34.0,3,4,75,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.25,247.77777777777848 528 | 526,Sati_Gymnopedie.mxl,34.0,3,4,75,2,major,0,note,C5,C,C,0.0,5,72.0,0.0,0.25,248.8888888888896 529 | 527,Sati_Gymnopedie.mxl,34.0,3,4,75,2,major,0,rest,,,,,,,,0.25,246.66666666666737 530 | 528,Sati_Gymnopedie.mxl,34.0,3,4,75,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.5,247.77777777777848 531 | 529,Sati_Gymnopedie.mxl,34.0,3,4,75,2,major,0,note,C4,C,C,0.0,4,60.0,0.0,0.5,247.77777777777848 532 | 530,Sati_Gymnopedie.mxl,34.0,3,4,75,2,major,0,note,F4,F,F,0.0,4,65.0,5.0,0.5,247.77777777777848 533 | 531,Sati_Gymnopedie.mxl,34.0,3,4,75,2,major,0,note,A4,A,A,0.0,4,69.0,9.0,0.5,247.77777777777848 534 | 532,Sati_Gymnopedie.mxl,34.0,3,4,75,2,major,0,note,E2,E,E,0.0,2,40.0,4.0,0.75,246.66666666666737 535 | 533,Sati_Gymnopedie.mxl,34.0,3,4,76,2,major,0,note,F4,F,F,0.0,4,65.0,5.0,0.75,250.0000000000007 536 | 534,Sati_Gymnopedie.mxl,34.0,3,4,76,2,major,0,rest,,,,,,,,0.25,250.0000000000007 537 | 535,Sati_Gymnopedie.mxl,34.0,3,4,76,2,major,0,note,A3,A,A,0.0,3,57.0,9.0,0.25,251.11111111111182 538 | 536,Sati_Gymnopedie.mxl,34.0,3,4,76,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.25,251.11111111111182 539 | 537,Sati_Gymnopedie.mxl,34.0,3,4,76,2,major,0,note,B3,B,B,0.0,3,59.0,11.0,0.25,252.22222222222294 540 | 538,Sati_Gymnopedie.mxl,34.0,3,4,76,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.25,252.22222222222294 541 | 539,Sati_Gymnopedie.mxl,34.0,3,4,76,2,major,0,note,G4,G,G,0.0,4,67.0,7.0,0.25,252.22222222222294 542 | 540,Sati_Gymnopedie.mxl,34.0,3,4,76,2,major,0,rest,,,,,,,,0.25,250.0000000000007 543 | 541,Sati_Gymnopedie.mxl,34.0,3,4,76,2,major,0,note,B2,B,B,0.0,2,47.0,11.0,0.25,251.11111111111182 544 | 542,Sati_Gymnopedie.mxl,34.0,3,4,76,2,major,0,note,E3,E,E,0.0,3,52.0,4.0,0.25,252.22222222222294 545 | 543,Sati_Gymnopedie.mxl,34.0,3,4,76,2,major,0,note,E2,E,E,0.0,2,40.0,4.0,0.75,250.0000000000007 546 | 544,Sati_Gymnopedie.mxl,34.0,3,4,77,2,major,0,note,C4,C,C,0.0,4,60.0,0.0,0.75,253.33333333333405 547 | 545,Sati_Gymnopedie.mxl,34.0,3,4,77,2,major,0,note,E4,E,E,0.0,4,64.0,4.0,0.75,253.33333333333405 548 | 546,Sati_Gymnopedie.mxl,34.0,3,4,77,2,major,0,note,A4,A,A,0.0,4,69.0,9.0,0.75,253.33333333333405 549 | 547,Sati_Gymnopedie.mxl,34.0,3,4,77,2,major,0,note,C5,C,C,0.0,5,72.0,0.0,0.75,253.33333333333405 550 | 548,Sati_Gymnopedie.mxl,34.0,3,4,77,2,major,0,note,A2,A,A,0.0,2,45.0,9.0,0.75,253.33333333333405 551 | 549,Sati_Gymnopedie.mxl,34.0,3,4,77,2,major,0,note,G3,G,G,0.0,3,55.0,7.0,0.75,253.33333333333405 552 | 550,Sati_Gymnopedie.mxl,34.0,3,4,78,2,major,0,note,D4,D,D,0.0,4,62.0,2.0,0.75,257.2463768115949 553 | 551,Sati_Gymnopedie.mxl,34.0,3,4,78,2,major,0,note,F4,F,F,0.0,4,65.0,5.0,0.75,257.2463768115949 554 | 552,Sati_Gymnopedie.mxl,34.0,3,4,78,2,major,0,note,A4,A,A,0.0,4,69.0,9.0,0.75,257.2463768115949 555 | 553,Sati_Gymnopedie.mxl,34.0,3,4,78,2,major,0,note,D5,D,D,0.0,5,74.0,2.0,0.75,257.2463768115949 556 | 554,Sati_Gymnopedie.mxl,34.0,3,4,78,2,major,0,note,D2,D,D,0.0,2,38.0,2.0,0.75,257.2463768115949 557 | 555,Sati_Gymnopedie.mxl,34.0,3,4,78,2,major,0,note,A2,A,A,0.0,2,45.0,9.0,0.75,257.2463768115949 558 | 556,Sati_Gymnopedie.mxl,34.0,3,4,78,2,major,0,note,D3,D,D,0.0,3,50.0,2.0,0.75,257.2463768115949 559 | --------------------------------------------------------------------------------