Skip to main content

CoreMusic: Python bindings for Apple CoreAudio

PyPI version License Documentation

A zero-dependency music development toolkit for macOS providing Python access to Apple's CoreAudio and CoreMIDI frameworks via Cython. Offers both functional (C-style) and object-oriented (Pythonic) APIs with automatic resource management.

Features

Framework Capabilities
CoreAudio Hardware abstraction, device management, format handling
AudioToolbox AudioFile I/O, AudioQueue streaming, AudioComponent discovery
AudioUnit Plugin hosting, real-time processing, render callbacks, MIDI instrument control
CoreMIDI Device/endpoint management, UMP (MIDI 1.0/2.0), thru connections, transforms
Ableton Link Network tempo sync, beat-accurate playback/sequencing

Audio: File I/O (read WAV/AIFF/CAF/MP3/AAC/M4A/ALAC/FLAC; write WAV/AIFF/CAF plus AAC/M4A/ALAC/FLAC encoding), real-time processing, analysis (peak, RMS, tempo, key), buffer pool, memory-mapped I/O

MIDI: Device discovery, virtual devices, routing, transformation pipeline (transpose, quantize, humanize, harmonize)

Music Theory: 25+ scales, 35+ chords, Note/Interval/Scale/Chord classes, time signatures, rhythmic patterns

Installation

pip install coremusic

Requirements: macOS, Python 3.10+

Optional Dependencies

CoreMusic has zero runtime dependencies by default. Optional features require additional packages:

# Audio analysis (beat detection, pitch detection, key detection)
pip install coremusic[analysis]

# Visualization (waveform plots, spectrograms)
pip install coremusic[visualization]

# All optional features
pip install coremusic[all]

Check feature availability at runtime:

from coremusic.base import NUMPY_AVAILABLE
from coremusic.audio import AudioFile
from coremusic.audio.analysis import AudioAnalyzer
import coremusic.utils.scipy as spu

if NUMPY_AVAILABLE:
    # NumPy-based features available
    with AudioFile("song.wav") as audio:
        data = audio.read_as_numpy()

if spu.SCIPY_AVAILABLE:
    # SciPy-based analysis available
    analyzer = AudioAnalyzer("song.wav")
    tempo = analyzer.detect_beats().tempo

Building from Source

git clone https://github.com/shakfu/coremusic.git
cd coremusic
make        # Build
make test   # Run tests

Command Line Interface

% coremusic --help
usage: coremusic [-h] [--version] [--json] <command> ...

CoreMusic - Python bindings for Apple CoreAudio.

positional arguments:
  <command>
    audio     Audio file operations
    device    Audio device management
    plugin    AudioUnit plugin discovery
    analyze   Audio analysis and feature extraction
    convert   Convert audio files between formats
    midi      MIDI operations
    sequence  MIDI sequence operations
    doctor    Diagnose the installation and environment
    completion
              Generate shell completion scripts

options:
  -h, --help  show this help message and exit
  --version   show program's version number and exit
  --json      Output in JSON format
Command Description
audio Audio file operations (info, play, record, duration, metadata)
device Audio device management (list, info, volume, mute, set-default, monitor)
plugin AudioUnit plugins (list, find, info, params, process, chain, render)
analyze Audio analysis (levels, tempo, key, spectrum, loudness, onsets)
convert Audio conversion (file, batch, normalize, trim)
midi MIDI operations (list, info, play, quantize, receive, monitor, send, panic)
sequence MIDI sequence operations (info, play, tracks)
doctor Diagnose installation (optional deps, audio/MIDI access, plugins)
completion Generate shell completion scripts (bash, zsh, fish)

Shell Completion

Enable tab completion for commands and options:

# Bash (add to ~/.bashrc)
eval "$(coremusic completion bash)"

# Zsh (add to ~/.zshrc)
eval "$(coremusic completion zsh)"

# Fish (add to ~/.config/fish/config.fish)
coremusic completion fish | source

Examples

# Audio
coremusic audio play song.wav --loop
coremusic audio record -o recording.wav -d 10
coremusic analyze tempo song.wav
coremusic convert normalize input.wav output.wav --target -1.0

# Devices
coremusic device list
coremusic device volume "MacBook Pro Speakers" 0.5

# Plugins
coremusic plugin list --type effect
coremusic plugin list --name-only | grep -i reverb
coremusic plugin process "AUDelay" input.wav -o output.wav
coremusic plugin chain input.wav -p "AUDelay:Delay Time=0.5" -p "AUReverb2" -o out.wav
coremusic plugin render "DLSMusicDevice" song.mid -o rendered.wav

# MIDI
coremusic midi list
coremusic midi monitor                              # Human-readable MIDI input
coremusic midi receive                              # Display incoming MIDI
coremusic midi receive -o recording.mid             # Save to MIDI file
coremusic midi receive --plugin "DLSMusicDevice"    # Route to synth plugin
coremusic midi play song.mid
coremusic midi quantize input.mid -o quantized.mid --grid 1/16
coremusic midi panic

# Device monitoring
coremusic device monitor                            # Watch for device changes

# JSON output for scripting
coremusic --json plugin list --type instrument

Quick Start

One-Liner Convenience Functions

from coremusic.shortcuts import play, play_background, convert
from coremusic.shortcuts import analyze_tempo, analyze_key, get_info
from coremusic.shortcuts import list_devices, list_plugins

# Quick playback
play("song.wav")                       # Blocking playback
handle = play_background("song.wav")   # Non-blocking, returns control handle
handle.stop()                          # Stop when done

# Quick analysis
tempo = analyze_tempo("song.wav")      # Get BPM
key, mode = analyze_key("song.wav")    # Get musical key
info = get_info("song.wav")            # Get file metadata

# Quick conversion (.wav, .aiff, .caf, plus .m4a/.aac/.flac encoding)
convert("input.wav", "output.aiff")
convert("song.wav", "song.m4a", bitrate=192000)   # AAC at 192 kbps

# Render a MIDI file through an instrument plugin to audio
from coremusic.shortcuts import render_midi
render_midi("DLSMusicDevice", "song.mid", "song.wav")

# List resources
devices = list_devices()
plugins = list_plugins(type='effect')

Runnable demos

The demos/ directory has small, self-contained scripts: host an AudioUnit effect chain, render MIDI to WAV, play a real-time tone, and run an Ableton Link-synced step sequencer. See demos/README.md.

python demos/host_au_chain.py         # WAV -> effect chain -> WAV
python demos/render_midi_to_wav.py    # MIDI -> instrument -> WAV
python demos/output_stream_tone.py    # real-time sine tone
python demos/link_sequencer.py        # Link-synced step sequencer

Run all four in sequence, writing output to build/demos-output/, with:

make demos

Audio Files

from coremusic.audio import AudioFile

with AudioFile("audio.wav") as f:
    print(f"Duration: {f.duration:.2f}s, Rate: {f.format.sample_rate}Hz")
    data, count = f.read_packets(0, 1000)

Audio Playback

from coremusic.base import AudioPlayer

player = AudioPlayer()
player.load_file("audio.wav")
player.setup_output()
player.play()
player.set_looping(True)
# ... later
player.stop()

AudioUnit Plugins

import time

from coremusic.audio.audiounit_host import AudioUnitHost

# Discover and use plugins
host = AudioUnitHost()
effects = host.discover_plugins(type='effect')

with host.load_plugin("DLSMusicDevice", type='instrument') as synth:
    synth.note_on(channel=0, note=60, velocity=100)
    time.sleep(1.0)
    synth.note_off(channel=0, note=60)

MIDI

from coremusic.midi import MIDIClient, get_destinations, note_off, note_on

client = MIDIClient("My App")
output_port = client.create_output_port("Output")

# Send to an endpoint published by the system, or create a virtual one
destinations = get_destinations()
destination = destinations[0] if destinations else client.create_virtual_destination("Synth")

# A note may be a MIDI number, a name, or a Note
output_port.send_data(destination, note_on("C4", 127))
output_port.send_data(destination, note_off("C4"))
client.dispose()

Receiving works the same way, from the other side:

from coremusic.midi import MIDIClient, get_sources

client = MIDIClient("My App")
input_port = client.create_input_port("Input")
for source in get_sources():
    input_port.connect_source(source)

while input_port.wait(0.1):
    for host_time, data in input_port.poll():
        print(host_time, data.hex())

client.dispose()

MIDI Transformation

from coremusic.midi.utilities import MIDISequence
from coremusic.midi.transform import Pipeline, Transpose, Quantize, Humanize

seq = MIDISequence.load("input.mid")
pipeline = Pipeline([
    Transpose(semitones=5),
    Quantize(grid=0.125, strength=0.8),
    Humanize(timing=0.02, velocity=10),
])
pipeline.apply(seq).save("output.mid")

Music Theory

from coremusic.music.theory import Note, Scale, ScaleType, Chord, ChordType

c4 = Note.from_midi(60)  # Middle C
c_major = Scale(c4, ScaleType.MAJOR)
cmaj7 = Chord(c4, ChordType.MAJOR_7)

Rhythm and Meter

from coremusic.music.theory import TimeSignature, NoteValue, Duration, RhythmPattern

ts = TimeSignature(4, 4)
dotted_quarter = Duration(NoteValue.QUARTER, dots=1)
triplet = Duration.triplet(NoteValue.EIGHTH)

pattern = RhythmPattern.straight_eighths(8)
onset_times = pattern.scale_to_tempo(120)  # At 120 BPM
from coremusic import link

with link.LinkSession(bpm=120.0) as session:
    state = session.capture_app_session_state()
    current_time = session.clock.micros()
    beat = state.beat_at_time(current_time, quantum=4.0)
    print(f"Beat: {beat:.2f}, Tempo: {state.tempo:.1f} BPM")

API Overview

Pythonic wrappers with automatic resource management:

  • Context managers (with statements) for automatic cleanup

  • Type-safe classes instead of integer IDs

  • Properties, iteration, operators

  • IDE autocompletion and type hints

from coremusic.audio import AudioFile, AudioFormat
from coremusic.midi import MIDIClient
from coremusic.constants import AudioFileProperty, AudioFormatID

Functional API (Advanced)

Direct access to CoreAudio C functions for maximum control:

  • Direct mapping to CoreAudio C APIs

  • Fine-grained resource management

  • Familiar for CoreAudio developers

import coremusic.capi as capi

audio_file = capi.audio_file_open_url("audio.wav")
format_data = capi.audio_file_get_property(audio_file, capi.get_audio_file_property_data_format())
capi.audio_file_close(audio_file)

Both APIs interoperate - OO objects expose underlying IDs when needed.

Architecture

src/coremusic/
  __init__.py          # Package entry
  capi.pyx/pxd         # Cython bindings to CoreAudio/CoreMIDI
  base.py              # CoreAudioObject, AudioPlayer
  exceptions.py        # Exception hierarchy
  audio/               # AudioFile, AudioFormat, AudioUnit, AUGraph, devices,
                       #   analysis, buffer pool, streaming
  midi/                # MIDIClient, MIDIPort, MIDIEndpoint, MusicPlayer,
                       #   utilities, transforms, Link integration
  music/               # Theory (scales, chords)
  constants/           # Enumerated CoreAudio/CoreMIDI constants
  utils/               # Fourcc, batch, scipy helpers
  shortcuts.py         # One-call helpers (play, convert, render_midi)
  cli/                 # Command-line interface
  link.pyx             # Ableton Link bindings

Linked frameworks: CoreAudio, AudioToolbox, AudioUnit, CoreMIDI, CoreFoundation

Testing

make test           # Fast tests
make test-all       # All tests, including the documentation examples

Every code example in the documentation is a runnable program under examples/, included into the docs rather than copied. make test-all executes all of them, so a snippet that no longer runs fails the build. See examples/README.md.

Documentation

Getting Started

Tutorials

Step-by-step guides for common tasks:

Reference

Resources

License

CoreMusic is licensed under the MIT License -- see LICENSE.

The optional coremusic.link module is a derivative work of Ableton Link and is licensed under the GNU General Public License v2.0 (GPLv2). See thirdparty/link/LICENSE.md and thirdparty/link/GNU-GPL-v2.0.md for details.

Metadata

Release files for coremusic 0.2.10

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for coremusic 0.2.10
File Size Uploaded
coremusic-0.2.10.tar.gz 5.1 MB Details

Built distributions (wheels)

Table of built distributions (wheels) for coremusic 0.2.10
File
coremusic-0.2.10-cp314-cp314-macosx_26_0_arm64.whl CPython 3.14 CPython 3.14 macOS 26.0+ ARM64 Details
coremusic-0.2.10-cp313-cp313-macosx_26_0_arm64.whl CPython 3.13 CPython 3.13 macOS 26.0+ ARM64 Details
coremusic-0.2.10-cp312-cp312-macosx_26_0_arm64.whl CPython 3.12 CPython 3.12 macOS 26.0+ ARM64 Details
coremusic-0.2.10-cp311-cp311-macosx_26_0_arm64.whl CPython 3.11 CPython 3.11 macOS 26.0+ ARM64 Details
coremusic-0.2.10-cp310-cp310-macosx_26_0_arm64.whl CPython 3.10 CPython 3.10 macOS 26.0+ ARM64 Details

Total release size: 8.9 MB

Release files / coremusic-0.2.10.tar.gz

Download URL coremusic-0.2.10.tar.gz
Size 5.1 MB
Tags Source
SHA-256 checksum
How to use checksums
e2ea43e6ce89f77cb2a629422064905612c3642ff39c46df101c51868849d18f
BLAKE2b-256 checksum
How to use checksums
7f9cce9cb302117e1c2f10da8a0f11e5b48800fb410d9dbba936d964555f0343
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.12

Release files / coremusic-0.2.10-cp314-cp314-macosx_26_0_arm64.whl

Download URL coremusic-0.2.10-cp314-cp314-macosx_26_0_arm64.whl
Size 774.1 kB
Tags CPython 3.14 macOS 26.0+ ARM64
SHA-256 checksum
How to use checksums
a2f384017462ef3a5c3e8d655b3571ec51b7c8cae9ecb27dcb4b881566b176f0
BLAKE2b-256 checksum
How to use checksums
2fcfba10dee272b3e5ae36860e3dfbb56f84e330ecee88250b7acd592f480435
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.12

Release files / coremusic-0.2.10-cp313-cp313-macosx_26_0_arm64.whl

Download URL coremusic-0.2.10-cp313-cp313-macosx_26_0_arm64.whl
Size 771.2 kB
Tags CPython 3.13 macOS 26.0+ ARM64
SHA-256 checksum
How to use checksums
f50107316f07485f744595506efe9e17833111d591ec47fd284250e64f7436cd
BLAKE2b-256 checksum
How to use checksums
f66ad33982a09f8a1218d916c36c7dbf8defc303b3beb713901357d7b66751d8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.12

Release files / coremusic-0.2.10-cp312-cp312-macosx_26_0_arm64.whl

Download URL coremusic-0.2.10-cp312-cp312-macosx_26_0_arm64.whl
Size 759.2 kB
Tags CPython 3.12 macOS 26.0+ ARM64
SHA-256 checksum
How to use checksums
74f8a2fac37f623f271b54d53d5a3c703ef7bd419c98a0961585efc2f97c30df
BLAKE2b-256 checksum
How to use checksums
f3804c7e15e985b61fb9c81b6357b4f1980bb9024c4b0b22af1c85758f7eb68e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.12

Release files / coremusic-0.2.10-cp311-cp311-macosx_26_0_arm64.whl

Download URL coremusic-0.2.10-cp311-cp311-macosx_26_0_arm64.whl
Size 771.6 kB
Tags CPython 3.11 macOS 26.0+ ARM64
SHA-256 checksum
How to use checksums
e49ba831b0c77dfa08d2530bd7cf2d1691c76abc96fef76cb384b20ad87c8da8
BLAKE2b-256 checksum
How to use checksums
012dafe9ae248605d1367ebedc4f6df3d8546bfd7ad36c46a5e8b795613e975f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.12

Release files / coremusic-0.2.10-cp310-cp310-macosx_26_0_arm64.whl

Download URL coremusic-0.2.10-cp310-cp310-macosx_26_0_arm64.whl
Size 773.3 kB
Tags CPython 3.10 macOS 26.0+ ARM64
SHA-256 checksum
How to use checksums
f76cd9fb1087e18f207018f5b2f1d61bdf0ce101d091fe7ea82346a018da10a4
BLAKE2b-256 checksum
How to use checksums
4f5b24932b032c778badef888c5ce03c4335246bc42a0b18776fde137598e922
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.12

Release history Release notifications | RSS feed

This release

0.2.10 This release

6 release files

0.2.9

5 release files

0.2.8

6 release files

0.2.7

6 release files

0.2.6

6 release files

0.2.4

5 release files

0.2.3

6 release files

0.2.2

6 release files

0.2.1

6 release files

0.2.0

5 release files

0.1.12

5 release files

0.1.11

5 release files

0.1.9

5 release files

0.1.8

5 release files

0.1.7

5 release files

0.1.6

5 release files

0.1.5

5 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page