{ "cells": [ { "cell_type": "markdown", "id": "c08ee1de-49df-4749-b3b3-bd73ea973ab1", "metadata": {}, "source": [ "# Workspace\n", "\n", "A workspace contains the current state: the *active config*, the *active scorestrucutre*,\n", "a playback engine, etc. Many actions, like note playback, notation rendering, etc.,\n", "use the active workspace to determine tempo, score structure, default playback instrument,\n", "etc.\n", "\n", "\n", "## Contents\n", "\n", "* [The active workspace](#The-active-workspace)\n", "* [Parts of a Workspace](#Parts-of-a-Workspace)\n", " * [Active Config](#The-active-Config)\n", " * [Environment](#Environment)\n", " * [Dynamics](#Dynamics)\n", "* [Testing Dynamics: Berio's \"O King\"](#Testing-dynamics)" ] }, { "cell_type": "code", "execution_count": 1, "id": "06b761da-732e-496a-b5a5-3d7f34b967ca", "metadata": {}, "outputs": [], "source": [ "from maelzel.core import *\n", "from IPython.display import display" ] }, { "cell_type": "markdown", "id": "32921eb1-12db-46b9-8065-4a468a6b2b6a", "metadata": {}, "source": [ "## The active workspace\n", "\n", "To customize a Workspace for a specific task there are three slightly different methods:\n", "\n", "### 1. Modify the active Workspace\n", "\n", "We modify the workspace by modifying its configuration" ] }, { "cell_type": "code", "execution_count": 2, "id": "fd496b30-9434-4ff9-9874-a1d822e56fc1", "metadata": {}, "outputs": [], "source": [ "w = getWorkspace()\n", "w.config['play.numChannels'] = 4\n", "w.config['show.pngResolution'] = 300\n", "w.config['quant.complexity'] = 'high'\n" ] }, { "cell_type": "markdown", "id": "9db8ceed-085c-4c6c-8ee1-621d57e94e48", "metadata": {}, "source": [ "### 2. Create a new config\n", "\n", "We can customize the workspace by setting a new configuration" ] }, { "cell_type": "code", "execution_count": 3, "id": "0d9ec798-6b69-4c96-8516-a1e1ce058b60", "metadata": {}, "outputs": [], "source": [ "w = getWorkspace()\n", "w.config = CoreConfig({'play.numChannels': 4, 'quant.complexity': 'high'})" ] }, { "cell_type": "markdown", "id": "ae567433-6b62-4186-80c5-2b4b26ecd711", "metadata": {}, "source": [ "This is the same as creating a new `CoreConfig` with `active=True`" ] }, { "cell_type": "code", "execution_count": 4, "id": "ce77a6bf-d049-498e-a65a-56f13252ac2c", "metadata": {}, "outputs": [], "source": [ "config = CoreConfig({'quant.complexity': 'low'}, active=True)\n", "assert config is Workspace.active.config" ] }, { "cell_type": "markdown", "id": "f6c91b1f-a0e7-4084-a289-53c0c9cb7948", "metadata": {}, "source": [ "### 3. Create a new Workspace with the needed customizations" ] }, { "cell_type": "code", "execution_count": 5, "id": "c7f30ba7-219e-4693-ba87-3840714b143d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Workspace(scorestruct=ScoreStruct(3/4, tempo=72), config={'show.pngResolution': 300, 'play.instr': '.piano', 'play.numChannels': 4}, dynamicCurve=DynamicCurve(shape=expon(0.3), mindb=-60.0, maxdb=0.0))" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "w = Workspace(scorestruct=ScoreStruct((3, 4), tempo=72),\n", " updates={'play.numChannels': 4,\n", " 'show.pngResolution': 300,\n", " 'quant.complexity': 'high'}, active=True)\n", "w" ] }, { "cell_type": "markdown", "id": "cca5e5f3-d563-474d-8bd9-28691311f628", "metadata": {}, "source": [ "### 4. Temporary Workspace (as context manager)" ] }, { "cell_type": "code", "execution_count": 6, "id": "18f21add-deda-4773-a20c-c828f51ed0be", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": { "image/png": { "width": 445.5 } }, "output_type": "display_data" }, { "data": { "text/html": [ "OfflineRenderer(outfile=\"/home/em/.local/share/maelzel/recordings/rec-2025-09-28T18:46:40.879.wav\", 1 channels, 5.30 secs, 44100 Hz)
Soundfile: '/home/em/.local/share/maelzel/recordings/rec-2025-09-28T18:46:40.879.wav', duration: 5.3, sr: 44100, numchannels: 1)
\n", "\n", " \n", "
\n", "\n", " \n", " " ], "text/plain": [ "OfflineRenderer(sr=44100)" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "with Workspace(scorestruct=ScoreStruct((3, 4), tempo=72)):\n", " scale = Chain(Note(m, dur=0.5) for m in range(60, 72))\n", " scale.show()\n", " display(scale.rec(instr='.piano', nchnls=1, sustain=0.2, fade=(0, 0.1)))" ] }, { "cell_type": "markdown", "id": "dcafc102-d23b-4ccc-a300-68892cfeee3c", "metadata": {}, "source": [ "-----\n", "\n", "## Parts of a Workspace\n", "\n", "The workspace bundles the different elements which determine playback, notation and general behaviour of **maelzel.core**\n", "\n", "* `.config`: holds the active configuration\n", "* `.scorestruct`: the active score structure\n", "* `.dynamicCurve`: determines the mapping between amplitude and musical dynamic. This is used for playback and transcription\n", "* `.a4`: the reference frequency for A4\n", "* `.renderer`: used internally when rendering offline. When an object (note, chord, voice, …) is played it uses this attribute to check how to route the generated playback events\n", "\n", "### The active Config\n", "\n", "The `.config` attribute of the active Workspace holds the active configuration. This is an instance of `CoreConfig`, which is itself a subclass of `dict` and holds defaults and customizations regarding playback, notation, etc" ] }, { "cell_type": "code", "execution_count": 7, "id": "d1cc3220-c862-4c68-b947-4408baa6959d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "19 35\n" ] }, { "data": { "text/html": [ "

CoreConfig: maelzel:core


KeyValueTypeDescr
A4442between 10 - 10000Freq. of A4. Normal values are between 440-443, but any value can be used
chordAdjustGainTruetype: boolLimit the gain of a chord according to the number of notes, to prevent clipping. Only used if notes don't have an explicit amplitude
dynamicCurveDynamicsppp pp p mp mf f ff ffftype: strPossible dynamic steps. A str with all dynamic steps, sorted from soft to loud
dynamicCurveMaxdb0between -160 - 0Amplitude in dB corresponding to the loudest dynamic
dynamicCurveMindb-60between -160 - 0Amplitude in dB corresponding to the softest dynamic
dynamicCurveShapeexpon(0.3)type: strShape used to convert dynamics to amplitudes. Normally an exponential curve, given as 'expon(exp)'. exp < 1 results in more resolution for soft dynamics
enharmonic.horizontalWeight1type: intWeight of the horizontal dimension (note sequences) when evaluating an enharmonic variant
enharmonic.verticalWeight0.5type: floatWeight of the vertical dimension (notes within a chord) for enharmonic spelling
fixStringNotenamesFalsetype: boolFix pitches given as notenames at the spelling given. False: respell for better readability within the context. Pitches as midi or frequency are always respelled
htmlThemelight{dark, light}Theme used when displaying html inside jupyter
jupyterReprShowTruetype: boolUse html as repr within jupyter. If False, .show needs to be called explicitely to render notation
lilypondpathtype: strPath to the lilypond binary. If set, it must be an absolute, existing path. Only needed if using a specific lilypond installation (lilypond is auto-installed if not found)
musescorepathtype: strCommand to use when calling MuseScore. For macOS users: it must be an absolute path pointing to the actual binary inside the .app bundle
openImagesInExternalAppFalsetype: boolForce opening images with an external tool, even when inside a Jupyter notebook
play.backenddefault{alsa, auhal, default, jack, pa_cb, portaudio, pulse}backend used for playback
play.defaultAmplitude1.0between 0 - 1Default amplitude for a Note/Chord, only used if play.useDynamics is False
play.defaultDynamicf{f, ff, fff, ffff, mf, mp, p, pp, ppp, pppp}Dynamic of a Note/Chord, only used if play.useDynamics is True. Any event with an amplitude uses that value instead
play.engineNamemaelzel.coretype: strName of the play engine used
play.fade0.02type: floatDefault fade time
play.fadeShapecos{cos, linear, scurve}Curve-shape used for fading in/out
play.gain1.0between 0 - 1Default gain used when playing/recording
play.generalMidiSoundfonttype: strPath to a soundfont (sf2 file) with a general midi mapping
play.graceDuration1/14type: (int, float, str)Duration assigned to a gracenote for playback (in quarternotes)
play.instr.pianotype: str | default: sinDefault instrument used for playback. A list of available instruments can be queried via `presetManager.definedPresets()`.
play.numChannels4between 1 - 128 | default: 2Default number of playback channels
play.pitchInterpollinear{cos, linear}Curve shape for interpolating between pitches
play.schedLatency0.05type: floatLatency when scheduling events to ensure time precission
play.soundfontAmpDiv16384type: intA divisor used to scale the amplitude of soundfonts to a range 0-1
play.soundfontFindPeakAOTFalsetype: boolTrue: find the peak of a soundfont to adjust its normalization at the moment an soundfont preset is defined
play.soundfontInterpollinear{cubic, linear}Interpolation used when reading sample data from a soundfont.
play.unschedFadeout0.05type: floatFade out when stopping a note
play.useDynamicsTruetype: boolAny note/chord with a set dynamic will use dynamics for playback if no explicit amplitude is set
play.verboseFalsetype: boolTrue: outputs extra debugging information regarding playback
quant.beatWeightTempoThresh52type: int
quant.breakBeatsweak{all, none, strong, weak}Level at which to break syncopations. \"all\": break all syncopations; \"weak\": break syncopations over weak beats; \"strong\": only break syncopations at strong beats; \"none\": don´t break syncopations
quant.complexityhigh{high, highest, low, lowest, medium}Complexity used for notation.
quant.gridWeightNonebetween 0 - 10Weight applied to the time quantization error. Higher values result in more accurate quantization, at the cost of complexity. None sets this value from the complexity preset (quant.complexity)
quant.nestedTupletsNone{False, None, True}Allow nested tuplets when quantizing. None: follow the complexity preset (quant.complexity). The musescore backend cannot parse nested tuplets from musicxml atm
quant.nestedTupletsMusicxmlFalsetype: boolFalse: no nested tuplets are used for musicxml. The musescore backend cannot parse nested tuplets properly from mxml. Nested tuplets are used for other formats if \"quant.nestedTuplets\" = True
quant.subdivTempoThresh96type: int
quant.syncopExcludeSymDurs(5, 7, 15)type: tupleDurations with a numerator in this list cannot be placed across a beat. A value of (7, 15), for example, excludes double and trippled dotted notes
quant.syncopMaxAsymmetry3between 1 - 99Max. asymmetry of a syncopation. For notes across beats, this sets the max. allowed asymmetry across the beat, as a ratio longest:shortest part across the beat. A note exactly across the beat has an asymmetry of 1
quant.syncopMinFraction1/6type: (str, float, Rational)Min. duration of a syncopation as a ratio of the beat. Any syncopation shorter is broken and its parts tied, to prevent complex syncopations
quant.syncopPartMinFraction1/10type: strMin. duration of any part of a syncopation, as a fraction of the beat. A syncopation consistings of two parts, one left and one right to the beat boundary
rec.blockingTruetype: boolShould recording be blocking or should be done async?
rec.extratime0.0between 0.0 - infDefault extratime added when recording
rec.ksmps64{1, 16, 32, 64, 128, 256}Samples per cycle when rendering offline (passed as ksmps to csound)
rec.numChannels2between 1 - 128Number of channels when rendering to disk
rec.pathtype: strPath used to save soundfiles when rendering offline. Otherwise the value returned by `recordPath` is used
rec.sr44100{44100, 48000, 88200, 96000, 192000}Sample rate used when rendering offline
rec.verboseFalsetype: boolShow debug output when calling csound as a subprocess
reprDurationAsFractionTruetype: boolShow durations as fractions instead of floats
reprShowFreqFalsetype: boolShow frequency when printing a Note in the console
reprUnicodeAccidentalsTrue{False, full, simple, True}Use unicode accidentals for representation of notes
reprUnicodeFractionsFalsetype: boolShow fractions (for durations/offsets) as unicode glyphs. Not all fonts have support for this
semitoneDivisions4{1, 2, 4}Number of divisions/semitone used for notation (2=quarter-tones, 4=eighth-tones)
show.absOffsetWhenDetachedFalsetype: boolUse the abs. offset of an object, even when shown detached from its parent
show.arpeggiateChordauto{auto, False, True}Display chords as an arpeggio. In auto mode, only arpeggiate when needed
show.arpeggioDuration0.5type: floatDuration used for individual notes when rendering a chord as arpeggio
show.autoClefChangesTruetype: boolAdd clef changes if needed. Otherwise, one clef is determined for each part and is not changed along the part.
show.backendlilypond{lilypond, musicxml}Method used when rendering notation
show.cacheImagesTruetype: boolTrue: cache rendered images. Set it to False for debugging. call `resetImageCache()` to reset manually
show.centSep,type: strSeparator used when displaying multiple cents deviation (in a chord)
show.centsTruetype: boolShow cents deviation as text when rendering notation
show.centsTextSnap2between 0 - 50Notes within this number of cents from a quantized pitchdon´t need a text annotation (see `show.cents`)
show.centsTextStylefontsize=6; placement=belowtype: strStyle used for cents annotations. A list of key=value pairs, separated by ;. Keys: fontsize, box (rectangle, square, circle), placement (above, below), italic, bold. Example: \"fontsize=12; italic; box=square\"
show.clefChangesWindow1type: intWhen adding automatic clef changes, use this window size (number of elements per evaluation)
show.clefSimplify0.0between 0 - 10000Simplifie automatic clef changes. Use higher values to limit clef changes
show.clipNoteheadShapesquare{cluster, cross, normal, rectangle, rhombus, slash, square, triangle}Notehead shape to use for clips
show.dynamicFromAmplitudeFalsetype: boolIf an object has an amplitude but no explicit dynamic, add a dynamic according to the amplitude
show.flagStylestraight{flat, normal, straight}Flag style, at the moment only valid in lilypond
show.formatpng{pdf, png, repr}Used when no explicit format is passed to .show
show.glissHideTiedNotesTruetype: boolHide tied notes when part of a gliss.
show.glissLineThickness2{1, 2, 3, 4}Line thikness for glissandi. The value is abstract, it isup to the renderer to interpret it
show.glissLineTypesolid{solid, wavy}Default line type for glissandi
show.glissStemlessFalsetype: boolWhen the end pitch of a gliss. is shown as gracenote, make this stemless
show.hideRedundantDynamicsTruetype: boolHide redundant dynamics within a voice
show.horizontalSpacemedium{default, large, medium, small, xlarge}Hint to adjust horizontal spacing, the result depends on format and backend
show.jupyterMaxImageWidth1000type: intMax. width in pixels for images in a jupyter notebook
show.keepClefBias2.0type: floatThe higher this value, the more likely it is to keep the previous clef during automatic clef changes
show.labelStylefontsize=9; placement=abovetype: strStyle used for labelsA list of key=value pairs, separated by ;. Keys: fontsize, box (rectangle, square, circle), placement (above, below), italic, bold. Example: \"fontsize=12; italic; box=square\"
show.lilypondGlissMinLength5type: intMin. length of a glissando in points. Increase this value if gliss. linesare hidden or too short
show.lilypondPngStaffsizeScale1.5type: floatFactor applied to the staffsize when rendering to png via lilypond. Useful if images are too small within jupyter
show.measureLabelStylebox=rectangle; fontsize=12type: strStyle for measure annotations. A list of key=value pairs separated by ;. Keys: fontsize, box (rectangle, square, circle), placement (above, below), italic, bold. Example: \"fontsize=12; italic; box=square\"
show.musicxmlFontScaling1.0type: floatScaling factor applied to font sizes when rendering to musicxml
show.pageMarginMillim4between 0 - 1000Page margin in mm
show.pageOrientationportrait{landscape, portrait}Page orientation when rendering to pdf
show.pageSizea4{a2, a3, a4}Page size when rendering to pdf
show.pngResolution300{100, 200, 300, 600, 1200} | default: 200DPI used when rendering to png
show.proportionalDuration1/24type: strWhen using proportional spacing, the lower this value, the longer the space taken by each note. This corresponds to the value as used by lilypond. See also: https://lilypond.org/doc/v2.23/Documentation/notation/proportional-notation
show.referenceStaffsize12.0type: floatStaff size used as reference. This allows to use staff size as a generic indicator for score scale across backends
show.rehearsalMarkStylebox=rectangle; fontsize=13; boldtype: strStyle for rehearsal marks. A list of key=value pairs, separated by \";\". Keys: fontsize, box (rectangle, square, circle), placement (above, below), italic, bold. Example: \"fontsize=12; italic; box=rectangle\"
show.respellPitchesTruetype: boolFind best enharmonic spelling within the context.
show.scaleFactor0.75type: floatAffects the size of the generated image when using png format
show.scaleFactorMusicxml0.8type: floatApply a scaling factor to images rendered via musicxml
show.spacingnormal{normal, strict, uniform}Horizontal spacing used. \"normal\": traditional spacing; \"uniform\": proportional spacing with uniform stretching; \"strict\": proportional spacing with strict placement (clef changes and bar lines don´t add spacing andmight overlap)
show.staffSize10.0type: floatSize of a staff, in points
show.voiceMaxStaves2between 1 - 4Max. number of staves per voice when showing a Voice as notation
show.warnIfEmptyTruetype: boolTrue: warn if an object did not produce any scoring parts
soundfilePlotHeight3type: intHeight used for plotting soundfiles. This is used, for example, to set the figsize in matplotlib plots used inline within Jupyter.
splitAcceptableDeviation4type: intWhen splitting notes between staves, notes within this range of the split point will be grouped together if they all fit
" ], "text/plain": [ "Config: maelzel:core\n", "------------------------------------ ------------------- -----------------------------------\n", "A4 442 between 10 - 10000\n", " Freq. of A4. Normal values are\n", " between 440-443, but any value can\n", " be used\n", "chordAdjustGain True type: bool\n", " Limit the gain of a chord according\n", " to the number of notes, to prevent\n", " clipping. Only used if notes don't\n", " have an explicit amplitude\n", "dynamicCurveDynamics ppp pp p mp mf f ff type: str\n", " fff\n", " Possible dynamic steps. A str with\n", " all dynamic steps, sorted from soft\n", " to loud\n", "dynamicCurveMaxdb 0 between -160 - 0\n", " Amplitude in dB corresponding to\n", " the loudest dynamic\n", "dynamicCurveMindb -60 between -160 - 0\n", " Amplitude in dB corresponding to\n", " the softest dynamic\n", "dynamicCurveShape expon(0.3) type: str\n", " Shape used to convert dynamics to\n", " amplitudes. Normally an exponential\n", " curve, given as 'expon(exp)'. exp <\n", " 1 results in more resolution for\n", " soft dynamics\n", "enharmonic.horizontalWeight 1 type: int\n", " Weight of the horizontal dimension\n", " (note sequences) when evaluating an\n", " enharmonic variant\n", "enharmonic.verticalWeight 0.5 type: float\n", " Weight of the vertical dimension\n", " (notes within a chord) for\n", " enharmonic spelling\n", "fixStringNotenames False type: bool\n", " Fix pitches given as notenames at\n", " the spelling given. False: respell\n", " for better readability within the\n", " context. Pitches as midi or\n", " frequency are always respelled\n", "htmlTheme light {dark, light}\n", " Theme used when displaying html\n", " inside jupyter\n", "jupyterReprShow True type: bool\n", " Use html as repr within jupyter. If\n", " False, .show needs to be called\n", " explicitely to render notation\n", "lilypondpath type: str\n", " Path to the lilypond binary. If\n", " set, it must be an absolute,\n", " existing path. Only needed if using\n", " a specific lilypond installation\n", " (lilypond is auto-installed if not\n", " found)\n", "musescorepath type: str\n", " Command to use when calling\n", " MuseScore. For macOS users: it must\n", " be an absolute path pointing to the\n", " actual binary inside the .app\n", " bundle\n", "openImagesInExternalApp False type: bool\n", " Force opening images with an\n", " external tool, even when inside a\n", " Jupyter notebook\n", "play.backend default {alsa, auhal, default, jack, pa_cb,\n", " portaudio, pulse}\n", " backend used for playback\n", "play.defaultAmplitude 1.0 between 0 - 1\n", " Default amplitude for a Note/Chord,\n", " only used if play.useDynamics is\n", " False\n", "play.defaultDynamic f {f, ff, fff, ffff, mf, mp, p, pp,\n", " ppp, pppp}\n", " Dynamic of a Note/Chord, only used\n", " if play.useDynamics is True. Any\n", " event with an amplitude uses that\n", " value instead\n", "play.engineName maelzel.core type: str\n", " Name of the play engine used\n", "play.fade 0.02 type: float\n", " Default fade time\n", "play.fadeShape cos {cos, linear, scurve}\n", " Curve-shape used for fading in/out\n", "play.gain 1.0 between 0 - 1\n", " Default gain used when\n", " playing/recording\n", "play.generalMidiSoundfont type: str\n", " Path to a soundfont (sf2 file) with\n", " a general midi mapping\n", "play.graceDuration 1/14 type: (int, float, str)\n", " Duration assigned to a gracenote\n", " for playback (in quarternotes)\n", "play.instr .piano type: str | default: sin\n", " Default instrument used for\n", " playback. A list of available\n", " instruments can be queried via\n", " `presetManager.definedPresets()`.\n", "play.numChannels 4 between 1 - 128 | default: 2\n", " Default number of playback channels\n", "play.pitchInterpol linear {cos, linear}\n", " Curve shape for interpolating\n", " between pitches\n", "play.schedLatency 0.05 type: float\n", " Latency when scheduling events to\n", " ensure time precission\n", "play.soundfontAmpDiv 16384 type: int\n", " A divisor used to scale the\n", " amplitude of soundfonts to a range\n", " 0-1\n", "play.soundfontFindPeakAOT False type: bool\n", " True: find the peak of a soundfont\n", " to adjust its normalization at the\n", " moment an soundfont preset is\n", " defined\n", "play.soundfontInterpol linear {cubic, linear}\n", " Interpolation used when reading\n", " sample data from a soundfont.\n", "play.unschedFadeout 0.05 type: float\n", " Fade out when stopping a note\n", "play.useDynamics True type: bool\n", " Any note/chord with a set dynamic\n", " will use dynamics for playback if\n", " no explicit amplitude is set\n", "play.verbose False type: bool\n", " True: outputs extra debugging\n", " information regarding playback\n", "quant.beatWeightTempoThresh 52 type: int\n", "quant.breakBeats weak {all, none, strong, weak}\n", " Level at which to break\n", " syncopations. \"all\": break all\n", " syncopations; \"weak\": break\n", " syncopations over weak beats;\n", " \"strong\": only break syncopations\n", " at strong beats; \"none\": don´t\n", " break syncopations\n", "quant.complexity high {high, highest, low, lowest,\n", " medium}\n", " Complexity used for notation.\n", "quant.gridWeight None between 0 - 10\n", " Weight applied to the time\n", " quantization error. Higher values\n", " result in more accurate\n", " quantization, at the cost of\n", " complexity. None sets this value\n", " from the complexity preset\n", " (quant.complexity)\n", "quant.nestedTuplets None {False, None, True}\n", " Allow nested tuplets when\n", " quantizing. None: follow the\n", " complexity preset\n", " (quant.complexity). The musescore\n", " backend cannot parse nested tuplets\n", " from musicxml atm\n", "quant.nestedTupletsMusicxml False type: bool\n", " False: no nested tuplets are used\n", " for musicxml. The musescore backend\n", " cannot parse nested tuplets\n", " properly from mxml. Nested tuplets\n", " are used for other formats if\n", " \"quant.nestedTuplets\" = True\n", "quant.subdivTempoThresh 96 type: int\n", "quant.syncopExcludeSymDurs (5, 7, 15) type: tuple\n", " Durations with a numerator in this\n", " list cannot be placed across a\n", " beat. A value of (7, 15), for\n", " example, excludes double and\n", " trippled dotted notes\n", "quant.syncopMaxAsymmetry 3 between 1 - 99\n", " Max. asymmetry of a syncopation.\n", " For notes across beats, this sets\n", " the max. allowed asymmetry across\n", " the beat, as a ratio\n", " longest:shortest part across the\n", " beat. A note exactly across the\n", " beat has an asymmetry of 1\n", "quant.syncopMinFraction 1/6 type: (str, float, Rational)\n", " Min. duration of a syncopation as a\n", " ratio of the beat. Any syncopation\n", " shorter is broken and its parts\n", " tied, to prevent complex\n", " syncopations\n", "quant.syncopPartMinFraction 1/10 type: str\n", " Min. duration of any part of a\n", " syncopation, as a fraction of the\n", " beat. A syncopation consistings of\n", " two parts, one left and one right\n", " to the beat boundary\n", "rec.blocking True type: bool\n", " Should recording be blocking or\n", " should be done async?\n", "rec.extratime 0.0 between 0.0 - inf\n", " Default extratime added when\n", " recording\n", "rec.ksmps 64 {1, 16, 32, 64, 128, 256}\n", " Samples per cycle when rendering\n", " offline (passed as ksmps to csound)\n", "rec.numChannels 2 between 1 - 128\n", " Number of channels when rendering\n", " to disk\n", "rec.path type: str\n", " Path used to save soundfiles when\n", " rendering offline. Otherwise the\n", " value returned by `recordPath` is\n", " used\n", "rec.sr 44100 {44100, 48000, 88200, 96000,\n", " 192000}\n", " Sample rate used when rendering\n", " offline\n", "rec.verbose False type: bool\n", " Show debug output when calling\n", " csound as a subprocess\n", "reprDurationAsFraction True type: bool\n", " Show durations as fractions instead\n", " of floats\n", "reprShowFreq False type: bool\n", " Show frequency when printing a Note\n", " in the console\n", "reprUnicodeAccidentals True {False, full, simple, True}\n", " Use unicode accidentals for\n", " representation of notes\n", "reprUnicodeFractions False type: bool\n", " Show fractions (for\n", " durations/offsets) as unicode\n", " glyphs. Not all fonts have support\n", " for this\n", "semitoneDivisions 4 {1, 2, 4}\n", " Number of divisions/semitone used\n", " for notation (2=quarter-tones,\n", " 4=eighth-tones)\n", "show.absOffsetWhenDetached False type: bool\n", " Use the abs. offset of an object,\n", " even when shown detached from its\n", " parent\n", "show.arpeggiateChord auto {auto, False, True}\n", " Display chords as an arpeggio. In\n", " auto mode, only arpeggiate when\n", " needed\n", "show.arpeggioDuration 0.5 type: float\n", " Duration used for individual notes\n", " when rendering a chord as arpeggio\n", "show.autoClefChanges True type: bool\n", " Add clef changes if needed.\n", " Otherwise, one clef is determined\n", " for each part and is not changed\n", " along the part.\n", "show.backend lilypond {lilypond, musicxml}\n", " Method used when rendering notation\n", "show.cacheImages True type: bool\n", " True: cache rendered images. Set it\n", " to False for debugging. call\n", " `resetImageCache()` to reset\n", " manually\n", "show.centSep , type: str\n", " Separator used when displaying\n", " multiple cents deviation (in a\n", " chord)\n", "show.cents True type: bool\n", " Show cents deviation as text when\n", " rendering notation\n", "show.centsTextSnap 2 between 0 - 50\n", " Notes within this number of cents\n", " from a quantized pitchdon´t need a\n", " text annotation (see `show.cents`)\n", "show.centsTextStyle fontsize=6; type: str\n", " placement=below\n", " Style used for cents annotations. A\n", " list of key=value pairs, separated\n", " by ;. Keys: fontsize, box\n", " (rectangle, square, circle),\n", " placement (above, below), italic,\n", " bold. Example: \"fontsize=12;\n", " italic; box=square\"\n", "show.clefChangesWindow 1 type: int\n", " When adding automatic clef changes,\n", " use this window size (number of\n", " elements per evaluation)\n", "show.clefSimplify 0.0 between 0 - 10000\n", " Simplifie automatic clef changes.\n", " Use higher values to limit clef\n", " changes\n", "show.clipNoteheadShape square {cluster, cross, normal, rectangle,\n", " rhombus, slash, square, triangle}\n", " Notehead shape to use for clips\n", "show.dynamicFromAmplitude False type: bool\n", " If an object has an amplitude but\n", " no explicit dynamic, add a dynamic\n", " according to the amplitude\n", "show.flagStyle straight {flat, normal, straight}\n", " Flag style, at the moment only\n", " valid in lilypond\n", "show.format png {pdf, png, repr}\n", " Used when no explicit format is\n", " passed to .show\n", "show.glissHideTiedNotes True type: bool\n", " Hide tied notes when part of a\n", " gliss.\n", "show.glissLineThickness 2 {1, 2, 3, 4}\n", " Line thikness for glissandi. The\n", " value is abstract, it isup to the\n", " renderer to interpret it\n", "show.glissLineType solid {solid, wavy}\n", " Default line type for glissandi\n", "show.glissStemless False type: bool\n", " When the end pitch of a gliss. is\n", " shown as gracenote, make this\n", " stemless\n", "show.hideRedundantDynamics True type: bool\n", " Hide redundant dynamics within a\n", " voice\n", "show.horizontalSpace medium {default, large, medium, small,\n", " xlarge}\n", " Hint to adjust horizontal spacing,\n", " the result depends on format and\n", " backend\n", "show.jupyterMaxImageWidth 1000 type: int\n", " Max. width in pixels for images in\n", " a jupyter notebook\n", "show.keepClefBias 2.0 type: float\n", " The higher this value, the more\n", " likely it is to keep the previous\n", " clef during automatic clef changes\n", "show.labelStyle fontsize=9; type: str\n", " placement=above\n", " Style used for labelsA list of\n", " key=value pairs, separated by ;.\n", " Keys: fontsize, box (rectangle,\n", " square, circle), placement (above,\n", " below), italic, bold. Example:\n", " \"fontsize=12; italic; box=square\"\n", "show.lilypondGlissMinLength 5 type: int\n", " Min. length of a glissando in\n", " points. Increase this value if\n", " gliss. linesare hidden or too short\n", "show.lilypondPngStaffsizeScale 1.5 type: float\n", " Factor applied to the staffsize\n", " when rendering to png via lilypond.\n", " Useful if images are too small\n", " within jupyter\n", "show.measureLabelStyle box=rectangle; type: str\n", " fontsize=12\n", " Style for measure annotations. A\n", " list of key=value pairs separated\n", " by ;. Keys: fontsize, box\n", " (rectangle, square, circle),\n", " placement (above, below), italic,\n", " bold. Example: \"fontsize=12;\n", " italic; box=square\"\n", "show.musicxmlFontScaling 1.0 type: float\n", " Scaling factor applied to font\n", " sizes when rendering to musicxml\n", "show.pageMarginMillim 4 between 0 - 1000\n", " Page margin in mm\n", "show.pageOrientation portrait {landscape, portrait}\n", " Page orientation when rendering to\n", " pdf\n", "show.pageSize a4 {a2, a3, a4}\n", " Page size when rendering to pdf\n", "show.pngResolution 300 {100, 200, 300, 600, 1200} |\n", " default: 200\n", " DPI used when rendering to png\n", "show.proportionalDuration 1/24 type: str\n", " When using proportional spacing,\n", " the lower this value, the longer\n", " the space taken by each note. This\n", " corresponds to the value as used by\n", " lilypond. See also: https://lilypon\n", " d.org/doc/v2.23/Documentation/notat\n", " ion/proportional-notation\n", "show.referenceStaffsize 12.0 type: float\n", " Staff size used as reference. This\n", " allows to use staff size as a\n", " generic indicator for score scale\n", " across backends\n", "show.rehearsalMarkStyle box=rectangle; type: str\n", " fontsize=13; bold\n", " Style for rehearsal marks. A list\n", " of key=value pairs, separated by\n", " \";\". Keys: fontsize, box\n", " (rectangle, square, circle),\n", " placement (above, below), italic,\n", " bold. Example: \"fontsize=12;\n", " italic; box=rectangle\"\n", "show.respellPitches True type: bool\n", " Find best enharmonic spelling\n", " within the context.\n", "show.scaleFactor 0.75 type: float\n", " Affects the size of the generated\n", " image when using png format\n", "show.scaleFactorMusicxml 0.8 type: float\n", " Apply a scaling factor to images\n", " rendered via musicxml\n", "show.spacing normal {normal, strict, uniform}\n", " Horizontal spacing used. \"normal\":\n", " traditional spacing; \"uniform\":\n", " proportional spacing with uniform\n", " stretching; \"strict\": proportional\n", " spacing with strict placement (clef\n", " changes and bar lines don´t add\n", " spacing andmight overlap)\n", "show.staffSize 10.0 type: float\n", " Size of a staff, in points\n", "show.voiceMaxStaves 2 between 1 - 4\n", " Max. number of staves per voice\n", " when showing a Voice as notation\n", "show.warnIfEmpty True type: bool\n", " True: warn if an object did not\n", " produce any scoring parts\n", "soundfilePlotHeight 3 type: int\n", " Height used for plotting\n", " soundfiles. This is used, for\n", " example, to set the figsize in\n", " matplotlib plots used inline within\n", " Jupyter.\n", "splitAcceptableDeviation 4 type: int\n", " When splitting notes between\n", " staves, notes within this range of\n", " the split point will be grouped\n", " together if they all fit\n", ".enharmonic.150centMicroPenalty 20 type: int\n", ".enharmonic.debug False type: bool\n", " True: print debug information while\n", " calculating automatic enharmonic\n", " spelling\n", ".quant.complexityWeight None between 0 - 10\n", " Weight applied to the complexity of\n", " the rhythm during quantization. A\n", " higher value results in simpler\n", " rhythms. None sets this value from\n", " the complexity preset\n", " (quant.complexity)\n", ".quant.debug False type: bool\n", " Output extra debug info during\n", " quantization, showing how different\n", " divisions are evaluated by the\n", " quantizer\n", ".quant.debugShowNumRows 50 type: int\n", " When quantization debugging is\n", " turned on this setting limits the\n", " number of different quantization\n", " possibilities shown\n", ".quant.divisionWeight None type: NoneType\n", " Weight applied to the penalty of\n", " the beat divisionHigher values\n", " result in simpler subdivisions.\n", " None to use the value set by the\n", " complexity preset\n", " (quant.complexity)\n", ".quant.gridErrorExp None type: NoneType\n", " Exponent applied to the grid error.\n", " The error is a value between 0-1\n", " showing the grid accuracy for a\n", " given quantization (0=perfect\n", " timing). A value between 0-1 makes\n", " grid errors weight more. None to\n", " use the value set by the complexity\n", " preset (quant.complexity)\n", ".quant.mergeTupletsDifferentDur False type: bool\n", ".rec.compressionBitrate 224 type: int\n", " default bitrate to use when\n", " encoding to ogg or mp3\n", ".show.centsTextPlusSign True type: bool\n", " Show a plus sign for possitive\n", " cents deviations\n", ".show.dynamicsResetAfterEmptyMeasure True type: bool\n", ".show.dynamicsResetAfterRest 1 type: int\n", ".show.dynamicsResetTime 32 between 0 - 999999999\n", " When removing redundant dynamics,\n", " reset after this number of quarters\n", ".soundfilePlotWidth 24 type: int\n", "------------------------------------ ------------------- -----------------------------------\n" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "config = getWorkspace().config\n", "config" ] }, { "cell_type": "markdown", "id": "8df5fadb-c68d-490a-9312-831f40d35ef6", "metadata": {}, "source": [ "### Environment\n", "\n", "Some aspects of the environment can be queried through the Workspace\n", "\n", "* `recordPath()`: returns the path where recordings are placed whenever the user does not give an absolute path\n", "* `presetsPath()`: presets created via `defPreset` are saved in this path and loaded in future sessions. " ] }, { "cell_type": "code", "execution_count": 8, "id": "c3a293f2-2e2c-425a-a1a6-eca581ae0e37", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'/home/em/.local/share/maelzel/recordings'" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "w.recordPath()" ] }, { "cell_type": "code", "execution_count": 9, "id": "317cc580-f46b-4ad6-9bba-c4ac75e57bef", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'/home/em/.local/share/maelzel/core/presets'" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "w.presetsPath()" ] }, { "cell_type": "markdown", "id": "a3520e6c-7ce4-4ede-8bb3-73eac6270b5f", "metadata": {}, "source": [ "## Dynamics\n", "\n", "*Mapping dynamic expressions to amplitudes*\n", "\n", "The dynamic curve within the active Workspace is used to map dynamics to amplitude for playback, or to transcribe amplitudes as dynamics\n" ] }, { "cell_type": "code", "execution_count": 10, "id": "f142ae6b-9bc2-49ab-bba2-36c3d06e9b6a", "metadata": {}, "outputs": [ { "data": { "image/png": "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asaMGVq7dq327Nmjhx56SJGRkVqwYIEZ5faqzkULGdQMAED3eVTwCQsLU2Ji4gXPvfbaa2ppadErr7yigIAAjRgxQrt27dKaNWu8LviU1J7WtoIqWSzSHLq5AADoNo/p6pKk559/XjExMRo7dqxWr16ttrY217mtW7dq2rRpCggIcB2bNWuW8vPzVV1dfdHPbG5ulsPh6PJydxtyO1p7rk+NVmJEoMnVAADgOTymxef//J//o3Hjxik6OlpbtmzRsmXLVFJSojVr1kiSSktLlZaW1uX3JCQkuM5FRUVd8HNXrlypFStW9G7xPaxz0UJmcwEAcGVMbfFZunTpeQOWz33l5eVJkhYvXqzp06dr1KhRWrhwoX7+85/rpZdeUnNz8zXVsGzZMtXW1rpeJ06c6Ilb6zXHTzVo98laWf0smn3dhbv9AADAhZna4rNkyRLNnTv3ktekp6df8PikSZPU1tamgoICDR06VImJiSorK+tyTef7i40LkiS73S673X5lhZto/ZlurskZMYoN9Zy6AQBwB6YGn7i4OMXFxV3V7921a5f8/PwUHx8vScrKytLy5cvV2toqm80mScrJydHQoUMv2s3liejmAgDg6nnE4OatW7fqhRde0O7du3X06FG99tpreuyxx/TP//zPrlBz7733KiAgQPPmzdO+ffv0xhtv6MUXX9TixYtNrr7nHCyrU15pnWxWi2aNoJsLAIAr5RGDm+12u15//XU988wzam5uVlpamh577LEuoSYiIkKbNm3SokWLNH78eMXGxuqpp57yqqns68+09mQPiVdEkM3kagAA8DweEXzGjRunzz777LLXjRo1Sp988kkfVNT3DMPQO2fG99w+mkULAQC4Gh7R1QVpX7FDxyobFGjz04zMBLPLAQDAIxF8PETnoOabMxMUYveIhjoAANwOwccDOJ2Gaxo7O7EDAHD1CD4eYOeJahXVnFao3V/Th17d9H8AAEDw8QidO7HPHJGgQJvV5GoAAPBcBB831/7Vbi4WLQQA4JoQfNzc50dPqbK+WZHBNk0ZFGt2OQAAeDSCj5t7J7djNtfs65Jks/KfCwCAa8E3qRtraXNq495SSSxaCABATyD4uLHNhytV09iquDC7JqXFmF0OAAAej+DjxjoXLbxtZJKsfhaTqwEAwPMRfNxUU2u7Nu0vk0Q3FwAAPYXg46Y+zC9XfXObkiODNDYlyuxyAADwCgQfN9W5aOGcUUnyo5sLAIAeQfBxQ/XNbXovr7Obi0ULAQDoKQQfN/TegTI1tTqVFhuiEf3CzS4HAACvQfBxQ52zuW4flSSLhW4uAAB6CsHHzdQ2tuqjgxWS6OYCAKCnEXzczN/3laq13dCwxDANTggzuxwAALwKwcfNdO7NRWsPAAA9j+DjRirrm7X5cKWkjmnsAACgZxF83MjGPSVyGtLo/hEaGBNidjkAAHgdgo8b6Vy0kG4uAAB6B8HHTZTUnta2gipJ0m10cwEA0CsIPm5iQ25Ha8/E1GglRQSZXA0AAN6J4OMmXIsWshM7AAC9huDjBo6fatDuk7Xys0izRxJ8AADoLQQfN7D+TDfXjYNiFRtqN7kaAAC8F8HHDZzdm4vZXAAA9CaCj8kOltUpr7RONqtFs0Ykml0OAABejeBjsvVnWnuyh8QpIthmcjUAAHg3go+JDMPQO7ksWggAQF8h+JhoX7FDxyobFGjz04zMBLPLAQDA6xF8TNQ5qPnmYQkKsfubXA0AAN6P4GMSp9NwTWNn0UIAAPoGwcckO09Uq6jmtELt/po+NN7scgAA8AkEH5N07sQ+c3iCAm1Wk6sBAMA3EHxM0N6lm4vZXAAA9BWCjwk+P3pKlfXNigy26cZBsWaXAwCAzyD4mOCd3I7ZXLOvS1SAP/8JAADoK3zr9rGWNqc27i2VxN5cAAD0NYJPH9t8uFI1ja2KDbVrUnqM2eUAAOBTCD59rHPRwjmjkmT1s5hcDQAAvoXg04eaWtu1aX+ZJBYtBADADASfPvRhfrnqm9uUHBmksSlRZpcDAIDP8ajgs2HDBk2aNElBQUGKiorSHXfc0eV8YWGhbrvtNgUHBys+Pl4/+MEP1NbWZk6xF9C5aOGcUUnyo5sLAIA+5zE7Y7711luaP3++fvKTn+hrX/ua2tratHfvXtf59vZ23XbbbUpMTNSWLVtUUlKi+++/XzabTT/5yU9MrLxDfXOb3svr7OZiNhcAAGawGIZhmF3E5bS1tSk1NVUrVqzQvHnzLnjNxo0bNWfOHBUXFyshIUGStHbtWj3xxBOqqKhQQEBAt/4sh8OhiIgI1dbWKjw8vMfu4X93FenR13cpLTZE7y/JlsVCiw8AAD2lu9/fHtHVtWPHDhUVFcnPz09jx45VUlKSZs+e3aXFZ+vWrRo5cqQr9EjSrFmz5HA4tG/fvot+dnNzsxwOR5dXb+iczXX7qCRCDwAAJvGI4HP06FFJ0jPPPKMnn3xS69evV1RUlKZPn66qqipJUmlpaZfQI8n1vrS09KKfvXLlSkVERLheKSkpPV5/bWOrPjpYIYluLgAAzGRq8Fm6dKksFsslX3l5eXI6nZKk5cuX6+6779b48eP1hz/8QRaLRW+++eY11bBs2TLV1ta6XidOnOiJW+siwN9Pz905Uv84cYAGJ4T1+OcDAIDuMXVw85IlSzR37txLXpOenq6Sko7ZUMOHD3cdt9vtSk9PV2FhoSQpMTFR27Zt6/J7y8rKXOcuxm63y263X0353RYUYNW3JqToWxN6vjUJAAB0n6nBJy4uTnFxcZe9bvz48bLb7crPz9eUKVMkSa2trSooKNDAgQMlSVlZWXruuedUXl6u+Ph4SVJOTo7Cw8O7BCYAAOC7PGI6e3h4uBYuXKinn35aKSkpGjhwoFavXi1JuueeeyRJM2fO1PDhw3Xfffdp1apVKi0t1ZNPPqlFixb1eosOAADwDB4RfCRp9erV8vf313333afTp09r0qRJev/99xUV1bECstVq1fr16/XII48oKytLISEheuCBB/Tss8+aXDkAAHAXHrGOT1/qrXV8AABA7/GqdXwAAAB6AsEHAAD4DIIPAADwGQQfAADgMwg+AADAZxB8AACAzyD4AAAAn0HwAQAAPoPgAwAAfIbHbFnRVzoXsnY4HCZXAgAAuqvze/tyG1IQfM5RV1cnSUpJSTG5EgAAcKXq6uoUERFx0fPs1XUOp9Op4uJihYWFyWKx9NjnOhwOpaSk6MSJEz65B5iv37/EM/D1+5d4Br5+/xLPoDfv3zAM1dXVqV+/fvLzu/hIHlp8zuHn56f+/fv32ueHh4f75A97J1+/f4ln4Ov3L/EMfP3+JZ5Bb93/pVp6OjG4GQAA+AyCDwAA8BkEnz5it9v19NNPy263m12KKXz9/iWega/fv8Qz8PX7l3gG7nD/DG4GAAA+gxYfAADgMwg+AADAZxB8AACAzyD4AIDJNm/erJEjR8pms+mOO+4wu5xeYxiGFixYoOjoaFksFu3atcvskvrEufe9c+dOn3gO3blvM34mGNwMACabNGmShgwZopUrVyo0NFSRkZFml9QrNm7cqG984xv68MMPlZ6ertjYWPn7e/86uufe9/bt23X33Xd7/XPozn3n5OT0+c+E9z1pAPAwR44c0cKFC3t11Xh3cOTIESUlJWny5Mlml9Knzr3v48eP+8Rz6M59m/IzYeCqZWdnG4sWLTIWLVpkhIeHGzExMcaTTz5pOJ1OwzAMY+DAgcazzz5rfOc73zGCg4ONfv36Gb/61a+6fIYk49e//rVx6623GoGBgUZaWprx5ptvmnE7PaInnom3udwz8QbZ2dnG9773PePRRx81IiMjjfj4eOPll1826uvrjblz5xqhoaFGRkaG8de//tUwDMP44IMPDEnG+vXrjZEjRxp2u92YNGmSsWfPHpPv5NpdybM4duyYIanL6w9/+IPZt9ArHnjggS73OXDgQLNL6hMXum9feA7duW+zfiYIPtcgOzvbCA0NNR599FEjLy/P+NOf/mQEBwcbL7/8smEYHV/yYWFhxsqVK438/Hzjl7/8pWG1Wo1Nmza5PkOSERMTY/zud78z8vPzjSeffNKwWq3G/v37zbqta9ITz8TbXO6ZeIPs7GwjLCzM+PGPf2wcPHjQ+PGPf2xYrVZj9uzZxssvv2wcPHjQeOSRR4yYmBijoaHBFXwyMzONTZs2Gbm5ucacOXOM1NRUo6WlxezbuSZX8izq6+uNkpISIzw83HjhhReMkpISo7Gx0exb6BU1NTXGs88+a/Tv398oKSkxysvLzS6pT5x73wUFBT7xHLpz32b9TBB8rkF2draRmZnZ5V/uTzzxhJGZmWkYRseX/K233trl93z72982Zs+e7XovyVi4cGGXayZNmmQ88sgjvVh57+mJZ+JtLvdMvEF2drYxZcoU1/u2tjYjJCTEuO+++1zHSkpKDEnG1q1bXcHn9ddfd50/deqUERQUZLzxxht9WntPu9JnYRiGERER4bUtPV/1i1/8wmtbOC7l3Pv2lefQnfs241kwq+sa3XDDDbJYLK73WVlZOnTokNrb213vvyorK0sHDhw479jlrvEkPfFMvM3lnok3GDVqlOvXVqtVMTExGjlypOtYQkKCJKm8vNx17Ks/C9HR0Ro6dKhX/CxczbMA0DcIPgB6hM1m6/LeYrF0OdYZ/JxOZ5/WZQaeBeC+CD7X6PPPP+/y/rPPPtPgwYNltVpd7889n5mZed6xy13jSXrimXibyz0TX/XVn4Xq6modPHjQ638WAJiL6ezXqLCwUIsXL9bDDz+sHTt26KWXXtLPf/5z1/nNmzdr1apVuuOOO5STk6M333xTGzZs6PIZb775piZMmKApU6botdde07Zt2/T73/++r2+lx/TEM/E2l3smvurZZ59VTEyMEhIStHz5csXGxnr1An4AzEfwuUb333+/Tp8+rYkTJ8pqterRRx/VggULXOeXLFmiL774QitWrFB4eLjWrFmjWbNmdfmMFStW6PXXX9d3v/tdJSUl6b//+781fPjwvr6VHtMTz8TbXO6Z+Krnn39ejz76qA4dOqQxY8bonXfeUUBAgNllAfBirNx8DaZPn64xY8bohRdeuOD51NRUff/739f3v//9i36GxWLR22+/7TX/yu2JZ+JtLvdMfNGHH36om266SdXV1V67SjEA98QYHwAA4DMIPgAAwGfQ1QUAAHwGLT4AAMBnEHwAAIDPIPgAAACfQfABAAA+g+ADAAB8BsEHAAD4DIIPAADwGQQfAADgMwg+AADAZ/z/rNS3kCdi0AsAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "w.dynamicCurve.plot()" ] }, { "cell_type": "markdown", "id": "ddcf5abd-dcc0-4528-8344-f2218c8691d9", "metadata": {}, "source": [ "### Testing dynamics\n", "\n", "**Luciano Berio, \"O King\"**" ] }, { "cell_type": "markdown", "id": "153f2aae-0e8e-404a-ad61-30597820a676", "metadata": {}, "source": [ "![](assets/oking1.png)" ] }, { "cell_type": "code", "execution_count": 12, "id": "de39395a-843a-4966-8f49-b7292610e4ae", "metadata": {}, "outputs": [], "source": [ "# Reset any active scorestruct to the default\n", "events = [\n", " \"4F:4:ff\",\n", " \"4A:2.5:pp\",\n", " \"4F:0\", # dur=0 indicates a grace note\n", " \"4A:1:pp\",\n", " \"4B:3\",\n", " \"5C#:3\",\n", " \"4F:3\",\n", " \"4A:2:ff\",\n", " \"4F:0:pp\",\n", " \"4A:1.5:pp\",\n", " \"4Ab:1.5\",\n", " \"4Bb:1\",\n", " \"5D:.5\",\n", " \"5C#:2\",\n", " \"4B:1.5:ff\",\n", " \"4F:2.5:pp\"\n", "]\n", "voice = Chain(events)\n" ] }, { "cell_type": "markdown", "id": "45b47526-b350-4acf-9233-736f3804ee98", "metadata": {}, "source": [ "Set the score structure to match the original. Either the `.scorestruct` attribute can be modified directly or the function `setScoreStruct` can be used" ] }, { "cell_type": "code", "execution_count": 13, "id": "26c3999b-c50f-4205-869e-df35b4c7e3fa", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABykAAADECAIAAACk44p+AAAAAXNSR0IB2cksfwAAAAlwSFlzAAAuIwAALiMBeKU/dgAAACB0RVh0U29mdHdhcmUAR1BMIEdob3N0c2NyaXB0IDEwLjAzLjC1mo4oAAAgAElEQVR4nOzdX+zzVn0/8PNlT2n7wNM6zwV91HZ9Gn8pFOh4aBzaaZsoLA7d1q1MWhI6NMYFxNEmQAhNdi42aRI3ca4ntjhcwbTR+KtJrcS0Ko5GuajWEgfK38KI821F4SmT4rRP/0Fh39/FoWf+2Y6/iWPHx8n7dZVvEjvna/v88eccn3NwcnJCAAAAAAAA9tLBwUHWSYiC+zUAAIBce0PWCQAAAAAAAAAAAADYQWeyTgAAAAAAAEDGdF0vlUpZp+L/TCYTTdOyTgUAAABsCrFXAAAAAADYd6VSSZblrFMBAAAAuwZzDiz1jne846qrrrIsK+uEAAAAAAAAAAAAQP4g9rrUK6+88stf/jLrVAAAAAAAAAAAAEAuIfYKAAAAAAAAAAAAkDzEXgEAAAAAABJQKBQODg4kSco6IQAAAMALxF4BAAAAAAA2ZRjGYrEghEwmE9u2s04OAAAAcAGxVwAAAAAAgE0Nh0P2utfrZZgSAAAA4AdirwAAAAAAABtxHOfo6Ij9aZqm67oZpgcAAAA4gdgrAAAAAADARnwDXReLhWmaWSUGAAAA+IHYKwAAAAAAwEaCkdZOp5NJSgAAAIAriL0CAAAAAADEZ5rmbDbzvTmbzSzLyiQ9AAAAwA/EXgEAAAAAAOIbDAZrvQ8AAAD7A7FXAAAAAACAmHyrbHn1+32suAUAALDnEHsFAAAAAACIia2y1Ww2i8Wi71PDMLaeIgAAAOAIYq8AAAAAAAAxsVW2Go1Gq9XyfcoiswAAALCfEHsFAAAAAACIg62yVSwWZVlWFMX3Bay4BQAAsOcQewUAAAAAAIhjOBzSF/V6nRBSKBSazabvOxj6CgAAsM8QewUAAAAAAFib67r9fp++ZrMNNBoN39eOjo4cx9lqygAAAIAbiL0CAAAAAACsja2jVavVRFGkr2VZDq64haGvAAAAewuxVwAAAAAAgLWxiKpvrGtwxS22HhcAAADsG8ReAQAAAAAA1mNZFltli072yoSuuIXwKwAAwH5C7BUAAAAAAGA9g8GAvvAFXsmSFbfY9wEAAGCvIPYKAAAAAACwhtBVtryw4hYAAABQiL0CAAAAAACsga2yValU2CpbXlhxCwAAACjEXgEAAAAAANawbJUtr+B4WBaxBQAAgP2B2CsAAAAAAMCqbNumq2wJghBcVosJzgO7WCwQfgUAANg3iL3mhuM4iqKIonjwOkmSNE1zXTdiK8uy6vW6dxM0+AAAAAAAYmODXiMCr4QQURRrtZrvTay4BQAAsG8Qe80HTdMODw/7/X6hUFBVdTAYqKrqOE6325VleVn4VdO0arV6dHSkqmqv12s2m5PJpNVqRWwCAAAAAADLuK5rmiZ9HTHhwLIvjEYjrLgFAACwV85knQA4heu6sixPJhNCSKfT0TSNvl+v1x3HOTo6mkwmiqKwJiCjaVq32xUEwbIsSZIIIYqitFqtcrk8Go3q9bplWVv+XwAAAAAAcs00zcViQV+zlvlaOp0OHkQDAADYH4i98k7TtGDglRBCA6/0NXvBWJbV7XYJIYqi0MArJUmSqqrdbnc0Gmmaput66v8AAAAAAMCuYBMOEEJGo1GMPZimqet6oVBILlEAAADAL8w5wDXLsvr9PiGkWCz6+tWjH1aik08JgtBut30ftdttQRAIIYZhYOYBAAAAAIAV2bZNR0VsYrFYBB9ZAwAAgF2Fca9cY/HWYAhVkiRBEOgTT6qqej8yTZMuvSrLcrBHvVAoyLJ8dHREF1qN96gUAAAAAMC+YYNeK5VKsH2+TKfT8Y2Q7fV60et0AQAAwM5A7JVflmWxfvV6ve77tFAo2LZtmmahUPA13djyqaIohu6ZvT8YDBB7BQAAAAA4lXeVLbp67eob+mKvk8nEtm3vzGAAAACwqzDnAL9YCLVSqYROCCWKoqZpwT5zNv3r4eFh6J7Z+5PJBNMOAAAAAACciq2yJQhCcGBEhHq9XiwWfW96540FAACAHYbYK79Yv/qy4auhLMtir08d90oIsW07VuoAAAAAAPYIGxgRY7qAYKzWNE2MgQAAANgHmHOAmKY5Ho8dx3Fdt1AoiKLYaDQyfwLItm3ar04IYYNeaVJptFSSpNB0Rq/BFfpDqz8wBQAAAACwhxzHYfMGNBqNdTdvtVrdbtf7DpZeAAAA2BNbjb1aliWK4lqjONPjum6n0zEMg4U4mW63W6vVfvWrX526E8dxYjwupOv6Kntmr8+fP+84Tr1e9y6rOhqNut1upVKhU76y96fT6VqJmc/na30fAAAAAGDfsDZ/qVSKMUpDFMVarcZmBmP7ROwVAABg520p9uq6rqIoR0dHgiDYtp15+NU0TUVRglFX5ujo6I1vfOOp+3Ecx9eDvYpVYq/j8dj7J23hNZvNcrnsuu5wOKQd76PRSJZly7JCJ4QFAAAAAIDNGYZBX8R+YqzRaPhir7PZzLIsPIIGAACw27Yx36vrurIs06bGYrFYa2b6NGia1mg0IgKv1C9+8YvtpOdUnU6HEGJZlmEYiqJommZZFut7n0wm6DAHAAAAAEiJruun3jucKnTFLTaHLAAAAOyq1Me90sCr92F5GitcZexnGjRNizFSdRlJkobDYVJ7W2axWAyHQ9/DTYqiDIdDGtHu9/vtdjvz0cQAAAAAADvGtm06EoL9GXtX9XrddyeCZjwAAMDOSzf2Ggy8Ut1uN5P1rEzTXDfwGt0SKhQKW3hKqFQqhf6K98El0zQx+hUAAAAAIEGWZdXrde+g19FopOt6vIZ36KK49XodE4gBAADssHRjr4qiBAOvFH1wPtVf96Fzzq67FQ+90MvCu97gNVtiq1qtrhVfPjw83CRtAAAAAAA7xrKswWBgWdZsNgt+2m63e72eJEn0TiHieT4WonUcx7bt0L1NJhNJkujeDg8PY9ywAAAAAM9SjL3quu6bTt5rNBpteWp5wzDWnaepUqmklJhTrRJC9caFWS966Js+3ve3P/oYAAAAAIBnw+Gw3+9HfGE2m7FAakTsdcUhEWxvlUoFsVcAAIAdk1bs1XVd77xIoTRN22S+pHXFmJi1Wq1Gf8FxHLbm1epWmet2lfG2ruuy1yyEKopisVikrTc2GNaHvS8IAmKvAAAAAAAAAAAAaUgr9qpp2qmDTCeTyTaHvo5Go7W+LwjCqd3OjuPEWLlrxdhrqVRaNmMD5Y1ce6cOYLP4e4OzXuz9er2+SoIBAAAAAPaHruuJrAx8cnKy+U4AAAAg196Qxk5d1zVNc5Vvnjo2NkOGYWQ7532j0aAvlk2M6429eqOorVYrekP2PvsmAAAAAAAAAAAAJCuVca+nzqzabDbp1PWj0chxnO2sZ8WexF+FqqqrjAmVJCnGVAYrUhSl1+vNZrNlA4TZT6uq6g0Ti6LYbDb7/f5sNgtuyBYNqNVqmHAAAAAAAAAAAAAgJQdpPAgjSdKyh+VLpZJhGJIkaZpGn4tXVTWRJ3pOxX7xVFtL0qksy6JzzpZKJcuyvAFW0zTpwNhisWjbtm+Iruu6kiTNZjPfhq7ryrI8mUwEQbBteztRbwAAAAAAbh0cHBBChsPhNtcBPhW7EcDEBQAAALmWfOzVcRzv3KNe3pgma0wIgrBsWtJksbBjxHcEQTAMg6tZUA3DoDMDlEolXddpi1DX9U6ns1gsBEGwLCt0+Kpt27IsLxaLUqlkmqYoio7j1Ot1GnhdthVkzrKs4XDYaDRwgjLhuu7f//3fP/XUU5/4xCe4Kgqi2bY9GAyq1SpXN40AAHuCtm8VRcl2uiogry+Ee3h4eOqyDV409qrreqlUSi1pa5tMJpqmkV2MvdJlmdc9TQAAAHl1krRerxf6Q71ez/u1+XzOPhoMBoknI9R8Pq/VaqHJEwRBVdX5fL6dlKxlOBxWKpVgmpvNZnSCp9NpcMNKpTKdTreWeFgXO01ZJ2RPqarKMsvZs2ebzebWCqhN0JwuCELWCQEA2DtsDqhOp5N1WuD/6vG1tlrlpilDKR2rDLHTNBwOs04LAABA6pKf73U6nQbf7PV6vl7NQqHAJmAdj8fbGV9WKBRM06QDxBzHcV23UCiIolgul3ke4CbLsizLtm1blkVj1oeHh/V6/dSxFaIoWpbFNjx//rwsyxhNCbCil19+ud/v9/v9s2fPfvKTn+R/MHL0RNsAAJAq78ACAAAAAAAq+dirbdu+d5rNZujjJKIo0tiraZrbnF9VkiTOAyihYic7p/8vAD9efvnlbrfb7XZvvPHGv/iLv+A/CAsAAACrO+F+6CsAAADk1xsS36Mv9losFpfFVdmwzdls5jhO4ikBAEjWT37yk263Wy6Xb7rpJl3XUXABAAAAAAAAQITkY6++h151XV/2aLwoiuy1ZVmJpwQAICU/+clP2u324eHhHXfcgSAsAAAAAAAAAIRKPvbqVSqVVpxHNXSWWAAAzn33u9+lQVjTNLNOCwAAAAAAAADwJeHYq2/CgVarteKXg7PEAgDkyHg8zjoJAAAAAAAAAMCXhGOvrut6/1xx0GtwQwCAbH384x+//fbbs04FAAAAAAAAAORYinMOVCqVZTO9Ut6xrpPJJL2UAACs64EHHvj+978/Ho9VVb3xxhuzTg4AAAAAAAAA5E+KsVdJkiI+dRzHtyoXAABvJEnSdf3ZZ5+lQdizZ89mnSIAAAAAAAAAyI2EY6+yLLPX5XI54puWZSX70wAA6aFB2JdeemkwGDSbTQRhAQAAAAAAAOBUKY57jZ5wAOvSAEAe1et1wzBoEPb+++/POjkAAAAAAAAAwK8zmfyq67qmaXrfKRaLmaQEACCeer1er9dpaTYcDhuNRtYpAgAAAAAAAAC+JB97LRaLs9ks+jumafomexVFMfGUAACkrVAoKIqiKErWCQEAAAAAAAAA7hycnJwQQjRNs207kT1OJhPXdQkhd9555/nz50O/88QTT1y5csX7zsWLF9/61rcmkoAYXnvttauuuir0o1deeeXMmTPLPgVOzOfzZRdb7oxGI0JIoVAolUpZpyVJ8/n83Llz/GelH/3oR08//TSJLME4xAreSqWSdVrWlpdrAwCStTN193w+/8Y3vkGybs3GsJPFL6vH81ghBu3kOSK5bW7BJnamzAeIbVeLdDiVJEnk5OTk5OREEISsEwMAAAAAAAAAAACwI86cOfPrca+O4ziOk8hO+/3+YDAghHzmM5+57777gl9QVZWODvD6t3/7t3PnziWSgHWFpod585vfrOv62972tm0maR9Uq1X64s477+x2u2tt++CDD375y19+8cUXCSEXLlx43/veRwh58cUX//3f/51958KFC5/4xCfuueee5JK8JfTIxDgsiWN5mRCi6/pa43AfffTRL3zhC5cvXyaE3Hnnnbfddht9/2tf+xp9k7rzzjs/8YlPcJW/2H+97r+cLVaODYfDrf0WiXWU8ntt5M4mWdjnox/96OXLlxuNRrPZTCh1PErwiMXDT/kfynt8YlwMO1x3TyYTTdNIrMOyrv2smtfCDtEWKsSIXyexroc9OUckt82tvcJKNrKjZf6utm02ucveJd4LmLr11ltlWf6jP/qj1eNO3p3EOJ47UKRv8x6TfyxzkcABiQ4q/tpJ0lgiVFUNfsqaI16lUinxZKwuesxvr9fLMG07jB3hSqWy1obe2rHZbHo/Go/HvtNXq9Xm83miCU9dvMOSBlVVvYXL6hv2ej26lSAI4/HY+9F8Pg+2sLnKZey/Xutfzhx7snKbvxXjKOX62sid2Fk4iJ9yKVUJHrF4OD/O3uMT2saLsNt1d3TTN1n7WTWvhR2ibH89xvWwP+foJNHm1ng8VlVVVVXfQYMNeSMLO1nmc17nxsYO7O79a2uJiBXef//9vV5vlavOu5N1j+duFOnbvMfkn/d8+T5aZZqjN5z6jXWxVbOCE8i6ruvrfKBarVbiyVidb9Uvr16vhyV0uKJpWr/fZ3+2223vp5IkeZu8hJCjoyNZluk8mLAdlmWxHC1JkiRJ3k8LhYJpmr5NWq1WUvNNA89wbfDPdV1d1y3LyjohsFNQd2cOxS//cI5i0zSt2+12u93Q20zYPt7KfLRtwOfhhx9utVrnz5//0Ic+FCxaE4EiHYJSib0Wi0USFnvtdDqz2cz3piAI9Xo98WSsKKKUbzabCLxyxbIs3zj/4EQZwTj+ZDLBedymTqfDXtu2HSwHRFEMdvR5t4JdhWuDf4ZhtNtt7wM1ABtC3c0DFL/8wzmC3cBhmY+2DSzz8MMPNxqNN73pTYqiJBuERZEOQcnHXgldw4uQxWLhvciCBTGlKEqhUEgjGatY1rfQbDYNwyCEOI6DkRecYOP2mWD/Ngv9ex0dHaGrc2tGoxF7vVgsyuUyzUpevq4/QsjR0VHqKYOs4drg33w+zzoJsGtQd/MAxS//cI5gN3BY5qNtA9Fefvnlfr/PgrCJLIOEIh2CUom9lstl+oIVoK7rhvZlCYLgewxhy0Jjr6VSSdd1QojrupIkof+BE8HCKLSPlM164RU60TBsR/Dgh3a34B57D+HaANh5qLv5hOKXfzhHkEco8yG/aBA22H+QCBTpm7NtW5bl/M7MkErslc0hwCYnVhQlONsAyXrQKyEkONt3qVSyLIumqtPp+EbvQlaWFUP9ft/XNxXsQSKEpDSTCwQFF6/LNo8DP3BtAOwb1N2cQPHLP5wjiMF1XdM0NQ/TNDN8ZBNlPnDozJkz2/9RFOlpGAwGo9Eov+HXVGKv7DmC0WhEJ7cOHT6d+aBXEqghBEEwDINmDNd1gyPDISsRpdUqzwVErKgGyQpm6hWzeWgHOOwSXBsA+wZ1NydQ/PIP5wjWYllWvV4/f/58o9HoejQaDVEUs1p2DGU+cOizn/3sYDC4//77t/mjKNLT0Gg0BEFYLBaKouRxXtBUYq/EM/S10+ksu85YlDMrtm37injLslgvnKIoqAD4IUlScGIgQoggCLIsbz89sIymab1ej84dXqvVxuNxaM92EGqanYdrA2DfoO7mBIpf/uEcwYroU7fVanXZ1JCLxaLb7UqStP3YBMp84FO9Xn/ooYfm83mv19tOEBZFehokSaKj4yeTCYs35khasVc25Wvo+lqEkFqtlvnx8s3l0ev1vIFXTHXMGzoJ76lvJjI9NmxCURTbtk9OTkzTDK1mgm3BWq22laRBxnBt5JrjOJIkHRwcZF59Q46g7uYEil/+ZXuObNumD63n9FnOPWEYhizL3mV8lplMJpmsWZK7Mh9tm/1RKBQURaFB2E6n8653vSvVn0O1mwZZlmnJNhqNQheU4lmK416Dk1ww9NH+lH56dd45ZTqdDj15juPIstzv97NLF4Sr1+uDwYD1phaLxcFgEMxyoXV5pVJJPX2wsmCzPvPpR7bAMIyDg4ODg4N3vOMduq7z0+jkyn5eG5xjk/PMZrPJZEIIOTo6wgUMK0LdnRfbLH5N06QV4g033KBpGsqTFaV6jjRNow+tZ/W4OpxK1/VWq7X6c5mZ3G7npcxH22afFQoFTdO+853vTKfTTqdz++23Z5IM3PXEo2kaLSv6/T4PQcXVpRV7JZHjpU3TzHyyYcMwWNXVbDZpO8MwDEmSVulLhEzU63XHccbj8Xg8dhwn2D/pOA6tPn2q1epWEginsyzLe44EQRgMBis+hZFr0+mUvnjqqafa7fbh4eHv/u7vGoaRx9lqUrK31wafHMfRNE0UxdDyE/cnsDrU3fzbcvHLlrr92c9+1u12Dw8P77jjDvRKRkMVuecMw1g3LrNYLDJZM53nMh9tG/CikyN///vfH4/HqqreeOONW/tpFOmbaLVa7EUmpVw8aS36pihKaJFKCFFVlYcJX9hTGLVajcXL2VkEnkWUSr55JChBEHI3In036Lo+n8+979D1WNmfxWLRtu3Me2Ky8thjjz322GOtVusv//Iv//iP/3ivnnXCtcG5FR9pBFgd6m5O8Fn8fve732232+12+/7777/vvvvq9fo+l/98niNuiaJIK6wdnifRtu3c3aVyWOajbQPLSJIkSZKu67ZtJ16SoEhPnPeuuV6vexdt4tmvY6+O4yTYz/OVr3xl2TP7d955Z7VazTw4/ZWvfGU2mxFCbrvtto985CPR6ZnP55kneIcleHh/+tOffv7znw++/8EPfjB3c1fxcNUdHx+z18u6UiJMJpNT++ff+9738nZq2H8d419ecc9BX/ziF7/4xS9ec801v//7v3/fffe97W1vW3fnrEbfwmXjbT3EO0o5vTZyZ90s/MMf/nA4HNLXp96cJJ5BeLBhoZcUHsr/UN7jc3x8jLqbYVdLgodlmd2omiMqxIcffvjhhx/+9Kc//b73ve/uu+++5557Yu88k3y0eTbJ6hyxyn07RVCCza3nn3+eveCz8NzcX//1X8fb8Ic//GHsH/WemvyW+fvctuG2ObEdsatm73XovSTiHU9Oqt3YtnmPuZbbbrvtv//7vwkhi8Xiz//8z3VdP3fu3DYT4DsgvvB6uJOTk5OTk9AVCQEAAAAAAAAAAAAgnl/P95qLMboAAAAAAAAAAAAAuXGSnOl0KgjCsh8aDAYJ/lZsbHb/4XAY/DQ05ZVKZfvp3HkJHt75fN5sNn1nja6qmUhSt4yfq05VVXY8Q/NLbKVSyXe+VFVNcP+bYP91sv+yd88nJyfT6TRiQvcYR4OtDJtsmqN/K42jxPO1kTurZ+HQ6zCoVCqt+NPD4TBiteJisaiqKvvC6rtNW3qF3oroT/NQ/ofyHp/NM+Yu1d3sgdYtlFe7UTV7q1q6zPS73vWu0OIiRnbw1rbbl2w28Un1HLEyeTtFUILNLbarXW0wxHs+VRCE6XS6ye+yki2RY7v9Mn/FA7VWIyQXzRuWHm6bE9uRSNXszQWJH89c3PVs8x5zdaFzRhNCOp1Oqr/r/S3fRxElA/OGU7+xItd16/X6YrFIaodpcF2XzuHd6/V4WO8LNuc4jizL3vmFi8Vir9cLXVUTOBHMfd1ul7dJZFIliqKu688+++x4PG42m2fPns06RbzAtcGbYrHIlqZccREATdOq1WrorGqsfNZ13bIs2nKaTCbeBQdgH6Du5lBWxS9dZvo73/nO9peZzh1UkXvIdV26SMm62u02P4uP8Vbmx2jbEDRvIGko0uNxXVfTtNCP2u12gqtYJS6x2KuiKNGzU7MBpxnSNG0ymaiqipVzd4NpmpIksQuvUqnQag/nN3O2ba87Zfiy/qvdJkmSYRgvvfTSYDC4//77s07ONuDayAVBEJrN5ng8dhxnWfsmlCzL3W43dIedTsdXPiuKQvv8eWghwNag7s4K58UvXWP62WefHQ6He9sryfk5gu2LtwJPs9lcq+5OFT9lfuy2DUHzBmJBkZ6G6BGfux971TTt6Ogo9CM2+Dbzbh/DMPr9frPZ1HU925RAIjRNazQai8VCEARVVafTqWVZuHPLnGmaoiiWy+VyuSyK4uoZf897+er1+kMPPTSfz3u9XqPRyDo5qcC1QQixLEvTNN4WMw3OF+Q4jmEY684Fr2la6HiQWq227D7n1PEmfB4xiA11dybyVfzKskx7JXu93v402vN1joBnzWbTMIysU/FrGZb5SbVtSDrNm5235+03FOlpcF1XkqTQzEgJgsDzQlZnNt+FaZqhvUCEkFKpZJqmLMuTyWQ2mzmOk+GzD61Wi7z+yMNaG9q27dvEMAx+HuLYQ67r0otKEARFUdrtNqo3TliW5Y0bzmazRqMxHA5XyXScz1iyHYVCYVdjELg2WMFFCOl2u1zdGpmm2el0aGOFVugxClXLsoKNgWKxaBjGsrNs2zZtP50/fz74Kc9HDGJA3Z2V/Ba/u1ohBvFwjkRRpAXyztzj0BDGvs0yp6oqJz0WmZf5ibRtSArNm52H9hsPRfruoVOURD9qr+s6z23LTWOvEc8LCIJgmmahUGB5zzTNDB9/KJVKk8kkIky+zGKx8G2VbRB5z9FQOCuVut2ubdu0W2l/2ujcYnMneWF6ZSA7dG24rksfIJrP5973G41GdEcrnfSG/dnv9wuFAic3SLIs0xOxSR0dfEhKVdWIey1vv2booeP5iMG6UHdnaGeK3x3GwzliZTXPN66rMAxjMBh4792iK6NlXNe1LMv7zHi5XJZlmdvjEx0N3DIeyvxE2jYkheZNjsTLBWi/8VCk7xhfkRKq1+tx3qTcNPaqKEroIRAEwbIsGqBsNBq0s2g4HGYYe6V3y67rRnynWq0G3yyVSt7ColAo5L0YzS86bJldcvTFaDQajUb9fl/TNEVRQkt2x3E6nQ7nPSE7ILRvY9mEJLBX8n5t2LY9GAxM01y25EW3261UKrTHMfQL3iUm2D4TTmV2HMfxns1T7wBN02TtB0EQQr+520dsr6Duzlbei999gHOUFFmWgweTLl+zeg1C10oKPf50CGcmUaT777//29/+dmgjpFQqtVotfoIOu1Tmp9G8yYVNcgHabyjSk3Vq4FUQBMMw+F+sdaPYq67ry4aR6rrOApSSJBWLxdlsFmPMabKiY6bL5uWlQ3fTSRGswXXd6JmVF4sFbV0Fp/Lp9Xr9fr/VaiFuvn1s0mcmtAKmc9LDXsnFtWFZVqfTWVZ/FYvFer1OHy4bjUayLO9b+5Lyzk5Vq9UMw1h24+S6bqfT8T6+x39TCTaBuptPuSh+9xzO0Yqq1SqtU1jNQg+dt+KeTCaapp0aM7Vte9nMnhQrryzL2nJ88Pbbb3/ooYcsyxoOh+zNcrksSRJXj2PuWJm/h80bnnNBrqFIj4dOYREdeLUsi59CI0L8tbYcx2m326Efqarq63ljscvMV9yKsGxi4/28keZQp9OJnuCDmkwm5XK5Xq8bhkFrBU3Tut1usVjMRZ7MtVqt5nun2WwGc33o8HP0cOy2nF4bmqZVq9XQBmixWKQL9eq6TkcHEEImk8myaq7ZbPre2aUSid0K0tO6rC1O20a+edOWLX2ZvvAAACAASURBVC6320dsf6DuzlxOi9+9gnOUFEEQxuMxLUN8j4qfOuMkHc+4ylChyWQS+kzxFsiyrHvU63WuAq9k58r8NJo3PEskF6D9hiI9QYZhRAReS6WS4zh5ucDix16XPddQqVSCnYrlcpm+8E4XwpvBYBD6/mKx4DlkvCdc12X1WbFYrFQqwcUrvY6OjlqtVrVaZZ3hezXLTFZ8s3ZUKpVg/7DrusE2mSAIy/pyYDfk8dqQZTl0JUlBEDqdjm+6c0VRaE/1smpO13VvV3az2cxdoeS6rq7rsiwH60TaSUmHhCzblgayfc9LViqVZa3MHThigLqbB3ksfvcNzlFSFEVhN+GKongHmi0Wi4gFxHVdb7Vaq69ys29rB60oj2V+RNuGpNO84VZSuQDtNxTpCfItsOFFR7zmaPB1zNiraZrLxgGFFltsyH1EnZctwzAieng0TYueKBbSRgt3QRCGw6HjOJZl0Sc7Vty82Wzm9LmPfFEUxdvRF9oVH3rWInqSYTfk7tpY9rxVrVZzHCd07vLodBYKBdu2h8Ohqqrj8TiPt22TyaTdbo9Go0aj4asT6S3He9/73tANTdMMjgchhAiCENEc34EjBqi7eZC74ncP4RwlpdVqef/0DYZa9iyjYRjrxjuiI7l7K49lfkTbxrZt2rz5yEc+ErptvOYNnxLMBWi/oUhPUKvVWtaFw9Xc0KuIGXtdtmTWsjlQCoUC7f2YTCYcBjENw4heBGw2m8myvGxCWNgC+sSHaZreLkRN04JLTwbVarXc1X/5ZRgGq2z6/b6vM8a2bV8FTNtnuesZhhhydG1YlhVsSReLxeFwuKxVRKd8JYScP38+Ys/0acG8PBpD5/xa9v8G3/zSl77ke8dxnHq93mg0QpcHWeVQ5OuIgQ/qbk7kqPjdWzhHifDFOHyjz0LHT9m27YvYQmy5KPNXb9uwh2KD4xM3b95wJY1csOftNxTpSRFFMXRwJ13zbfvp2USc2KthGKGljKqqEZcLh1O+WpYly7IoiquMrp9MJoeHh7Is5+4c7wbbtkulUvACUxSl1+st6wwRBEFVVfQgbVOhUDBNs9frFYtFQkij0RBFUX5duVxmeU0QhGazSddCzTTJsCU5ujaCNwmqqtJFNkO/7/1oN1qZdAWMcrnc7XZXf/rs6aefZt2rdHTw4eFh6LquNJCN+nTnoe7mRI6K373F7Tmic3Fu4YfS4AulsUnwvGLXRCiggjgv8+O1bQghDz744G43b5ALEsdtkZ5HsiwHb83yeMN1cHJyQgjRdd27ZmK0J5544sqVK743z507d9ddd0Vs9dxzz33nO98hhBQKheuuu45ucu2119LXmTg+Pp5OpzQlZ86cYam66qqr2Hdeed1rr7125cqVX/7yl2fOnLnrrruuvfbarJK9G9jDvGxMdLRHH330pptueutb3xr66Wuvvfb000+/8MILrF4sFArnz5+/6aabvGeTH/RyeuGFF375y19633/LW97y9a9/nax8WFL1ox/96Omnn6av77zzzujRfKGee+65+Xz+yiuveEe7FwoFmvHf8pa3ZHh2Xnvttfl87i3Kzp07d/78+aeffpr+1/H+5QjseAaXuVzdsmR/+9vfpgd5k52vyPv4QuyjxPO18corrzz22GPsz2uuueYd73hHxL/53HPPPfXUUzQvnzlz5p577tlGKlcQIwt///vf/8lPfrLKzn07ZEX6mTNnbrrppldeeeVnP/tZ6Ib0CxcvXuSwcN680NsQPYw8lP+hvMfn4sWLy2pkrz2pu6+++uof/vCHZOXDsondqJrZf7FJRju1Ht9ChRgUI5sEZXKOWMppsp999tnnnnvOm4CLFy/GKLq30Nyaz+ff+MY3SFgV7KvU3ve+9/nSz+5P17W16p79d1soXpb99Oq/zmeZH7tt483OOWrerHuXzX8uiCeRvOPNBbGbZzxUu7Gx+75MqlQvX0befpFIPJmLBA7ISs/3n5ycnJycRE+DDQAAAAAAAAAAAABr+fW4V8uyVhz3+tWvfvWJJ57wvXnp0qV77703+OWnnnrq0Ucfff7551fZ8w033HDPPffceuutq3w5QQ899NAPfvCDG2644eLFi4SQ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", "text/plain": [ "" ] }, "metadata": { "image/png": { "width": 1374.75 } }, "output_type": "display_data" } ], "source": [ "w = getWorkspace()\n", "w.scorestruct = ScoreStruct('''\n", " 4/4, 60\n", " 2/4\n", " 3/8\n", " 3/4\n", " .\n", " .\n", " 2/4\n", " 3/8\n", " 3/4,,A\n", " 2/4\n", " .\n", " 3/4\n", " 4/4\n", " 3/4\n", " 4/4\n", " 3/4\n", " 2/4\n", " 4/4\n", " .\n", " 2/4,,B\n", "''')\n", "voice.show()" ] }, { "cell_type": "markdown", "id": "75545c29-eab8-4273-8069-74a8e473ed41", "metadata": {}, "source": [ "Play with the default instr (piano, with pedal)" ] }, { "cell_type": "code", "execution_count": 19, "id": "d28a26f4-0aba-48b3-b329-cf1dca275361", "metadata": {}, "outputs": [ { "data": { "text/html": [ "OfflineRenderer(outfile=\"tmp/oking.ogg\", 1 channels, 49.00 secs, 44100 Hz)
Soundfile: 'tmp/oking.ogg', duration: 49, sr: 44100, numchannels: 1)
\n", "\n", " \n", "
\n", "\n", " \n", " " ], "text/plain": [ "OfflineRenderer(sr=44100)" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# voice.play(instr='piano', sustain=8, gain=2)\n", "\n", "r = voice.rec(\"tmp/oking.ogg\", instr='.piano', sustain=20, nchnls=1, gain=2, fade=(0, 2))\n", "r" ] }, { "cell_type": "markdown", "id": "f62620c4-5889-4160-9fcc-ffa0643e2716", "metadata": {}, "source": [ "A dynamic curve with less contrast" ] }, { "cell_type": "code", "execution_count": 24, "id": "8779c295-fee5-44bf-b880-e7f55cb8d003", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAj4AAAGdCAYAAAASUnlxAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAPVlJREFUeJzt3Xl8lOW9///3ZJkJ2SYrWUhICEGWsBoEgyCiLeC3PR7ayrfVUxVLcalbFU+FhxZFj8WtuFBb66lYf+d4FFH71dZ6Ciq1lEUUEpAlSNiyL5BkJgkwWeb+/REyEsOSQJJ7ltfz8ZiHuZe587lIYN7e13Vfl8UwDEMAAAABIMjsAgAAAPoLwQcAAAQMgg8AAAgYBB8AABAwCD4AACBgEHwAAEDAIPgAAICAQfABAAABI8TsAryN2+1WeXm5oqKiZLFYzC4HAAB0g2EYamhoUGpqqoKCznxfh+DzDeXl5UpPTze7DAAAcB5KSkqUlpZ2xuMEn2+IioqS1P4HFx0dbXI1AACgO5xOp9LT0z2f42dC8PmGju6t6Ohogg8AAD7mXMNUGNwMAAACBsEHAAAEDIIPAAAIGAQfAAAQMAg+AAAgYBB8AABAwCD4AACAgEHwAQAAAYPgAwAAAoZfBp8XX3xRmZmZCgsL0+TJk7VlyxazSwIAAF7A74LPqlWrdN999+nhhx/Wtm3bNG7cOM2aNUvV1dVmlwYAAEzmd8Fn+fLlWrBggW6++WaNGjVKL730ksLDw7Vy5UqzSwMAACbzq0VKm5ubtXXrVi1evNizLygoSN/61re0adOm077H5XLJ5XJ5tp1OZ5/XCQBAoDAMQ9UNLu0sc2hnmVPVDSf0+PfGmFaPXwWfI0eOqK2tTUlJSZ32JyUlqbCw8LTvWbZsmZYuXdof5QEA4NcMw1Bp3fH2kFPu0K5yp3aWOXWk0dXpvEVXj1BUWKgpNfpV8Dkfixcv1n333efZdjqdSk9PN7EiAAC8X5vb0MEjTdpV7tDOso6Q45DzRGuXc4Ms0rCBUcoZFK2cVLsME+rt4FfBJyEhQcHBwaqqquq0v6qqSsnJyad9j81mk81m64/yAADwSS1tbu2ratTOcod2nww4uyucOtbc1uVca3CQhidHafSgaI1KtWt0arRGJEdrgDXYhMq78qvgY7ValZubq48//lhz5syRJLndbn388ce68847zS0OAAAfcKKlTYWVDZ67OLvKHSqsaFBzm7vLuQNCgzUqNVqjU9vv5OQMitawgVGyhnjvs1N+FXwk6b777tNNN92kiRMnatKkSXruuefU1NSkm2++2ezSAADwKo2uVs8dnI6Qs6+6UW3urp1RUWEhGp1q1+iT3VWjB0VrSEKkgoMsJlR+/vwu+Pzwhz9UTU2NlixZosrKSo0fP17/+7//22XAMwAAgaSuqbl9HM7JQce7yhw6eLRJxmkG3MRHWDV6kF05qdEaPciu0al2pccNkMXiWyHndCyGcbomBy6n0ym73S6Hw6Ho6GizywEAoMeqnSe0s7z98fFdJ/9bVn/8tOem2sOU0xFyUu0aPciupGibz4Wc7n5++90dHwAAAkXH4+O7yr9+qmpnuVM1Da7Tnp8ZH94p5OSkRis+MrAe8CH4AADgA9xuQwePNrU/UXWyy2pnmVOO4y1dzg2ySNkDI9sHHJ/srhqVGq1ok+bO8SYEHwAAvIxhGCp3nFBBcb0KSuq0vcShXeUONZ3m8fHQYIuGJ0cpJ+XkwONBdo30osfHvQ3BBwAAkzlPtGhHiUPbS+uVX1yvgpL6LrMdS1JYaJBGpXz9VFVOql0XJXn34+PehuADAEA/amlza29lg/JL6rW9pD3k7K9p7PJ0VUiQRSNSojQ+PUbj02M1Ns2uoYm+9/i4tyH4AADQRzoGHxecDDjbS+r1ZZlDrtaukwGmxw3Q+PRYjUuza8LgGOWk2hUWSndVbyP4AADQSxzHW7SjtP7k2Jx6bS+t15HG5i7nRYeFaFx6jCakx2jcyVdCgD1dZRaCDwAA56G51a3CSqe2l9Qr/+QdnQM1TV3OCw22aGRK9Mkuq/aQMyQ+QkF0WZmC4AMAwDkYhqGS2uPKL6nzdFntLHeq+TRdVhnx4RqX1h5yxg+O0aiUaLqsvAjBBwCAb3Aca1GBp8uqTttLHapt6tplZR8Q6rmL09FtFRdhNaFidBfBBwAQ0Jpb3dpT4fQMQC4oqdfBI127rKzBQRqZGn0y4Ng1Pj1WmfHhPre0Q6Aj+AAAAoZhGDp89FinkLO73Knmtq5dVpnx4Z3G5YxKjZYthC4rX0fwAQD4rfpjze0Dj4vbn7DaXlKvumNdl3iIDQ/VuJMhZ3x6jMalxSiWLiu/RPABAPiNsvrj+vxgrbYcqtXnB2u1r7qxyznW4CDlDIrWuLQYTRjcHnQGx9FlFSgIPgAAn2QYhoqqGz0h5/NDdSqrP97lvKyECE931fj0GI1MiWaJhwBG8AEA+ISWNrd2ljn0+aH2kPPFodou3VbBQRaNTo3WJZlxumRInC7JjOMpK3RC8AEAeKVjza3KL67XloO1+vxQrfKL63W8pfPq5GGhQZqQHqtLhsRpUmacJgyOUYSNjzacGb8dAACvUNfUfPJuTq22HKrTrjKHWt2dV+60DwjVJZmxnjs6o1PtdFuhRwg+AABTdGcgcoo9zBNyJmXGadjASJZ6wAUh+AAA+lx3ByIPTYzQpJNjcy7JjFNa7ACetkKvIvgAAHpdS5tbu8qdnjs63RmIPDEjVvGsUI4+RvABAFywY82tKiiub7+jc6hW2w4zEBneid84AECPMRAZvorgAwA4JwYiw18QfAAAnRiGof01jfrsIAOR4X8IPgAA1TS4tKHoiNbvO6J/FtWoyunqdDw4yKKcjoHImXG6JJOByPBNBB8ACEDHm9u05VCt/rmvRuv3HVFhZUOn47aQIE0YHKNJJ7uuLh4cy0Bk+AV+iwEgALjdhnZXOD13dD4/VKfmVnenc3JSozV1WIKmZSdqYmaswkKDTaoW6DsEHwDwU2X1xz13dDbuP6rapuZOx1PsYZqanaCpwxJ0WXaCEui6QgAg+ACAn2g40aLNB2q1fl+N/rnviA4caep0PMIarLyh8SfDTqKGJkYwGBkBh+ADAD6qtc2t7aX17d1X+44ov6RebafMpRNkkcalx2jasERNG5ag8ekxCg1mHh0ENr8KPpmZmTp8+HCnfcuWLdOiRYtMqggAeo9hGDp4pEn/PPn01eb9R9Xgau10TmZ8uKYOS9DU7ETlDY2XfUCoSdUC3smvgo8kPfroo1qwYIFnOyoqysRqAODC1DU1a8P+9js66/cd6TKfTkx4qC4bmnAy7CQoPS7cpEoB3+B3wScqKkrJyclmlwEA58XV2qath+q0vqg97Owsd8g4ZSWI0GCLcjNiNW1YoqZmJ2j0ILuCmR0Z6DaLYRjGuU/zDZmZmTpx4oRaWlo0ePBgXX/99br33nsVEnLmfOdyueRyfT1Rl9PpVHp6uhwOh6Kjo/ujbAABzDAM7a1q0Pqvjmh90RFtOXhUJ1o6P2Y+PCmq/Y7OsARNHhKncKvf/T8rcMGcTqfsdvs5P7/96m/P3XffrYsvvlhxcXHauHGjFi9erIqKCi1fvvyM71m2bJmWLl3aj1UCCHRVzhP6574j+mdR+6umofMsyYlRNk3NTtC0k91XA6PDTKoU8D9ef8dn0aJFevLJJ896zp49ezRixIgu+1euXKlbb71VjY2NstlOPz8Fd3wA9LVjza367ECtZ/LAr6o6L/AZFhqkyUPi24POsAQNT4riMXOgh7p7x8frg09NTY2OHj161nOysrJktVq77N+1a5dGjx6twsJCDR8+vFvfr7t/cABwJm1uQzvLHCefvqrR1sN1amn7+p9ai0UaM8jumTwwNyNWthBmSQYuhN90dSUmJioxMfG83ltQUKCgoCANHDiwl6sCgM4cx1r0cWGVPt5TrQ37j6j+WEun44NiBnju6Fw2NEGxEV3/Zw1A3/P64NNdmzZt0meffaYZM2YoKipKmzZt0r333qsf//jHio2NNbs8AH6ownFca3ZVac3uSm0+UNtp8sAoW4jyhnZ0XyUqMz6c7ivAC/hN8LHZbHrzzTf1yCOPyOVyaciQIbr33nt13333mV0aAD9hGIaKqhu1ZneV/rarUjtKHZ2OD0+K0sycJF0xfKDGpdkVwizJgNfxm+Bz8cUXa/PmzWaXAcDPuN2G8kvqtWZ3pdbuquq0/pXFIuUOjtXMnCTNHJWszIQIEysF0B1+E3wAoLc0t7q16cBR/W1Xpdburur0uLk1OEhTsuM1KydZV40cqIFRPGoO+BKCDwBIanS16u97q7VmV5XWFVZ3WgMr0haiGSMGalZOkqZflKioMNa/AnwVwQdAwKppcOmjPVVas6tSG4qOqrnt6xmTE6Ns+vaoJM0claS8ofE8bg74CYIPgIBy+GiT1uxqH5y8tbiu0zpYmfHhmpWTrJk5yZqQHqMg1sAC/A7BB4BfMwxDu8qdWrOrUn/bVaW9VQ2djo9Ns2vmqCTNyklW9sBIHjkH/BzBB4DfaW1z6/NDdZ7ByWX1xz3HgoMsujQrTjNHJevbo5KUGjPAxEoB9DeCDwC/cLy5Tev31ehvu6r0cWFVp5mTw0KDNP2iRM3KSdaVIwYqJpxZk4FARfAB4LPqjzXr4z3VWrO7Up9+VaMTLV8PTo4JD9W3RrYPTp42LFEDrAxOBkDwAeBjyuuPa82uSq3ZXaXPDnZeJmJQzAB9++R4nUsyY5k5GUAXBB8AXs0wDO2rbtTfdraHnS/LOi8TMSI5SjNHJWlmTrJyUqMZnAzgrAg+ALxO+zIRdZ7Hzg8dPeY5ZrFIEzNiPYOTWSYCQE8QfAB4BVdrmzbuP6o1u6q0dneVjjR2XibiMs8yEUlKjLKZWCkAX0bwAWAawzD0xeE6rf6iRH/9slKNpywTEXVymYiO1c4jbfxzBeDC8S8JgH5X6Tihd7aV6u2tpTp4ymrniVE2z3idvKx4WUMYnAygdxF8APQLV2ubPtpdrbe+KNH6fTXqeBgr3Bqs/zMmRdfmpmlSZhzLRADoUwQfAH1qZ5lDq78o0XvbyztNKnhJZqzm5qbr/4xNoRsLQL/hXxsAva62qVn/L79Mq7eWak+F07M/OTpM3794kK7NTVNWYqSJFQIIVAQfAL2itc2tf+yr0eovSvXRniq1tLX3ZVmDg/TtnCTNzU3TtGGJCqYrC4CJCD4ALsj+mkat/qJU724rVXXD14+gjx4Urbm56frX8amsjQXAaxB8APRYw4kWfbCjQm99UaJtxfWe/XERVs0ZP0hzJ6ZpZEq0eQUCwBkQfAB0i9ttaPPBo3r7i1L9dWeFZ0HQIIs0Y/hAzZ2YpitHJPEIOgCvRvABcFaldcf0ztYyvb2tRCW1xz37hyZGaO7EdH1/wiANjA4zsUIA6D6CD4AuTrS06W+7KvXWFyXauP+ojJNz7kTaQvQv41I0d2K6JqTHsCAoAJ9D8AEgqX35iO2lDr31RYn+vL1cDSe+Xj5iytB4zZ2Yptk5KRpgDTaxSgC4MAQfIMDVNLj0p/xSrf6iVPuqGz37B8UM0LW5abo2N03pceEmVggAvYfgAwSglja3Pims1uovSrVub7XaTq4fYQsJ0tWjkzV3YrrysuJZPgKA3yH4AAFkb2WDVn9Roj/ll+loU7Nn//j0GP3fien67rgURYeFmlghAPQtgg/g5xzHWvT+jnKt/qJEO0odnv0JkTb94OTyEcOSokysEAD6D8EH8ENtbkMbio5o9dZS/W1XpZpb2+fcCQmy6KqRAzU3N13ThycqNJg5dwAEFoIP4EcOH23S21tL9c7WUpU7Tnj2j0iO0tyJ6ZozPlXxkTYTKwQAcxF8AB93rLlVf/2yfc6dLQdrPfujw0I0Z8Igzc1N1+hB0cy5AwDyoeDz+OOP64MPPlBBQYGsVqvq6+u7nFNcXKzbb79d69atU2RkpG666SYtW7ZMISE+00yg26qcJ/T7Tw9o1efFampukyRZLNK0YYmam5umb49KUlgoc+4AwKl8JhE0Nzdr7ty5ysvL0yuvvNLleFtbm77zne8oOTlZGzduVEVFhW688UaFhobqV7/6lQkVA32jvP64Xvp0v978vMQzdiczPlzX5qbp+xenKTVmgMkVAoD3shhGx2T0vuGPf/yjfv7zn3e54/Phhx/qu9/9rsrLy5WUlCRJeumll/TAAw+opqZGVqu1W9d3Op2y2+1yOByKjmZ1aXiPktpj+t2n+7X6ixK1tLX/tZ2YEau7rhqmy4cl0JUFIKB19/PbZ+74nMumTZs0ZswYT+iRpFmzZun222/Xrl27NGHChNO+z+VyyeVyebadTmef1wr0xOGjTXpxXZHe3Vam1pMTDV6aFae7rxqmvKx4Ag8A9IDfBJ/KyspOoUeSZ7uysvKM71u2bJmWLl3ap7UB52N/TaNeXFek9wrKPTMrTxuWoLuuHKZJQ+JMrg4AfJOpk3gsWrRIFovlrK/CwsI+rWHx4sVyOByeV0lJSZ9+P+Bc9lU16O438vXt5Z/q3W1lanMbmjE8Ue/+bIr+a/5kQg8AXABT7/gsXLhQ8+bNO+s5WVlZ3bpWcnKytmzZ0mlfVVWV59iZ2Gw22WzMawLz7alw6jefFOmvOyvUMfLuWyOTdPdV2RqbFmNqbQDgL0wNPomJiUpMTOyVa+Xl5enxxx9XdXW1Bg4cKElau3atoqOjNWrUqF75HkBf2Fnm0Asf79Oa3VWefbNzknXnldkaPchuYmUA4H98ZoxPcXGxamtrVVxcrLa2NhUUFEiSsrOzFRkZqZkzZ2rUqFG64YYb9NRTT6myslIPPfSQ7rjjDu7owCsVlNRrxcf79HFhtaT2OXi+MyZFd16ZrRHJPFEIAH3BZx5nnzdvnl577bUu+9etW6crrrhCknT48GHdfvvt+vvf/66IiAjddNNNeuKJJ3o0gSGPs6OvbT1cq+c/LtI/vqqRJAVZpGvGperOK7OVPZDFQgHgfHT389tngk9/Ifigr2w+cFQrPtmnDUVHJUnBQRZ9b8Ig3TEjW0MSIkyuDgB8W8DN4wN4I8MwtHH/UT3/8T7POlohQRZdm5umn12RrcHx4SZXCACBheAD9AHDMPTpVzV64eN92lZcL0myBgfp/16SptumD1VaLIEHAMxA8AF6kWEY+qSwWi98vE/bSx2SJFtIkK6bNFi3Ts9Sip11tADATAQfoBe43YbW7K7Sik/2aVd5+7InYaFB+vHkDN1yeZYGRoeZXCEAQCL4ABfE7Tb04c5KrfhknworGyRJ4dZg3ZCXoQXTspQQyVQKAOBNCD7AeWhzG/rLjnL95pMi7atulCRF2kI0b0qmfjJ1iOIirCZXCAA4HYIP0AOtbW69V1CuF9cV6cCRJklSVFiIfnLZEP3ksiGyh4eaXCEA4GwIPkA3NLe69af8Ur24br+Ka49JkmLCQ/XTqUN045RMRYcReADAFxB8gLNwtbbp7a2l+u26/SqrPy5Jio+w6qfTsnRDXoYibfwVAgBfwr/awGmcaGnTqs9L9NKn+1XhOCFJSoi06bbpWbp+8mCFW/mrAwC+iH+9gVMcb27T/2wp1u8/3a/qBpckKSnaptumD9V1kwYrLDTY5AoBABeC4ANIanK16r83H9Z/rj+gI43NkqRUe5hun5GtublpBB4A8BMEHwS0hhMt+v82HdYf1h9Q3bEWSVJa7ADdMSNbP7g4TdaQIJMrBAD0JoIPApLzRIte/echrdxwUI7j7YEnMz5cd8zI1pwJgxQaTOABAH9E8EHA2Xq4Vne/UeB5SisrMUJ3XZmtfxmbqhACDwD4NYIPAkab29BLn+7X8rVfqc1taHBcuO6fNVzfGZOi4CCL2eUBAPoBwQcBodp5Qj9fVaCN+49Kkv51fKr+Y85oRTHxIAAEFIIP/N66vdW6/63tOtrUrAGhwXr0X3N0bW6aLBbu8gBAoCH4wG81t7r19N8K9Z/rD0qSRqZEa8V1E5Q9MNLkygAAZiH4wC8dPtqku97I145ShyRp3pRMLbp6BPPxAECAI/jA77xXUKYH/7RTja5WxYSH6qkfjNXMnGSzywIAeAGCD/zGseZWPfzeLq3eWipJmpQZp+d+NF6pMQNMrgwA4C0IPvALu8uduuuNbdpf06Qgi3TnlcN095XZzMsDAOiE4AOfZhiG/mvzYf3HB3vU3OpWUrRNz/1wgvKGxptdGgDACxF84LPqjzXrF2/v0JrdVZKkq0YM1NNzxykuwmpyZQAAb0XwgU/6/FCt7nkjX+WOE7IGB2nR1SN082WZzM0DADgrgg98Spvb0IvrivTcR1/JbUhDEiK04roJGj3IbnZpAAAfQPCBz6h0nNDPV+Vr84FaSdL3JwzSo3NGK9LGrzEAoHv4xIBP+KSwSgvf2q66Yy0KtwbrsX8drR/kppldFgDAxxB84NVcrW168sO9WrmhfdmJnNT2ZSeyEll2AgDQcwQfeK2DR5p01xvbtLPMKUn6yWVD9MDVw2ULYdkJAMD58ZnZ3R5//HFNmTJF4eHhiomJOe05Fouly+vNN9/s30LRK/6UX6rvvrBeO8ucig0P1R9unKgl/zKK0AMAuCA+c8enublZc+fOVV5enl555ZUznvfqq69q9uzZnu0zhSR4pyZXq3753k69u61MkjR5SJye/9EEJdvDTK4MAOAPfCb4LF26VJL0xz/+8aznxcTEKDmZBSl90c4yh+5+I18HjrQvO3HPVRfpziuzFRzE3DwAgN7hM11d3XXHHXcoISFBkyZN0sqVK2UYxlnPd7lccjqdnV7oX4Zh6NUNB/X9327UgSNNSrGH6Y0Fl+qebw0j9AAAepXP3PHpjkcffVRXXnmlwsPDtWbNGv3sZz9TY2Oj7r777jO+Z9myZZ67Seh/tU3N+sXb2/XRnmpJ0rdHJempH4xVLMtOAAD6gMU41y2RPrRo0SI9+eSTZz1nz549GjFihGf7j3/8o37+85+rvr7+nNdfsmSJXn31VZWUlJzxHJfLJZfL5dl2Op1KT0+Xw+FQdHT0uRuB87b5wFH9/M0CVTrbl5148DsjdWNeBstOAAB6zOl0ym63n/Pz29Q7PgsXLtS8efPOek5WVtZ5X3/y5Ml67LHH5HK5ZLPZTnuOzWY74zH0jTa3oRc+3qcVn+yT25CyEtuXnchJZdkJAEDfMjX4JCYmKjExsc+uX1BQoNjYWIKNF6lwHNc9bxZoy8H2ZSeuzU3T0mtyFMGyEwCAfuAznzbFxcWqra1VcXGx2traVFBQIEnKzs5WZGSk/vznP6uqqkqXXnqpwsLCtHbtWv3qV7/S/fffb27h8Fi7u0r//vZ21R9rUYQ1WI9/b4zmTBhkdlkAgADiM8FnyZIleu211zzbEyZMkCStW7dOV1xxhUJDQ/Xiiy/q3nvvlWEYys7O1vLly7VgwQKzSsZJJ1ra9MSHhfrjxkOSpDGD7Fpx3QRlJkSYWxgAIOCYOrjZG3V3cBS6Z39No+76n3ztrmifJuCnU4foF7NHyBridzMpAABM5BODm+G/DMPQO9vKtOS9nTrW3Ka4CKt+PXecZowYaHZpAIAARvBBr2t0teqX/2+n/pTfvuxEXla8nvvReCVFs+wEAMBcBB/0qi9LHbrrjW06dPSYgoMsuvdbw3T7FSw7AQDwDgQf9ArDMPTKPw/qyf8tVEuboUExA/T8j8ZrYmac2aUBAOBB8MEFO9ro0v2rt2vd3hpJ0qycJD31g3Gyh4eaXBkAAJ0RfHBBNu4/op+/WaDqBpesIUH65XdH6ceTB7PsBADAKxF8cF5a29zty06sK5JhSNkDI7XiugkamcIUAAAA70XwQY+V1R/Xz9/M1+eH6iRJP5yYroevGaVwK79OAADvxicVemT9vhrd+T/5chxvUaQtRL/6/hhdMy7V7LIAAOgWgg+6zTAMLXxruxzHWzQuza4V112swfHhZpcFAEC3EXzQbfuqG1Xd4JItJEirbs1TWGiw2SUBANAjLJiEbttYdESSdElmHKEHAOCTCD7oto37j0qSpmTHm1wJAADnh+CDbmlzG9p84GTwGZpgcjUAAJwfgg+6ZXe5U84TrYqyhWh0KnP1AAB8E8EH3bJxf/v4nslZcQoJ5tcGAOCb+ARDt3SM78mjmwsA4MMIPjin5la3thyslSRNGcrAZgCA7yL44Jy2l9breEub4iKsGp4UZXY5AACcN4IPzmlj0clurqx4BQWx6joAwHcRfHBOHQOb8+jmAgD4OIIPzup4c5vyi+slSZdlM7AZAODbCD44q62H69Tc5laKPUyZLEgKAPBxBB+c1andXBYL43sAAL6N4IOz8qzPxfw9AAA/QPDBGTlPtGhHab0kBjYDAPwDwQdntOVArdyGlBkfrkExA8wuBwCAC0bwwRmxTAUAwN8QfHBGHQObWaYCAOAvQi70Ak1NTVq1apWOHz+umTNnatiwYb1RF0x2tNGlwsoGSYzvAQD4jx7d8SkuLtb06dMVFRWlb3/72youLtbFF1+sn/70p7rrrrs0fvx4/eMf/+irWtGPNh9oX5R0RHKUEiJtJlcDAEDv6FHwuf/++9Xc3KyXXnpJ4eHhmjVrloYNG6aKigpVVVXp6quv1iOPPNLrRR46dEjz58/XkCFDNGDAAA0dOlQPP/ywmpubO523Y8cOTZs2TWFhYUpPT9dTTz3V67UECpapAAD4ox51df3jH//Q+++/r0mTJunqq69WQkKCVq5cqaSkJEnSL3/5S1111VW9XmRhYaHcbrd+//vfKzs7Wzt37tSCBQvU1NSkZ555RpLkdDo1c+ZMfetb39JLL72kL7/8Uj/5yU8UExOjW265pddr8nebmL8HAOCHehR8qqurlZGRIUmKi4tTeHi4J/RIUnJysurq6nq3QkmzZ8/W7NmzPdtZWVnau3evfve733mCz+uvv67m5matXLlSVqtVOTk5Kigo0PLlywk+PVThOK4DR5oUZJEmDYkzuxwAAHpNj5/qOnXZAjOXMHA4HIqL+/pDedOmTbr88stltVo9+2bNmqW9e/eeNYy5XC45nc5Or0DXcbdnzCC77ANCTa4GAIDe0+OnupYsWaLw8PbFKpubm/X444/LbrdLko4dO9a71Z1BUVGRVqxY4bnbI0mVlZUaMmRIp/M67kZVVlYqNjb2tNdatmyZli5d2nfF+qANRczfAwDwTz2643P55Zdr7969ys/PV35+vqZMmaIDBw54tvfu3avLL7+829dbtGiRLBbLWV+FhYWd3lNWVqbZs2dr7ty5WrBgQU/KP63FixfL4XB4XiUlJRd8TV9mGIY2MX8PAMBP9eiOz9///vde/eYLFy7UvHnzznpOVlaW5+vy8nLNmDFDU6ZM0csvv9zpvOTkZFVVVXXa17GdnJx8xuvbbDbZbDyu3eHw0WMqd5xQaLBFEzNPf5cMAABf1e3gc99993X7osuXL+/WeYmJiUpMTOzWuWVlZZoxY4Zyc3P16quvKiio882qvLw8Pfjgg2ppaVFoaPu4lLVr12r48OFn7OZCVx3LVEwYHKtw6wXPbwkAgFfp9idbfn5+p+1t27aptbVVw4cPlyR99dVXCg4OVm5ubu9WqPbQc8UVVygjI0PPPPOMampqPMc67uZcf/31Wrp0qebPn68HHnhAO3fu1PPPP69nn3221+vxZyxTAQDwZ90OPuvWrfN8vXz5ckVFRem1117z3E2pq6vTzTffrGnTpvV6kWvXrlVRUZGKioqUlpbW6ZhhGJIku92uNWvW6I477lBubq4SEhK0ZMkSHmXvgfbxPczfAwDwXxajIzn0wKBBg7RmzRrl5OR02r9z507NnDlT5eXlvVZgf3M6nbLb7XI4HIqOjja7nH61t7JBs577h8JCg7Tj4VmyhrCGLQDAN3T38/u8PtmcTmen7qYONTU1amhoOJ9Lwgt0dHNdkhlH6AEA+KXz+nT73ve+p5tvvlnvvvuuSktLVVpaqnfeeUfz58/X97///d6uEf1kI91cAAA/d16P7bz00ku6//77df3116ulpaX9QiEhmj9/vp5++uleLRD9o7XNrc0HOoIPA5sBAP7pvIJPeHi4fvvb3+rpp5/W/v37JUlDhw5VRERErxaH/rOr3KmGE62KCgvR6EF2s8sBAKBPXNBELRERERo7dmxv1QITdXRzXZoVr+Ag89ZgAwCgLzGCFZKYvwcAEBgIPlBzq1ufH6qVxMBmAIB/I/hABSX1OtHiVnyEVRclRZpdDgAAfYbgA083V97QeFksjO8BAPgvgg+YvwcAEDAIPgHueHOb8ovrJDGwGQDg/wg+Ae7zQ7VqaTOUag9TRny42eUAANCnCD4BrqObK29oAuN7AAB+j+AT4DadHNh8WTbdXAAA/0fwCWCO4y36sswhqf2JLgAA/B3BJ4BtOVgrtyFlJUQoxT7A7HIAAOhzBJ8Adur8PQAABAKCTwDbxPw9AIAAQ/AJUEcaXSqsbJAkXZoVZ3I1AAD0D4JPgOq42zMiOUrxkTaTqwEAoH8QfAIUy1QAAAIRwSdAMX8PACAQEXwCUFn9cR06ekzBQRZNGsL4HgBA4CD4BKCO8T1jBtkVFRZqcjUAAPQfgk8A6pi/h9XYAQCBhuATYAzDYP4eAEDAIvgEmENHj6nCcULW4CDlZsSaXQ4AAP2K4BNgOrq5JgyO0QBrsMnVAADQvwg+AWZjEd1cAIDARfAJIG63oU0HTgYf5u8BAAQggk8A2VvVoNqmZoVbgzUuLcbscgAA6Hc+EXwOHTqk+fPna8iQIRowYICGDh2qhx9+WM3NzZ3OsVgsXV6bN282sXLv0rFMxSWZcbKG+MSPHgCAXhVidgHdUVhYKLfbrd///vfKzs7Wzp07tWDBAjU1NemZZ57pdO5HH32knJwcz3Z8PF06HTYxfw8AIMD5RPCZPXu2Zs+e7dnOysrS3r179bvf/a5L8ImPj1dycnJ/l+j1Wtvc+uxArSQGNgMAApfP9nc4HA7FxXVdZ+qaa67RwIEDNXXqVL3//vvnvI7L5ZLT6ez08kc7y51qcLUqOixEo1KjzS4HAABT+GTwKSoq0ooVK3Trrbd69kVGRurXv/61Vq9erQ8++EBTp07VnDlzzhl+li1bJrvd7nmlp6f3dfmm6Ji/59KseAUHWUyuBgAAc1gMwzDM+uaLFi3Sk08+edZz9uzZoxEjRni2y8rKNH36dF1xxRX6wx/+cNb33njjjTp48KDWr19/xnNcLpdcLpdn2+l0Kj09XQ6HQ9HR/nNn5IZXPtP6fUf0yL+M0rzLhphdDgAAvcrpdMput5/z89vUMT4LFy7UvHnzznpOVlaW5+vy8nLNmDFDU6ZM0csvv3zO60+ePFlr16496zk2m002m61b9foqV2ubPj90cnxPNuN7AACBy9Tgk5iYqMTExG6dW1ZWphkzZig3N1evvvqqgoLO3UtXUFCglJSUCy3T5+UX1+tEi1sJkTYNGxhpdjkAAJjGJ57qKisr0xVXXKGMjAw988wzqqmp8RzreILrtddek9Vq1YQJEyRJ7777rlauXHnO7rBAsNGzGnu8LBbG9wAAApdPBJ+1a9eqqKhIRUVFSktL63Ts1CFKjz32mA4fPqyQkBCNGDFCq1at0rXXXtvf5Xod5u8BAKCdqYObvVF3B0f5imPNrRr7yBq1ug39499naHB8uNklAQDQ67r7+e2Tj7Oj+z4/VKdWt6FBMQOUHjfA7HIAADAVwcfPbTylm4vxPQCAQEfw8XObOgY2ZzO+BwAAgo8fcxxr0c4yhyQpL4v5ewAAIPj4sc0Hj8ptSFmJEUq2h5ldDgAApiP4+LGObq7LWI0dAABJBB+/tpH5ewAA6ITg46dqGlz6qqpRUvuK7AAAgODjtzYdaO/mGpUSrdgIq8nVAADgHQg+foplKgAA6Irg46c2Mn8PAABdEHz8UGndMR0+ekzBQRZdkhlndjkAAHgNgo8f6niMfWyaXVFhoSZXAwCA9yD4+KGNzN8DAMBpEXz8jGEYzN8DAMAZEHz8zIEjTapyumQNCdLFGbFmlwMAgFch+PiZjm6u3MGxCgsNNrkaAAC8C8HHzzB/DwAAZ0bw8SNut+F5oov5ewAA6Irg40cKKxtUd6xF4dZgjU2LMbscAAC8DsHHj3Q8zTVpSJxCg/nRAgDwTXw6+hFPNxfjewAAOC2Cj59obXPrs4O1kqQpTFwIAMBpEXz8xI4yhxpdrbIPCNWolGizywEAwCsRfPxERzdXXla8goIsJlcDAIB3Ivj4Cc8yFTzGDgDAGRF8/MCJljZ9cahOEgObAQA4G4KPH8gvrper1a3EKJuGJkaaXQ4AAF6L4OMHTl2mwmJhfA8AAGdC8PEDG5m/BwCAbiH4+LgmV6sKSuolMX8PAADn4jPB55prrtHgwYMVFhamlJQU3XDDDSovL+90zo4dOzRt2jSFhYUpPT1dTz31lEnV9p8th2rV6jaUHjdA6XHhZpcDAIBX85ngM2PGDL311lvau3ev3nnnHe3fv1/XXnut57jT6dTMmTOVkZGhrVu36umnn9Yjjzyil19+2cSq+55nmYos7vYAAHAuIWYX0F333nuv5+uMjAwtWrRIc+bMUUtLi0JDQ/X666+rublZK1eulNVqVU5OjgoKCrR8+XLdcsstJlbet5i/BwCA7vOZOz6nqq2t1euvv64pU6YoNDRUkrRp0yZdfvnlslqtnvNmzZqlvXv3qq6u7ozXcrlccjqdnV6+ov5Ys3aVt9ebl0XwAQDgXHwq+DzwwAOKiIhQfHy8iouL9d5773mOVVZWKikpqdP5HduVlZVnvOayZctkt9s9r/T09L4pvg9sPlArw5CyB0ZqYHSY2eUAAOD1TA0+ixYtksViOeursLDQc/6///u/Kz8/X2vWrFFwcLBuvPFGGYZxQTUsXrxYDofD8yopKbnQZvWbU+fvAQAA52bqGJ+FCxdq3rx5Zz0nKyvL83VCQoISEhJ00UUXaeTIkUpPT9fmzZuVl5en5ORkVVVVdXpvx3ZycvIZr2+z2WSz2c6/ESZi/h4AAHrG1OCTmJioxMTE83qv2+2W1D5GR5Ly8vL04IMPegY7S9LatWs1fPhwxcbG9k7BXqS64YT2VTfKYpEuZXwPAADd4hNjfD777DP95je/UUFBgQ4fPqxPPvlE1113nYYOHaq8vDxJ0vXXXy+r1ar58+dr165dWrVqlZ5//nndd999JlffNzoeY89JjVZMuPUcZwMAAMlHgk94eLjeffddXXXVVRo+fLjmz5+vsWPH6tNPP/V0U9ntdq1Zs0YHDx5Ubm6uFi5cqCVLlvjto+wbizq6uZi/BwCA7vKJeXzGjBmjTz755JznjR07VuvXr++Hisy38UD7wOY8xvcAANBtPnHHB52V1B5TSe1xhQRZdElmnNnlAADgMwg+PqhjfM+49BhF2nziph0AAF6B4OODNjJ/DwAA54Xg42MMw/DM38P4HgAAeobg42P21zSpusElW0iQLh7sf/MTAQDQlwg+PqZjmYqJmbEKCw02uRoAAHwLwcfHbGD+HgAAzhvBx4e43YY2HWB8DwAA54vg40N2VzjlON6iSFuIxg6ym10OAAA+h+DjQzrm75k0JE4hwfzoAADoKT49fQjz9wAAcGEIPj6ipc2tLQdrJTG+BwCA80Xw8RE7Sh1qam5TTHioRiZHm10OAAA+ieDjIzrm78nLildQkMXkagAA8E0EHx/RsUzFlGzm7wEA4HwRfHzAiZY2fXG4ThIDmwEAuBAEHx+w7XCdmlvdSoq2KSshwuxyAADwWQQfH+Dp5hqaIIuF8T0AAJwvgo8P6Ji/h8fYAQC4MAQfL9foatX2UockxvcAAHChCD5e7vODtWpzGxocF6602HCzywEAwKcRfLwcy1QAANB7CD5ejvl7AADoPQQfL1bX1KzdFU5J7TM2AwCAC0Pw8WKbDxyVYUgXJUUqMcpmdjkAAPg8go8XO3X+HgAAcOEIPl6M+XsAAOhdBB8vVeU8of01TbJYpEuHEHwAAOgNBB8vtelkN9foVLvs4aEmVwMAgH8g+Hgp5u8BAKD3EXy8FPP3AADQ+3wm+FxzzTUaPHiwwsLClJKSohtuuEHl5eWe44cOHZLFYuny2rx5s4lVn5+S2mMqrTuukCCLLsmMNbscAAD8hs8EnxkzZuitt97S3r179c4772j//v269tpru5z30UcfqaKiwvPKzc01odoL09HNNWFwjMKtISZXAwCA//CZT9V7773X83VGRoYWLVqkOXPmqKWlRaGhXw/+jY+PV3Jyshkl9poNRe3dXHnM3wMAQK/ymTs+p6qtrdXrr7+uKVOmdAo9UnuX2MCBAzV16lS9//7757yWy+WS0+ns9DKTYRinTFzIwGYAAHqTTwWfBx54QBEREYqPj1dxcbHee+89z7HIyEj9+te/1urVq/XBBx9o6tSpmjNnzjnDz7Jly2S32z2v9PT0vm7GWRVVN+pIo0u2kCBNGBxjai0AAPgbi2EYhlnffNGiRXryySfPes6ePXs0YsQISdKRI0dUW1urw4cPa+nSpbLb7frLX/4ii8Vy2vfeeOONOnjwoNavX3/G67tcLrlcLs+20+lUenq6HA6HoqOjz6NVF+a1jYf08Pu7NDU7Qf/908n9/v0BAPBFTqdTdrv9nJ/fpo7xWbhwoebNm3fWc7KysjxfJyQkKCEhQRdddJFGjhyp9PR0bd68WXl5ead97+TJk7V27dqzXt9ms8lm854FQFmmAgCAvmNq8ElMTFRiYuJ5vdftdktSp7s131RQUKCUlJTzur4Z2tyGNh+olcT4HgAA+oJPPNX12Wef6fPPP9fUqVMVGxur/fv365e//KWGDh3qudvz2muvyWq1asKECZKkd999VytXrtQf/vAHM0vvkT0VTjmOtyjKFqIxg+xmlwMAgN/xieATHh6ud999Vw8//LCampqUkpKi2bNn66GHHurUTfXYY4/p8OHDCgkJ0YgRI7Rq1arTzvXjrTq6uSZnxSkk2KfGnQMA4BN8IviMGTNGn3zyyVnPuemmm3TTTTf1U0V9o+MxdubvAQCgb3BbwUs0t7q15SDjewAA6EsEHy+xo7Rex5rbFBdh1fCkKLPLAQDALxF8vISnmysrXkFBp5+XCAAAXBiCj5dg/h4AAPoewccLnGhp07bD9ZIY3wMAQF8i+HiBrYfr1NzmVoo9TEMSIswuBwAAv0Xw8QKndnOdad0xAABw4Qg+XqBjYPMU5u8BAKBPEXxM1nCiRTtKHZIY2AwAQF8j+Jhsy8FatbkNZcaHa1DMALPLAQDArxF8TMYyFQAA9B+Cj8m+Ht9DNxcAAH2N4GOi2qZm7alwSpIuzSL4AADQ1wg+Jtp8oP1uz/CkKCVG2UyuBgAA/0fwMVHH/D1TsrnbAwBAfyD4mIj5ewAA6F8EH5NUOk7oQE2TgizSpCFxZpcDAEBAIPiYZNOB9m6uMYPssg8INbkaAAACA8HHJBuKmL8HAID+RvAxgWEY2sT8PQAA9DuCjwmKa4+prP64QoMtmpgZa3Y5AAAEDIKPCTqe5pqQHqtwa4jJ1QAAEDgIPibwPMbO/D0AAPQrgk8/ax/fc3LiQgY2AwDQrwg+/WxfdaOONDYrLDRI49NjzC4HAICAQvDpZxuL2u/2XJIZJ2sIf/wAAPQnPnn72QaWqQAAwDQEn37U5jY8K7Izfw8AAP2P4NOPdpU71HCiVVFhIcpJjTa7HAAAAg7Bpx91PMY+eUi8QoL5owcAoL/x6duPNrJMBQAApvK54ONyuTR+/HhZLBYVFBR0OrZjxw5NmzZNYWFhSk9P11NPPWVOkafR3OrW5wdrJUmXZTOwGQAAM/hc8PnFL36h1NTULvudTqdmzpypjIwMbd26VU8//bQeeeQRvfzyyyZU2dX20nodb2lTfIRVFyVFml0OAAAByacWivrwww+1Zs0avfPOO/rwww87HXv99dfV3NyslStXymq1KicnRwUFBVq+fLluueUWkyr+2sai9m6uvKHxslgsJlcDAEBg8pk7PlVVVVqwYIH+67/+S+Hh4V2Ob9q0SZdffrmsVqtn36xZs7R3717V1dWd8boul0tOp7PTqy9sZJkKAABM5xPBxzAMzZs3T7fddpsmTpx42nMqKyuVlJTUaV/HdmVl5RmvvWzZMtntds8rPT299wo/6Xhzm/KL6yUxsBkAADOZGnwWLVoki8Vy1ldhYaFWrFihhoYGLV68uNdrWLx4sRwOh+dVUlLS69/DkKGHrxml6yYNVkZ817tVAACgf5g6xmfhwoWaN2/eWc/JysrSJ598ok2bNslms3U6NnHiRP3bv/2bXnvtNSUnJ6uqqqrT8Y7t5OTkM17fZrN1uW5vC7eG6N8mZ/Tp9wAAAOdmavBJTExUYmLiOc974YUX9B//8R+e7fLycs2aNUurVq3S5MmTJUl5eXl68MEH1dLSotDQUEnS2rVrNXz4cMXGxvZNAwAAgE/xiae6Bg8e3Gk7MrL9cfChQ4cqLS1NknT99ddr6dKlmj9/vh544AHt3LlTzz//vJ599tl+rxcAAHgnnwg+3WG327VmzRrdcccdys3NVUJCgpYsWeIVj7IDAADvYDEMwzC7CG/idDplt9vlcDgUHc1CogAA+ILufn77xOPsAAAAvYHgAwAAAgbBBwAABAyCDwAACBgEHwAAEDAIPgAAIGAQfAAAQMAg+AAAgIBB8AEAAAHDb5as6C0dE1k7nU6TKwEAAN3V8bl9rgUpCD7f0NDQIElKT083uRIAANBTDQ0NstvtZzzOWl3f4Ha7VV5erqioKFksll67rtPpVHp6ukpKSnx6DTDa4V1oh/fxl7bQDu9CO87NMAw1NDQoNTVVQUFnHsnDHZ9vCAoKUlpaWp9dPzo62qd/aTvQDu9CO7yPv7SFdngX2nF2Z7vT04HBzQAAIGAQfAAAQMAg+PQTm82mhx9+WDabzexSLgjt8C60w/v4S1toh3ehHb2Hwc0AACBgcMcHAAAEDIIPAAAIGAQfAAAQMAg+ANAPNmzYoDFjxig0NFRz5swxu5xzMgxDt9xyi+Li4mSxWFRQUGB2Sd32zdrz8/N9qi3dqd9bfz7nW3u/tscAAPS5SZMmGT/+8Y+NkpISo66uzuxyzumvf/2rERoaamzYsMGoqKgwWlpazC6p275Z+/vvv+9TbelO/d768znf2vuzPczcDAD9YP/+/brtttv6dGb43rR//36lpKRoypQpZpfSY9+s/fDhwz7Vlu7U760/n/OtvV/b02eRyg9Nnz7duOOOO4w77rjDiI6ONuLj442HHnrIcLvdhmEYRkZGhvHoo48aP/rRj4zw8HAjNTXV+M1vftPpGpKM3/72t8bs2bONsLAwY8iQIcbq1as9xw8ePGhIMt544w0jLy/PsNlsRk5OjvH3v//dp9tllt5omzc6V7u8zfTp040777zTuOeee4yYmBhj4MCBxssvv2w0NjYa8+bNMyIjI42hQ4caf/3rXw3DMIx169YZkoy//OUvxpgxYwybzWZMnjzZ+PLLL01uSbuetKfj7/Spr1dffdXsJpzVTTfd1KnejIwMs0vqttPV7ktt6U793vrzOd/a+7s9BJ8emD59uhEZGWncc889RmFhofHf//3fRnh4uPHyyy8bhtH+IRoVFWUsW7bM2Lt3r/HCCy8YwcHBxpo1azzXkGTEx8cb//mf/2ns3bvXeOihh4zg4GBj9+7dhmF8HXzS0tKMt99+29i9e7fx05/+1IiKijKOHDnis+0yS2+0zRudq13eZvr06UZUVJTx2GOPGV999ZXx2GOPGcHBwcbVV19tvPzyy8ZXX31l3H777UZ8fLzR1NTkCT4jR4401qxZY+zYscP47ne/a2RmZhrNzc1mN6dH7WlsbDQqKiqM6Oho47nnnjMqKiqMY8eOmd2Es6qvrzceffRRIy0tzaioqDCqq6vNLqnbvln7oUOHfKot3anfW38+51t7f7eH4NMD06dPN0aOHNnp/6ofeOABY+TIkYZhtH+Izp49u9N7fvjDHxpXX321Z1uScdttt3U6Z/Lkycbtt99uGMbXweeJJ57wHG9paTHS0tKMJ598stfbZBj90y6z9EbbvNG52uVtpk+fbkydOtWz3draakRERBg33HCDZ19FRYUhydi0aZMn+Lz55pue40ePHjUGDBhgrFq1ql9rP52etscwDMNut3v9nZ5TPfvss15zJ6Gnvlm7r7WlO/V7a5vOt/b+bA9PdfXQpZdeKovF4tnOy8vTvn371NbW5tk+VV5envbs2dNlX0/OCQkJ0cSJE7uc05v6q11m6I22eaNztcvbjB071vN1cHCw4uPjNWbMGM++pKQkSVJ1dbVn36k/m7i4OA0fPtxrfjbn0x4A5iP4AOgXoaGhnbYtFkunfR0hzu1292td58vf2gMECoJPD3322Wedtjdv3qxhw4YpODjYs/3N4yNHjuyyryfntLa2auvWrV3O6U391S4z9EbbvNG52uUPTv3Z1NXV6auvvvKJnw0A78Xj7D1UXFys++67T7feequ2bdumFStW6Ne//rXn+IYNG/TUU09pzpw5Wrt2rVavXq0PPvig0zVWr16tiRMnaurUqXr99de1ZcsWvfLKK53OefHFFzVs2DCNHDlSzz77rOrq6vSTn/zE59tlht5omzc6V7v8waOPPqr4+HglJSXpwQcfVEJCgk9M/gfAexF8eujGG2/U8ePHNWnSJAUHB+uee+7RLbfc4jm+cOFCffHFF1q6dKmio6O1fPlyzZo1q9M1li5dqjfffFM/+9nPlJKSojfeeEOjRo3qdM4TTzyhJ554QgUFBcrOztb777+vhIQEn2+XGXqjbd7oXO3yB0888YTuuece7du3T+PHj9ef//xnWa1Ws8sC4Mv6ZQi1n5g+fbpxzz33nPF4RkaG8eyzz571GpKMP/3pT2c83vFUV35+/nnVeD76o11m6Y22eaNztcvXdTzV5QszHAPwLYzxAQAAAYPgAwAAAobFMAzD7CIAAAD6A3d8AABAwCD4AACAgEHwAQAAAYPgAwAAAgbBBwAABAyCDwAACBgEHwAAEDAIPgAAIGAQfAAAQMD4/wEKk6YuoWf87QAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dyncurve = w.setDynamicCurve(shape='expon(0.25)', mindb=-40)\n", "w.dynamicCurve.plot()" ] }, { "cell_type": "code", "execution_count": 25, "id": "dfee469a-2558-4859-90e6-99a420c69f3e", "metadata": {}, "outputs": [ { "data": { "text/html": [ "OfflineRenderer(outfile=\"/home/em/.local/share/maelzel/recordings/rec-2025-09-28T18:52:42.209.wav\", 1 channels, 49.00 secs, 44100 Hz)
Soundfile: '/home/em/.local/share/maelzel/recordings/rec-2025-09-28T18:52:42.209.wav', duration: 49, sr: 44100, numchannels: 1)
\n", "\n", " \n", "
\n", "\n", " \n", " " ], "text/plain": [ "OfflineRenderer(sr=44100)" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "voice.rec(instr='.piano', sustain=20, gain=2, nchnls=1, fade=(0, 2)).show()" ] }, { "cell_type": "code", "execution_count": null, "id": "aff7a0b0-f772-4df5-bdbf-a5dc7fd57df5", "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.13.3" } }, "nbformat": 4, "nbformat_minor": 5 }