Skip to main content

Python bindings for Apple CoreAudio

Project description

CoreMusic: Python bindings for Apple CoreAudio

PyPI version License

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 (WAV, AIFF, MP3), 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.11+

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.objects import NUMPY_AVAILABLE
from coremusic.audio.analysis import AudioAnalyzer
import coremusic.utils.scipy as spu

if NUMPY_AVAILABLE:
    # NumPy-based features available
    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
    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)
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
convert("input.wav", "output.mp3")

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

Audio Files

from coremusic.objects 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.objects import AudioPlayer

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

AudioUnit Plugins

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.objects import MIDIClient

client = MIDIClient("My App")
output_port = client.create_output_port("Output")
output_port.send_data(destination, b'\x90\x3C\x7F')  # Note On
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

Ableton Link

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

Object-Oriented API (Recommended)

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.objects import AudioFile, AudioFormat, 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, OO API exports
  capi.pyx/pxd         # Cython bindings to CoreAudio/CoreMIDI
  objects/             # Object-oriented wrappers
    audio.py           # AudioFile, AudioFormat, AudioQueue, etc.
    audiounit.py       # AudioUnit, AudioComponent
    midi.py            # MIDIClient, MIDIPort
    devices.py         # AudioDevice, AudioDeviceManager
    music.py           # MusicPlayer, MusicSequence, MusicTrack
    exceptions.py      # Exception hierarchy
  audio/               # Analysis, buffer pool, streaming
  midi/                # Utilities, transforms, Link integration
  music/               # Theory (scales, chords)
  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 (1600+)

Documentation

Getting Started

Tutorials

Step-by-step guides for common tasks:

Reference

Executable Examples

The tests/tutorials/ directory contains doctest-based tutorials that serve as both documentation and tests:

# Run all tutorial doctests
pytest tests/tutorials/ --doctest-modules -v

# Run specific tutorial
pytest tests/tutorials/test_audio_file_basics.py --doctest-modules -v

Available tutorials: test_quickstart.py, test_audio_file_basics.py, test_midi_basics.py, test_effects_processing.py, test_music_theory.py

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.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

coremusic-0.2.2.tar.gz (4.9 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

coremusic-0.2.2-cp314-cp314-macosx_15_0_arm64.whl (643.7 kB view details)

Uploaded CPython 3.14macOS 15.0+ ARM64

coremusic-0.2.2-cp313-cp313-macosx_15_0_arm64.whl (641.1 kB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

coremusic-0.2.2-cp312-cp312-macosx_15_0_arm64.whl (642.3 kB view details)

Uploaded CPython 3.12macOS 15.0+ ARM64

coremusic-0.2.2-cp311-cp311-macosx_15_0_arm64.whl (639.1 kB view details)

Uploaded CPython 3.11macOS 15.0+ ARM64

coremusic-0.2.2-cp310-cp310-macosx_15_0_arm64.whl (638.6 kB view details)

Uploaded CPython 3.10macOS 15.0+ ARM64

File details

Details for the file coremusic-0.2.2.tar.gz.

File metadata

  • Download URL: coremusic-0.2.2.tar.gz
  • Upload date:
  • Size: 4.9 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.12

File hashes

Hashes for coremusic-0.2.2.tar.gz
Algorithm Hash digest
SHA256 8a9cc9bba675da360193643c0c45e334058fc4a7c19a06e83698ef6f955da95d
MD5 4b1c4e901dd44c3dba6cb7b3f53a76e8
BLAKE2b-256 7b1c33b94752f2d83fb3c960a3dc803a2db2b953b918913ee869ee5b58438d9a

See more details on using hashes here.

File details

Details for the file coremusic-0.2.2-cp314-cp314-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for coremusic-0.2.2-cp314-cp314-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 4ce9f35f0e8f728dbdf0880b04b997c31efcbca350f8a175a9148eacb36c0188
MD5 a2b827bc337751b7274e4aa7161a6fbe
BLAKE2b-256 9014f6c7526dcc1ce04307d4effe9c3b108fceda29c9f16cf341743416c09647

See more details on using hashes here.

File details

Details for the file coremusic-0.2.2-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for coremusic-0.2.2-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 3019b2a04de00b45a1b29e39ae02009376dc9889dff728d4671eb576b5402557
MD5 9f7a6777dc8d24562f687a51706ab0ee
BLAKE2b-256 a09a448ac7f5c7d443ead0a42b124fc43742b249990249b365bd5fa630bd24e7

See more details on using hashes here.

File details

Details for the file coremusic-0.2.2-cp312-cp312-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for coremusic-0.2.2-cp312-cp312-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 03e8b25dcc8cf667981ad015f506bea7ac0c79ced1305f8238b57fd026ac3540
MD5 dea799d49d5f3b7c02157c50924d931d
BLAKE2b-256 b35db569399e80b7b6f287dbd703ac2bb39afe2cbf826c3e4c421c9b7bbc29e3

See more details on using hashes here.

File details

Details for the file coremusic-0.2.2-cp311-cp311-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for coremusic-0.2.2-cp311-cp311-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 a46d10488f20277060d74547e75bd9f7e4f509bc59b11536866f2ae12cc54282
MD5 49771c4392a9a43e90b6c66175aa1903
BLAKE2b-256 87ac417efb72ae31905795ed6868220f8bc8f655cb83663f797b72721ca63cd9

See more details on using hashes here.

File details

Details for the file coremusic-0.2.2-cp310-cp310-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for coremusic-0.2.2-cp310-cp310-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 e657e8ce6334e67ceff9c658929ce81f7db35f66138da2f543a1ee850325bee9
MD5 4818f2cdeaaf17cdfa70c7d7679c7f74
BLAKE2b-256 2f8be9b29b8f2dfe8175d4d4aebcb36ff400686e434a0c7ac564f92309d77a37

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page