{ "cells": [ { "cell_type": "markdown", "id": "11f63929-a2e8-43a1-95f0-28c8c0f56a60", "metadata": {}, "source": [ "# Symbols and notation\n", "\n", "Many of the aspects of maelzel.core's notation output can be customized. There are two main entry points for this: \n", "\n", "1. The method `setSymbol` which adds or modifies a Symbol to a Note/Chord\n", "2. `addSpanner` adds a line/slur/bracket to two or more notes. \n", "\n", "## Symbols / Properties\n", "\n", "Symbols are any elements/attributes used to customize the symbolic representation of music. A text expression, the notehead shape, an articulation: all these are symbols. Also properties (the color of a note, its size, etc) are seen as symbols. " ] }, { "cell_type": "code", "execution_count": 1, "id": "1a8da57c-7fbc-41bf-89ca-a2feb5d43f51", "metadata": {}, "outputs": [], "source": [ "from maelzel.core import *" ] }, { "cell_type": "markdown", "id": "119a26f7-754f-4fef-8666-2340098ec265", "metadata": {}, "source": [ "Many symbols can only be added to a note/chord (they are *note attached*)" ] }, { "cell_type": "code", "execution_count": 2, "id": "f4616448-8f75-43eb-842f-565c5aac0544", "metadata": {}, "outputs": [ { "ename": "ValueError", "evalue": "A does not accept note attached symbols", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[2], line 11\u001b[0m\n\u001b[1;32m 8\u001b[0m chain \u001b[38;5;241m=\u001b[39m Chain(notes)\n\u001b[1;32m 10\u001b[0m \u001b[38;5;66;03m# This will throw an error since a chain cannot have a text element, only an item of the chain\u001b[39;00m\n\u001b[0;32m---> 11\u001b[0m \u001b[43mchain\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43maddSymbol\u001b[49m\u001b[43m(\u001b[49m\u001b[43msymbols\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mText\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43merror\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n", "File \u001b[0;32m~/dev/python/maelzel/maelzel/core/mobj.py:1421\u001b[0m, in \u001b[0;36mMObj.addSymbol\u001b[0;34m(self, symbol, *args, **kws)\u001b[0m\n\u001b[1;32m 1417\u001b[0m symboldef \u001b[38;5;241m=\u001b[39m _symbols\u001b[38;5;241m.\u001b[39mmakeSymbol(symbol, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkws)\n\u001b[1;32m 1419\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(symbol, _symbols\u001b[38;5;241m.\u001b[39mNoteAttachedSymbol) \\\n\u001b[1;32m 1420\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_acceptsNoteAttachedSymbols:\n\u001b[0;32m-> 1421\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mA \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mtype\u001b[39m(\u001b[38;5;28mself\u001b[39m)\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m does not accept note attached symbols\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 1422\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msymbols \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 1423\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msymbols \u001b[38;5;241m=\u001b[39m [symboldef]\n", "\u001b[0;31mValueError\u001b[0m: A does not accept note attached symbols" ] } ], "source": [ "notes = [\n", " Note(60.5, dur=1.5, offset=2).setPlay(position=0), \n", " Note(70, dur=2.5).setPlay(position=1)\n", "]\n", "notes[0].addSymbol('color', 'blue')\n", "notes[1].addSymbol('color', 'red')\n", "\n", "chain = Chain(notes)\n", "\n", "# This will throw an error since a chain cannot have a text element, only an item of the chain\n", "chain.addSymbol(symbols.Text('error'))" ] }, { "cell_type": "markdown", "id": "0cdb070c-abf8-480b-a5a7-03fd180140c8", "metadata": {}, "source": [ "Instead, add it to the first event (note, chord, rest) of the chain" ] }, { "cell_type": "code", "execution_count": 3, "id": "2cab22a1-1ac9-49fb-aa7e-6ba390fb0828", "metadata": {}, "outputs": [ { "data": { "text/html": [ "Chain([4C+:1.5♩:offset=2:symbols=[Color(value=blue), Text('first', placement=above)], 4A#:2.5♩:symbols=[Color(value=red)]], dur=6)
\n", " " ], "text/plain": [ "Chain([4C+:1.5♩:offset=2:symbols=[Color(value=blue), Text('first', placement=above)], 4A#:2.5♩:symbols=[Color(value=red)]])" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chain.firstEvent().addSymbol(symbols.Text(\"first\"))\n", "chain" ] }, { "cell_type": "code", "execution_count": 4, "id": "323cee7e-79fc-4551-8eeb-583c21c14918", "metadata": {}, "outputs": [ { "data": { "text/html": [ "Chain([Rest:2♩, 4C+:1.5♩:offset=2:symbols=[Color(value=blue), Text('first', placement=above)], 4A#:2.5♩:symbols=[Color(value=red)]], dur=6)
\n", " " ], "text/plain": [ "Chain([Rest:2♩, 4C+:1.5♩:offset=2:symbols=[Color(value=blue), Text('first', placement=above)], 4A#:2.5♩:symbols=[Color(value=red)]])" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chain = chain.copy()\n", "chain.fillGaps()\n", "chain.firstEvent().addSymbol(symbols.Text('start'))\n", "chain" ] }, { "cell_type": "markdown", "id": "a25ed63f-487e-4e0d-b44f-335da6164d50", "metadata": {}, "source": [ "Calls to `addSymbol` can be chained. Also, a Symbol itself can be used as argument" ] }, { "cell_type": "code", "execution_count": 5, "id": "e3210f8c-6fc0-4c90-99f2-723eacc134f8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[Notehead(color=red, size=1.4), Accidental(parenthesis=True), Articulation(kind=accent)]\n" ] }, { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": { "image/png": { "width": 144 } }, "output_type": "display_data" } ], "source": [ "from maelzel.core import symbols \n", "\n", "n = Note(60.5, dur=0.5)\n", "\n", "n.addSymbol('notehead', color='red', size=1.4).addSymbol('accidental', parenthesis=True)\n", "n.addSymbol(symbols.Articulation('accent'))\n", "print(n.symbols)\n", "n.show()" ] }, { "cell_type": "markdown", "id": "26842cd5-34a9-4b3a-9a82-0d12a89473b8", "metadata": {}, "source": [ "Notice the difference between resizing the notehead alone and resizing the note itself" ] }, { "cell_type": "code", "execution_count": 6, "id": "9ac73c6b-040a-4071-ab1a-ad494435aa65", "metadata": {}, "outputs": [ { "data": { "text/html": [ "4C+:0.5♩:symbols=[SizeFactor(value=1.4), Accidental(parenthesis=True), Articulation(kind=accent)]
\n", " " ], "text/plain": [ "4C+:0.5♩:symbols=[SizeFactor(value=1.4), Accidental(parenthesis=True), Articulation(kind=accent)]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n = Note(60.5, dur=0.5)\n", "n.addSymbol('sizefactor', 1.4)\n", "n.addSymbol('accidental', parenthesis=True)\n", "n.addSymbol('articulation', 'accent')\n", "n" ] }, { "cell_type": "markdown", "id": "3b977c88-968f-4efd-8c21-84c33e2085bb", "metadata": {}, "source": [ "Some symbols (like size or color) are exclusive, others can be accumulated" ] }, { "cell_type": "markdown", "id": "fe30ae7c-4d10-4eab-9cdc-1f64bbf39cee", "metadata": {}, "source": [ "| Symbol | Exclusive? |\n", "|--------------|------------|\n", "| Color | Yes |\n", "| SizeFactor | Yes |\n", "| Articulation | Yes |\n", "| Notehead | Yes |\n", "| Text | No |\n", "\n", "**NB**: dynamics are not symbols. They are treated as a constituent part of a note/chord\n", "\n", "Color is exclusive. Only the last call to `setSymbol('color', ...)` has effect, the previous ones are overwritten " ] }, { "cell_type": "code", "execution_count": 7, "id": "e78cc698-2b68-467e-ac73-5d609a5f31a7", "metadata": {}, "outputs": [ { "data": { "text/html": [ "4G+:2♩:symbols=[Color(value=red)]
\n", " " ], "text/plain": [ "4G+:2♩:symbols=[Color(value=red)]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Note(\"4G+\", dur=2, dynamic='ff').addSymbol('color', 'blue').addSymbol('color', 'red')" ] }, { "cell_type": "markdown", "id": "81e55a11-17c3-4987-92c0-9811bc05f8c7", "metadata": {}, "source": [ "Text symbols, on the other hand, can be accumulated (notice the order of appearance)" ] }, { "cell_type": "code", "execution_count": 8, "id": "fd3df5fb-3719-4e4d-805a-807816745951", "metadata": {}, "outputs": [ { "data": { "text/html": [ "4G+:2♩:symbols=[Text('text1', placement=above), Text('text2', placement=above)]
\n", " " ], "text/plain": [ "4G+:2♩:symbols=[Text('text1', placement=above), Text('text2', placement=above)]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Note(\"4G+\", dur=2).addSymbol(symbols.Text('text1')).addSymbol(symbols.Text('text2'))" ] }, { "cell_type": "code", "execution_count": 9, "id": "5dde6c9f-cc59-44a8-a547-76956d984e83", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": { "image/png": { "width": 683 } }, "output_type": "display_data" }, { "data": { "text/html": [ "OfflineRenderer(outfile=\"/home/em/.local/share/maelzel/recordings/rec-2023-03-28T12:04:03.761.wav\", 1 channels, 14.00 secs, 44100 Hz)
\n", "
\n", " \n", " " ], "text/plain": [ "OfflineRenderer(sr=44100)" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from IPython.display import display \n", "\n", "with ScoreStruct(timesig='5/8', tempo=80):\n", " ch = Chain([Note(60+m*0.25, dur='3/4') for m in range(24)])\n", " ch.addSymbol('color', '#00A0A0')\n", " ch.setPlay(fade=0, instr='piano')\n", " for n in ch:\n", " n.setPlay(gain=0.3)\n", " for n in ch[::3]:\n", " n.addSymbol('articulation', 'accent')\n", " n.setPlay(gain=0.9)\n", " ch.show()\n", " display(ch.rec(extratime=0.5, nchnls=1))\n" ] }, { "cell_type": "code", "execution_count": 10, "id": "4608ac20-0f65-4e97-a7dd-bea9a14a9ead", "metadata": {}, "outputs": [ { "data": { "text/html": [ "Chain([4C:0.5♩, 4C#:0.5♩, 4D:0.5♩, 4D#:0.5♩, 4E:0.5♩, 4F:0.5♩, 4F#:0.5♩, 4G:0.5♩, 4G#:0.5♩, 4A:0.5♩, …], dur=6)
\n", " " ], "text/plain": [ "Chain([4C:0.5♩, 4C#:0.5♩, 4D:0.5♩, 4D#:0.5♩, 4E:0.5♩, 4F:0.5♩, 4F#:0.5♩, 4G:0.5♩, 4G#:0.5♩, 4A:0.5♩, …])" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ch = Chain([Note(m, dur=0.5) for m in range(60, 72)])\n", "ch.addSymbol('notehead', 'square', color='#c02020')\n", "ch" ] }, { "cell_type": "code", "execution_count": 11, "id": "9efc45ee-1e16-47a3-8f4b-40854e0a368a", "metadata": {}, "outputs": [ { "data": { "text/html": [ "Chain([4C:0.25♩:symbols=[Notehead(color=#000000, size=1.5)], 4C#:0.25♩:symbols=[Notehead(color=#0a0a0a, size=1.41667)], 4D:0.25♩:symbols=[Notehead(color=#151515, size=1.33333)], 4D#:0.25♩:symbols=[Notehead(color=#1f1f1f, size=1.25)], 4E:0.25♩:symbols=[Notehead(color=#2a2a2a, size=1.16667)], 4F:0.25♩:symbols=[Notehead(color=#353535, size=1.08333)], 4F#:0.25♩:symbols=[Notehead(color=#3f3f3f)], 4G:0.25♩:symbols=[Notehead(color=#4a4a4a, size=0.916667)], 4G#:0.25♩:symbols=[Notehead(color=#555555, size=0.833333)], 4A:0.25♩:symbols=[Notehead(color=#5f5f5f, size=0.75)], …], dur=3)
\n", " " ], "text/plain": [ "Chain([4C:0.25♩:symbols=[Notehead(color=#000000, size=1.5)], 4C#:0.25♩:symbols=[Notehead(color=#0a0a0a, size=1.41667)], 4D:0.25♩:symbols=[Notehead(color=#151515, size=1.33333)], 4D#:0.25♩:symbols=[Notehead(color=#1f1f1f, size=1.25)], 4E:0.25♩:symbols=[Notehead(color=#2a2a2a, size=1.16667)], 4F:0.25♩:symbols=[Notehead(color=#353535, size=1.08333)], 4F#:0.25♩:symbols=[Notehead(color=#3f3f3f)], 4G:0.25♩:symbols=[Notehead(color=#4a4a4a, size=0.916667)], 4G#:0.25♩:symbols=[Notehead(color=#555555, size=0.833333)], 4A:0.25♩:symbols=[Notehead(color=#5f5f5f, size=0.75)], …])" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def rgbtohex(r, g, b):\n", " return '#%02x%02x%02x'% (r, g, b)\n", " \n", "ch = Chain([Note(m, 0.25) for m in range(60, 72)])\n", "for i, n in enumerate(ch):\n", " di = i/len(ch)\n", " r = di*0.5\n", " col = rgbtohex(int(255*r), int(255*r), int(255*r))\n", " n.addSymbol('notehead', color=col, size=0.5+(1-di)*1.0)\n", "ch" ] } ], "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.7" } }, "nbformat": 4, "nbformat_minor": 5 }