#pcm #sound #state #channel #mod #piece

nightly mleml

Framework library for working with MML

3 unstable releases

0.2.1 Dec 19, 2023
0.2.0 Dec 11, 2023
0.1.0 Nov 28, 2023

#656 in Audio

50 downloads per month

MIT license

80KB
1.5K SLoC

Table of Contents

  1. Introduction
    1. What’s included
    2. TODOs

Introduction

This is a framework library for processing music macro language (MML).

It can be used for:

  1. Simple players/compilers
  2. Somewhat complex environments for working with audio
  3. Resource-providing libraries

What’s included

  • Data types
  • Main traits (Resource, Mod, Channel, Mixer)
  • Some builtin resources These can be used as they are or as examples.

TODOs

  • Resources should provide schema
  • Provide aid with config validation
  • More builtins

lib.rs:

A library for working with music written in MML (music macro language) fashion.

It strives to be flexible enough to:

  1. allow creating sound output closely resembling that of a given platform
  2. allow any type of usage, from a basic MML compiler to a DAW-like environment.

Overview

Base trait for other traits is Resource, which provides a name, a description, and a unique ID. It also provides configuration, which is a flat JSON array, and state, which is a byte-slice.

Every resource has at least one function that, besides other inputs and outputs, takes config and state and returns new state. This allows making the functions pure.

These resources are defined:

  • Mod: essentially is a function that takes some piece of data and produces a new piece of data.
  • Channel: takes a piece of data and is expected to pass it through multiple mods, respecting their configs and states.
  • Mixer: takes sounds (or pieces of sounds) and combines them into a new sound, which is returned along with unused pieces.

Vec<Rc> is extended with Pipeline trait, adding functions to help with constructing a valid senquence of mods and examining how and when the data type changes.

Logic example

Suppose that a program is receiving a stream of instructions of some sort, some of which may indicate that one or multiple channels need to be played, and the program simply needs to produce the resulting music.

The program would create a necessary number of channels that produce sound from notes and a mixer. It would then apply state changes (for example, octave shifts) to channels' states, and, when an instructions asks to play a note, do that on the required channel, and then pass the newly created sound, along with previously left unused pieces of sound, to the mixer. Mixed sound is appended to the resulting music, and leftover pieces are reused in the next invocation. On all invocations of a channel or a mixer, their output state is reused, like mixer's leftover sounds.

Dependencies

~1.2–2MB
~43K SLoC