Created
July 11, 2023 14:01
-
-
Save anandology/9351a39163e7d84d7758572d420cf70a to your computer and use it in GitHub Desktop.
Joy of Music
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"id": "18053a74-6700-4000-984c-98daefef659a", | |
"metadata": {}, | |
"source": [ | |
"# Joy of Music" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "d51813db-d58d-49ee-b60f-dd77c133378e", | |
"metadata": { | |
"user_expressions": [] | |
}, | |
"source": [ | |
"An experiment to explore python programming through carnatic sangeetam." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"id": "3659c397-2009-42ba-b521-4f6020146a04", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Overwriting music.py\n" | |
] | |
} | |
], | |
"source": [ | |
"%%file music.py\n", | |
"\"\"\"Joy of music!\n", | |
"\n", | |
"Joy of music is small python library to play musical notes in a jupyter notebook.\n", | |
"\"\"\"\n", | |
"from IPython.display import DisplayHandle, Javascript\n", | |
"from time import sleep\n", | |
"\n", | |
"_display = DisplayHandle(\"music\")\n", | |
"\n", | |
"lib = Javascript(\"https://unpkg.com/[email protected]/build/Tone.js\")\n", | |
"_display.display(lib)\n", | |
"print(\"loaded tone.js library\")\n", | |
"\n", | |
"def play(note):\n", | |
" js = Javascript(f\"\"\"\n", | |
" const synth = new Tone.Synth().toDestination();\n", | |
" synth.triggerAttackRelease(\"{note}\", \"8n\");\n", | |
" \"\"\")\n", | |
" _display.update(js)\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"id": "a13ffa4d-92a1-4f48-9f3c-458068f79fe2", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"## Uncomment this if you want to reload the module\n", | |
"\n", | |
"# import sys\n", | |
"# sys.modules.pop(\"music\", None)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"id": "035aadcf-9d90-455a-95e7-761acdd71fe0", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"application/javascript": [ | |
"\n", | |
" const synth = new Tone.Synth().toDestination();\n", | |
" synth.triggerAttackRelease(\"C4\", \"8n\");\n", | |
" " | |
], | |
"text/plain": [ | |
"<IPython.core.display.Javascript object>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"loaded tone.js library\n" | |
] | |
} | |
], | |
"source": [ | |
"from music import play, sleep" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"id": "06c94dc6-7a6d-4ec2-8798-889838e5fb50", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"notes = {\n", | |
" \"s\": \"C4\",\n", | |
" \"r\": \"D4\",\n", | |
" \"g\": \"E4\",\n", | |
" \"m\": \"F4\",\n", | |
" \"p\": \"G4\",\n", | |
" \"d\": \"A4\",\n", | |
" \"n\": \"B4\",\n", | |
" \"S\": \"C5\"\n", | |
"}" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"id": "b1c26057-51ee-4069-a01f-6b26eb229518", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def play_swara(swara):\n", | |
" \"\"\"Play a swara of carnatic music.\n", | |
" \"\"\"\n", | |
" note = notes[swara]\n", | |
" play(note)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"id": "37eb8768-d44a-4d12-adce-1ef1be28a5fc", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"play_swara(\"s\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"id": "97611045-3c20-4a3d-978c-31898e5d9df0", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def play_swaras(swaras):\n", | |
" \"\"\"Play a list of swaras\"\"\"\n", | |
" for swara in swaras:\n", | |
" play_swara(swara)\n", | |
" sleep(0.5)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"id": "66196f34-163a-49dd-847d-c98e4298019e", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"play_swaras(\"srgrs\")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "5963d023-9880-45c0-adc6-eab29b7f0d56", | |
"metadata": { | |
"user_expressions": [] | |
}, | |
"source": [ | |
"Let's define some ragas." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"id": "5d0fd30b-1d2c-46ed-bce4-0b42d2334e5b", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"ragas = {\n", | |
" \"kalyani\": \"srgmpdnS\",\n", | |
" \"mohanam\": \"srgpdS\"\n", | |
"}" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"id": "10a4ac62-3e17-4ab8-9154-e3f7f7f19b14", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def aarohanam(raga):\n", | |
" swaras = ragas[raga]\n", | |
" play_swaras(swaras)\n", | |
"\n", | |
"def avarohanam(raga):\n", | |
" swaras = ragas[raga]\n", | |
" play_swaras(reversed(swaras))\n", | |
" \n", | |
"def janta_varusalu(raga):\n", | |
" swaras = ragas[raga]\n", | |
" janta_swaras = []\n", | |
" for s in swaras:\n", | |
" janta_swaras.append(s)\n", | |
" janta_swaras.append(s)\n", | |
" play_swaras(janta_swaras)\n", | |
" play_swaras(janta_swaras[::-1])\n", | |
"\n", | |
"def play_raga(raga):\n", | |
" aarohanam(raga)\n", | |
" avarohanam(raga)\n", | |
" janta_varusalu(raga)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"id": "470aff43-b5fe-4336-9dc6-01bef80002e5", | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [], | |
"source": [ | |
"play_raga(\"kalyani\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"id": "d4df543b-703a-4bc9-a210-349500b0ab18", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def flatten(nested_values):\n", | |
" result = []\n", | |
" for values in nested_values:\n", | |
" for v in values:\n", | |
" result.append(v)\n", | |
" return result\n", | |
" \n", | |
"def triplets(swaras):\n", | |
" return flatten(zip(swaras, swaras[1:], swaras[2:]))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"id": "a7edc9de-91d4-4f31-ac29-f2ecce4fce28", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"['s', 'r', 'g', 'r', 'g', 'm']" | |
] | |
}, | |
"execution_count": 13, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"triplets(\"srgm\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"id": "e88e1a91-30b4-4a56-9dca-1f252bd3f7d4", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"swaras = triplets(ragas[\"kalyani\"]) \n", | |
"play_swaras(swaras + swaras[::-1])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "96903794-05ff-49c6-8ed5-61df7077a05a", | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3 (ipykernel)", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.10.6" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 5 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment