audio-as-code 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,340 @@
1
+ Metadata-Version: 2.5
2
+ Name: audio-as-code
3
+ Version: 0.1.0
4
+ Summary: An agent-friendly music score, composition toolkit, and offline renderer.
5
+ Project-URL: Homepage, https://audioascode.com
6
+ Project-URL: Repository, https://github.com/joaoCarvalho1000/audio-as-code
7
+ Project-URL: Issues, https://github.com/joaoCarvalho1000/audio-as-code/issues
8
+ Author: Audio as Code contributors
9
+ License-Expression: MIT
10
+ License-File: LICENSE
11
+ Keywords: composition,midi,music,procedural-audio,synthesis
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3 :: Only
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Topic :: Multimedia :: Sound/Audio :: Sound Synthesis
22
+ Classifier: Typing :: Typed
23
+ Requires-Python: >=3.10
24
+ Requires-Dist: mido<2,>=1.3
25
+ Requires-Dist: numpy<3,>=1.24
26
+ Requires-Dist: pydantic<3,>=2.7
27
+ Description-Content-Type: text/markdown
28
+
29
+ # Audio as Code
30
+
31
+ An open-source music framework for creative agents. Compose a soundtrack for a video, game or presentation, render it locally, and keep every note editable.
32
+
33
+ [Website and demos](https://audioascode.com) · [Source and issues](https://github.com/joaoCarvalho1000/audio-as-code) · [Support the project](https://ko-fi.com/joaothecarvalho)
34
+
35
+ Give your project a soundtrack: a video reveal, a tiny dragon's boss fight,
36
+ or a presentation with an unexpectedly dramatic entrance. Keep the score and code,
37
+ then carry the rendered WAV into your video, game or slides. See the
38
+ [creative workflow integrations](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/docs/site/integrations.md) for Codex, Claude Code
39
+ and Hyperframes recipes.
40
+
41
+ **Status: working 0.1 prototype.** Python 3.10+, a versioned JSON score, a headless CLI, and an offline synthesis backend. No API keys, audio device, model weights, sample downloads, or DAW are required.
42
+
43
+ A **score** is the editable recipe for a piece: instruments, notes, timing,
44
+ volume and tempo. Write it in Python or JSON; rendering turns it into audio.
45
+
46
+ ```text
47
+ Agent / Python program / JSON editor
48
+ ↓
49
+ Validated score
50
+ ↙ ↘
51
+ Stereo WAV MIDI file
52
+ + stems → DAW / synth
53
+ ↓
54
+ Signal measurements → agent revises the score
55
+ ```
56
+
57
+ The agent makes the musical decisions. This library supplies musical building blocks, synthesis, export, and measurable feedback. It does not call an LLM or generate songs from a text prompt by itself.
58
+
59
+ The [instrument foundation](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/docs/instrument-foundation.md) organizes the framework around eight musical families and five shared synthesis-engine groups. Instruments are generated from code. Agents can discover what is playable today and inspect the planned catalog:
60
+
61
+ ```sh
62
+ uv run aac instruments
63
+ uv run aac instruments --all
64
+ uv run aac instruments --family plucked_strings
65
+ ```
66
+
67
+ The catalog distinguishes available prototypes from planned instruments. It also reports each voice's synthesis engine, supported tone controls, and MIDI mapping.
68
+
69
+ The catalog now includes **mandolin, kalimba, celesta and recorder**. See their
70
+ [models, controls and useful registers](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/docs/extended-instruments.md) before
71
+ composing. Every voice is synthesized from code.
72
+
73
+ The [piano and bowed-string models](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/docs/synthesis.md#piano-and-bowed-strings) use
74
+ coupled unison damping and designed excitation/body responses. Their documentation
75
+ explains the algorithms and limits; numerical checks do not establish perceptual
76
+ realism.
77
+
78
+ The website pairs five familiar public-domain works with new arrangements by an
79
+ AI agent: *Für Elise*, Bach's Cello Suite No. 1 Prelude, Mozart's *Turkish March*,
80
+ *Greensleeves* and *Ode to Joy*. **The classic** follows the credited source score;
81
+ **Reimagined** changes its musical treatment. Both versions are synthesized from
82
+ code and retain editable scores. See the [score credits](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/docs/classic-showcase.md)
83
+ and [generator](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/examples/classic_showcase.py) for the source and arrangement scope.
84
+ The four [original full compositions](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/examples/full_compositions.py) remain in
85
+ the repository as separate examples of form and development.
86
+
87
+ To browse and audition the catalog, run `uv run python examples/instrument_browser.py`, then open `output/instruments/index.html` directly in your browser. All **49 playable entries** have a famous-music demo, a phrase, and a note/hit preview: **147 clips at 44.1 kHz**, with WAV/MIDI/JSON downloads. [The repertoire](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/docs/music-demos.md) includes Beethoven, Bach, Mozart, and Greensleeves, arranged as solos, small ensembles, and percussion features. Search by instrument, piece, or arrangement, or filter by family. Keep the generated folders beside the HTML file; playback and regeneration need no server or internet connection. The editable page template is `web/instrument-browser.html`. These are procedural prototypes; [model descriptions and limitations](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/docs/orchestra.md) distinguish modal models from spectral approximations.
88
+
89
+ ## Try it
90
+
91
+ For a coding agent, start with: **“Read https://audioascode.com/llms.txt and add
92
+ Audio as Code to this project. Then compose the music in my brief.”**
93
+
94
+ To add it to an existing uv project with Git installed:
95
+
96
+ ```sh
97
+ uv add "audio-as-code @ git+https://github.com/joaoCarvalho1000/audio-as-code.git"
98
+ uv run --locked aac instruments
99
+ uv run --locked aac schema
100
+ ```
101
+
102
+ Commit your project's `uv.lock` to preserve the resolved Git revision and
103
+ dependency versions. See the [quickstart](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/docs/site/quickstart.md) for a first
104
+ composition and the standalone source-workspace route below.
105
+
106
+ For complete video, game-loop and presentation examples with exact durations and
107
+ verified revisions, see [creative workflows](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/docs/creative-workflows.md).
108
+ Piano phrases can use a [sustain pedal](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/docs/piano-sustain.md), including MIDI CC64.
109
+ See [render performance](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/docs/render-performance.md) for reproducible benchmarks.
110
+
111
+ Give the framework to your coding agent, then describe the music. You do not need
112
+ to learn Python first; the agent needs local shell access and Python 3.10+.
113
+ Download and extract the source ZIP from the website's **Download source** page,
114
+ or use this checkout, then paste this into your agent:
115
+
116
+ ```text
117
+ Use this Audio as Code source folder. Read skills/audio-as-code/SKILL.md,
118
+ set up the local environment, and compose an original 30-second warm, playful
119
+ instrumental with electric piano, marimba, bass and light drums. Develop a short
120
+ motif and give it a gentle ending. Validate, render and inspect it. Deliver the
121
+ WAV, MIDI, editable JSON score, composer source and render report. Tell me
122
+ whether you were able to listen to the result.
123
+ ```
124
+
125
+ Then ask for a revision: “Keep the melody, make the drums softer, and leave more
126
+ space in the second half.” The agent edits the composition and renders a new
127
+ version. The [portable skill](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/skills/audio-as-code/SKILL.md) carries the workflow;
128
+ the [agent guide](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/docs/agents.md) explains the command contract. Reading this
129
+ instruction file works with a shell-capable agent; no vendor plugin integration
130
+ is assumed. The renderer does not bundle an AI model or require a provider key.
131
+
132
+ ### Run it yourself
133
+
134
+ Install Python 3.10+ and [uv](https://docs.astral.sh/uv/), then open a terminal in
135
+ this checkout (the directory containing `pyproject.toml`). These commands work
136
+ in PowerShell, macOS, and Linux shells; no virtual-environment activation is needed:
137
+
138
+ ```sh
139
+ uv sync --locked
140
+ uv run aac --version
141
+ uv run aac demo -o output/song.json
142
+ uv run aac validate output/song.json
143
+ uv run aac inspect output/song.json
144
+ uv run aac render output/song.json -o output/song.wav --stems output/stems --report output/report.json
145
+ uv run aac midi output/song.json -o output/song.mid
146
+ uv run aac analyze output/song.wav
147
+ ```
148
+
149
+ Open `output/song.wav` in an audio player. The demo is an original eight-bar arrangement with chords, bass, melody, kick, snare, and hi-hat. `uv run python examples/first_light.py` produces the score, WAV, MIDI, stems, and report in one command.
150
+
151
+ For five contrasting examples, run `uv run python examples/showcase.py`, then open `output/showcase/index.html`. The listening page includes a mellow groove, a dance arrangement, an ambient piece, a chiptune melody, and a five-second audio logo. Each example includes a WAV, MIDI file, editable JSON score, and render report.
152
+
153
+ For instrument models generated entirely from code, run `uv run python examples/physical_instruments.py` and open `output/physical-instruments/index.html`. It compares the original pluck with a modeled guitar string, followed by marimba and bell examples. All excitations and resonances are generated mathematically; there are no recorded assets.
154
+
155
+ The first sync downloads dependencies; subsequent rendering is offline. In an
156
+ environment with cached dependencies, `uv sync --locked --offline` also works.
157
+ Use `uv run aac --help` and `uv run aac render --help` for command options.
158
+ Quote paths containing spaces, for example `-o "output/my song.wav"`.
159
+
160
+ Alternatively, install from this checkout into your own Python virtual environment:
161
+
162
+ ```sh
163
+ python -m venv .venv
164
+ ```
165
+
166
+ On Windows PowerShell, run `.venv/Scripts/python.exe -m pip install -e .`, then
167
+ `.venv/Scripts/python.exe -m audio_as_code --help`. On macOS/Linux, use
168
+ `.venv/bin/python -m pip install -e .` and `.venv/bin/python -m audio_as_code --help`.
169
+ These paths avoid shell activation and Windows execution-policy changes. This is
170
+ a local installation. Explore the listening examples at [audioascode.com](https://audioascode.com).
171
+
172
+ ## Compose in Python
173
+
174
+ ```python
175
+ from audio_as_code import Pattern, Song, Track, export_midi, render
176
+
177
+ melody = Pattern.sequence(["C4", "E4", "G4", None], step=0.5).repeat(4)
178
+ kick = Pattern.sequence([36, None], step=1, gate=0.3).repeat(4)
179
+
180
+ song = Song(
181
+ title="My first loop",
182
+ bpm=110,
183
+ beats=8,
184
+ seed=42,
185
+ tracks=[
186
+ Track(name="Melody", instrument="pluck", notes=melody.notes, gain=0.5),
187
+ Track(name="Kick", instrument="kick", notes=kick.notes, gain=0.7),
188
+ ],
189
+ )
190
+
191
+ song.save("output/loop.json")
192
+ report = render(song, "output/loop.wav")
193
+ export_midi(song, "output/loop.mid")
194
+ print(report["wav"])
195
+ ```
196
+
197
+ `Pattern.sequence()` accepts pitches, chords (`["C4", "E4", "G4"]`), and rests (`None`). Use `.repeat(n)`, `.transpose(semitones)`, `.then(other)`, and `.at(beat)` to arrange phrases. Patterns retain trailing rests. `.at()` returns notes positioned on the song's absolute timeline.
198
+
199
+ Layer a countermelody with `.overlay(other, offset=2)`, expand a motif with
200
+ `.stretch(2)`, or soften it with `.scale_velocity(0.7)`. Each returns a new
201
+ pattern and preserves the original. See the [composition tools](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/docs/composition-tools.md)
202
+ and [runnable example](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/examples/composition_tools.py) for combining these into a piece.
203
+
204
+ For finer control, construct `Note(pitch="C4", start=0, duration=1, velocity=0.8)` directly. Scores and patterns are immutable; create a revised score from its JSON data when editing.
205
+
206
+ ## Compose in JSON
207
+
208
+ Agents in any programming language can write this format:
209
+
210
+ ```json
211
+ {
212
+ "schema_version": "1",
213
+ "title": "A small phrase",
214
+ "bpm": 120,
215
+ "beats": 4,
216
+ "seed": 7,
217
+ "tracks": [{
218
+ "name": "Lead",
219
+ "instrument": "pluck",
220
+ "gain": 0.6,
221
+ "notes": [
222
+ {"pitch": "C4", "start": 0, "duration": 0.8},
223
+ {"pitch": "E4", "start": 1, "duration": 0.8},
224
+ {"pitch": "G4", "start": 2, "duration": 1.5}
225
+ ]
226
+ }]
227
+ }
228
+ ```
229
+
230
+ Generate the JSON Schema with `uv run aac schema -o schemas/song-v1.schema.json`. The checked-in schema is derived from the same models used by the renderer. Runtime validation also checks relationships that JSON Schema cannot express, such as unique track names and notes fitting inside a song.
231
+
232
+ ### Musical conventions
233
+
234
+ | Concept | Meaning |
235
+ | --- | --- |
236
+ | Time | Quarter-note beats, starting at zero; four beats form a bar in a 4/4 composition |
237
+ | Tempo | BPM 20–300; optional ordered step changes in `tempo_map` |
238
+ | Pitch | MIDI integer 0–127 or scientific pitch notation; C4 = 60, A4 = 440 Hz |
239
+ | Duration | Explicit note length; optional note/track `release_seconds` adds a release after note-off |
240
+ | Velocity | Greater than 0 and at most 1; omit a note to make a rest |
241
+ | Gain | Linear amplitude, 0–1, per track and master |
242
+ | Pan | -1 left, 0 center, 1 right; equal-power stereo panning |
243
+ | Song length | Notes fit inside `beats`; automatic release/effect tails extend the WAV |
244
+ | Sample rate | 22050, 44100 (default), or 48000 Hz |
245
+ | Randomness | Seeded percussion and string excitation; identical score and environment produce identical WAV bytes |
246
+
247
+ Basic voices: `sine`, `triangle`, `pluck`, `bass`, `pad`, `kick`, `snare`, and `hat`. Drum voices ignore pitch for WAV playback and map to General MIDI notes 36, 38, and 42 on export.
248
+
249
+ The `guitar`, `marimba`, and `bell` voices add physical/modal approximations. Guitar uses a tuned, damped string loop; marimba and bell use independently decaying resonances. They are simplified instrument models, not calibrated replicas. See [synthesis details](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/docs/synthesis.md).
250
+
251
+ The rest of the [catalog](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/docs/instrument-foundation.md) is also playable: plucked/bowed strings, four keyboards, woodwinds, brass, drums, tuned percussion, and electronic instruments. New string and percussion voices use modal models. Bowed strings and winds use instrument-specific harmonic source/filter approximations, without nonlinear bow, reed, or bore solvers. See the [orchestra guide](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/docs/orchestra.md) for expression controls and the generated drum kit.
252
+
253
+ ```python
254
+ from audio_as_code import Note, Song, Tone, Track, render
255
+
256
+ song = Song(
257
+ bpm=60,
258
+ beats=4,
259
+ tracks=[
260
+ Track(
261
+ name="Guitar",
262
+ instrument="guitar",
263
+ tone=Tone(brightness=0.6, decay_seconds=3, pluck_position=0.18),
264
+ notes=[Note(pitch="E3", duration=4, velocity=0.75)],
265
+ ),
266
+ ],
267
+ )
268
+ render(song, "output/string.wav")
269
+ ```
270
+
271
+ Brightness and decay work on the modeled decaying voices. Pluck position is available on plucked-string models and harpsichord. Held voices expose selected breath/vibrato controls; `aac instruments` reports each voice's supported settings and defaults. Velocity changes loudness and model brightness. By default notes fade within their score duration. Optional note/track `release_seconds` lets a sound ring after note-off. Ordered `tempo_map` steps, gain/pan automation, and procedural delay/reverb chains add expression; see the [composition guide](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/docs/site/composition.md).
272
+
273
+ ## An agent's working loop
274
+
275
+ 1. Read the schema, discover available voices with `aac instruments`, and choose tempo, harmony, rhythm, and arrangement.
276
+ 2. Write a JSON score or use the Python API.
277
+ 3. Run `aac validate`, then `aac inspect` for per-track timing, pitch ranges, polyphony and WAV/MIDI readiness; correct any blockers before rendering.
278
+ 4. Run `aac render` and inspect the render report and WAV.
279
+ 5. Adjust notes, timing, orchestration, or gains, then render again.
280
+ 6. Export MIDI for continued work in a DAW, or deliver WAV and stems.
281
+
282
+ Every successful CLI operation emits JSON to stdout, including `--version`.
283
+ Errors emit JSON to stderr and exit with status 2, with a recovery `hint`.
284
+ Help uses normal CLI text. Score inputs are UTF-8 JSON (an optional UTF-8 BOM is
285
+ accepted) and are parsed as data; the CLI never executes Python or JavaScript
286
+ from a score. See [the agent guide](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/docs/agents.md) for the command contract,
287
+ subprocess integration, and limitations.
288
+
289
+ Reports include a score hash, engine and NumPy versions, duration, peak, RMS, clipping and silence checks, and warnings. **These measurements cannot judge musical quality.** A listening agent or human should audition the rendered audio.
290
+
291
+ `aac inspect score.json` and Python's `inspect_score(song)` inspect the score
292
+ without synthesizing audio or writing files. They report export constraints and
293
+ structured issues so an agent can revise before paying the render cost. See the
294
+ [inspection contract](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/docs/score-inspection.md); a successful inspection command
295
+ can report an export blocker, so check its readiness fields.
296
+
297
+ ## Rendering and export
298
+
299
+ - WAV: 16-bit stereo PCM, synthesized offline in memory. The prototype limits each render, including release/effect tails, to five minutes. A five-minute render can consume hundreds of MB of RAM; shorter previews are preferable in agent loops.
300
+ - Default normalization only reduces gain when the mix exceeds a 0.95 peak ceiling. It never increases a quiet mix. `--no-normalize` preserves mix gain and hard-clips values outside full scale on WAV export; the report exposes this.
301
+ - Stems include track gain, pan, master gain, and the same attenuation applied to the mix. They approximately reconstruct the mix within PCM rounding when there are no master effects and no individual stem clips. Stems include track effects but omit master effects, with a warning when the mix uses them. Numeric filenames avoid interpreting track names as paths.
302
+ - MIDI: type 1, 480 ticks per quarter note, tempo, track names, programs, volume, and pan. Up to 15 melodic tracks and one track per drum instrument. Overlapping notes of the same pitch on one channel are rejected, including collisions between a drum kit and an individual drum. Quantization can differ from WAV timing by a MIDI tick.
303
+ - MIDI instrument sounds depend on the receiver. Drum tracks share channel 10; gain is folded into velocity and per-track drum pan is not exported. MIDI carries tempo changes but does not reproduce the WAV synthesizer, tone controls, automation, effects, audio releases or normalization.
304
+ - Reproducibility is scoped to the same software/runtime/platform; floating-point and dependency changes may change bytes. Commit the score and `uv.lock`, and retain the render report.
305
+
306
+ ## Architecture and next steps
307
+
308
+ `instruments.py` defines the family/engine catalog and voice capabilities. `model.py` defines the portable score contract. `pattern.py` creates notes without coupling composition to playback. `render.py` mixes voices; `physical.py` implements guitar/bar/bell models, `orchestra.py` implements the additional profiles, and `acoustics.py` shares generated noise and analytic body responses. `midi.py` provides an interchange path. `cli.py` makes these capabilities usable from an agent's shell tools.
309
+
310
+ The framework's instrument direction is sound generated from code. The score is the extension boundary for more detailed physical models. Proposed next steps:
311
+
312
+ - Named clips and sections, continuous tempo ramps, and arrangement edits.
313
+ - Coupled string/body, nonlinear reed/bore, and bow-friction models beyond the current approximations.
314
+ - Half-pedaling, instrument articulation switches, and more expression controls.
315
+ - An MCP server wrapping the existing validate/render/analyze operations.
316
+ - Richer analysis, preview excerpts, and agent-assisted audition workflows.
317
+ - Streaming renders, real-time playback, and a browser editor.
318
+
319
+ These are roadmap items, not implemented features. The 0.1 API may change; score schema changes will use an explicit version.
320
+
321
+ Related projects worth exploring: [Strudel](https://strudel.cc/), [Sonic Pi](https://sonic-pi.net/), and [SCAMP](https://www.scamp.marcevanstein.com/). This prototype uses its own small score and synthesis implementation; it does not wrap those engines.
322
+
323
+ ## Development
324
+
325
+ ```sh
326
+ uv sync --locked
327
+ uv run pytest
328
+ uv run ruff check .
329
+ uv run ruff format --check .
330
+ uv build
331
+ ```
332
+
333
+ See [CONTRIBUTING.md](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/CONTRIBUTING.md), the [architecture guide](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/docs/architecture.md),
334
+ [release process](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/docs/releasing.md), [change log](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/CHANGELOG.md), and
335
+ [website build and preview guide](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/docs/website.md). For vulnerability handling,
336
+ read [SECURITY.md](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/SECURITY.md). Licensed under [MIT](https://github.com/joaoCarvalho1000/audio-as-code/blob/main/LICENSE).
337
+
338
+ ## Support
339
+
340
+ If Audio as Code helps you make music, you can [support the creator on Ko-fi](https://ko-fi.com/joaothecarvalho). Tips are optional; the framework stays open source.
@@ -0,0 +1,27 @@
1
+ audio_as_code/__init__.py,sha256=gd_yxP96u_Nx298HZuFhfKI4V__Xx6E-E2sEZdobT6c,852
2
+ audio_as_code/__main__.py,sha256=k1ocEWawweo1qCJWNFAAvyxz3tcY13dzvCenHszij30,48
3
+ audio_as_code/_audio.py,sha256=o__V2fNdBrY7WltpmH_xuTtaydxz8JrXFBvXXAWmYYk,3495
4
+ audio_as_code/_export_rules.py,sha256=CxYDzSNh9S_zho47S0WxjWhgg1INOrZ8csZe555MUk0,1022
5
+ audio_as_code/_orchestra_profiles.py,sha256=a0ib8BixbkKdvSfO0JNoWbmMhosWtQmKzprmhc6-rDU,5990
6
+ audio_as_code/_paths.py,sha256=ec4Gc5PpY-FxaGYQ9KFfcbw1X5TfsSPuicZkhcGBwyk,1542
7
+ audio_as_code/_voices.py,sha256=bz6vCfcFVWL4wr_gW_pMy4wtpaFLoh8Yq008HuIInnM,5846
8
+ audio_as_code/acoustics.py,sha256=NyaK4UO5TjNUcLYfzzgirlGDT9eylwG4Lc4klyElMA0,5501
9
+ audio_as_code/automation.py,sha256=IYfHeAhXvd8Em2weBDgAlq-0HNrYWmgk3wF_RTprp5g,1745
10
+ audio_as_code/cli.py,sha256=PD-E7mKGQRShAbMDUKvumQJkHJYVLyuCX-Rh2pP_Zr4,7617
11
+ audio_as_code/demo.py,sha256=_X5oEkefgwrKAETcdqSGd25Mb5RSHD24Emi4Nqw2EDc,2726
12
+ audio_as_code/effects.py,sha256=Xnmk3WJskMJniOynKDMKQvGNWrnXlni8DoVSriLcSvA,3301
13
+ audio_as_code/extended.py,sha256=L5NGqgSelb9RxALDR2nEspYhA88BOGw5OFai3nyha50,10320
14
+ audio_as_code/inspection.py,sha256=GgiFkwH1ctk6WT6lhjUBG9pigwfyIcgbKYGS7p2J_wU,14135
15
+ audio_as_code/instruments.py,sha256=QdJ6wRfzQyJGr_lL0NW68CxThM3ouA1WTzgQ5euOyJ4,28481
16
+ audio_as_code/midi.py,sha256=h4Eppl3hvteMnKFD0CJYJMB3wbMm8pnMsrTEml3BsaU,8240
17
+ audio_as_code/model.py,sha256=Pd6zs_yMomb9UvrsQhnZ-zSb08rGavZGXaSnsdMP5VQ,12226
18
+ audio_as_code/orchestra.py,sha256=bU5v1Zxy72iNf2KMEoqV0HJBgkS0BIAigN57am8cxPQ,19630
19
+ audio_as_code/pattern.py,sha256=SVGiDQTY2F92jiDDMVO4a_WUN6bPHHq6GIlupaxjosY,5925
20
+ audio_as_code/physical.py,sha256=-dEZYDqpy1WXG20YHssB-4dkEdY04k2__mO5NCArA9k,7303
21
+ audio_as_code/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
+ audio_as_code/render.py,sha256=UOJ-l9wDLLiNf_nRpXtSfdfV-wg-XO9d4-wybJkwVDM,9432
23
+ audio_as_code-0.1.0.dist-info/METADATA,sha256=Y6oxKb7d9vWTEVGM8TiwfS50rBWRlafkORq2PiHOc1w,21843
24
+ audio_as_code-0.1.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
25
+ audio_as_code-0.1.0.dist-info/entry_points.txt,sha256=WflxrYWbH7x8cRiA1d8AkP-nMfSxgBfECqo8b3btNeE,47
26
+ audio_as_code-0.1.0.dist-info/licenses/LICENSE,sha256=4Lbj5BRNj0m4qI_BAJ43GZmsWDWttivhwMonmg_BiEo,1083
27
+ audio_as_code-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.32.4
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ aac = audio_as_code.cli:main
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Audio as Code contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.