Loopers is graphical live looper, written in Rust, designed for ease of use and rock-solid stability

Overview

Loopers

master status Crate

Loopers is a graphical live looper, written in Rust, designed for ease of use and rock-solid stability. It can be used as a practice tool, compositional aid, or for performing looped works in a live setting.

Currently it runs on Linux as a standalone Jack application, which allows it to interface with other Jack clients like effect racks, software instruments, and DAWs, or on MacOS using Jack or (experimentally) directly with CoreAudio.

video of loopers

The system is modeled as a series of hardware loop units (like the Boss Loop Station) which are synchronized with a single time control. The number of loop units is limited only by your display size, and loop lengths are limited only by available memory.

Features

  • Multiple loops synchronized by a common time control
  • Loops can be recorded to (setting loop length), overdubbed, cleared, muted, and soloed
  • Up to four parts can be used to divide up portions of a performance
  • Supports beat, measure, and free quantization of loop commands making it easy to keep things in sync
  • Unlimited undo/redo
  • Double speed and half speed playback (and overdubbing!)
  • Every operation can be controlled via the GUI or MIDI
  • Sessions can be saved and restored
  • A built-in metronome (on a separate Jack output) helps keep you in time with your loops
  • No limitations on loop lengths aside from your computer's memory
  • Cross-fading ensures a perfect loop, every time
  • It's fun!

Getting started

Linux

To build loopers, you will need jack and sdl2.

For Ubuntu/Debian these can be installed with:

$ sudo apt install jackd2 libjack-jackd2-dev libgl1-mesa-dev libsdl2-dev

Now you're ready to install loopers itself. First get a rust toolchain installed (https://rustup.rs), then:

$ cargo install loopers

Then start it with the command

$ loopers

(If you get an error about Jack not running, you will need to start the Jack server first. See the Jack documentation for details.)

This will create a Jack client, which can be hooked up to your inputs/outputs/effects with any number of tools (I recommend Claudia from KXStudio).

Loopers should also be fully compatible with PipeWire, which removes the need for a separate Jack server.

MacOS

Loopers has experimental support for running on CoreAudio, the native audio system for MacOS (you can also run it on top of jack on MacOS, which is currently better supported). To build on Mac with coreaudio:

$ brew install jack sdl2
$ cargo install loopers
$ loopers

By default it will run using CoreAudio. To run with jack instead,

$ loopers --driver jack

Note: midi is not currently supported via coreaudio, and there is no ability to choose audio sources and sinks (the default devices are used).

Documentation

UI Tour

Full UI

The UI is divided into two parts: the top contains the set of loopers, while the bottom contains controls and settings for the engine. Hovering over each looper shows controls for that looper, including setting the parts the looper is part of and controlling the mode.

Each looper displays some key information to allow the performer to quickly understand its state:

Looper View

Hovering over the looper produces controls for the looper (although most performers will prefer to use hardware buttons)

Looper Controls

At the bottom we find the engine controls

Engine Controls

Looper Modes

At any given time each looper can be in one of several modes, each identified in the UI by a color:

play color Play
In play mode, the output from the looper is mixed in with all of the other loopers and sent to the global output. This is the default mode.
record color Record
When recording is started, all existing samples for the looper are cleared. Then new audio is recorded to a sample until recording is finished, establishing the loop length.
overdub color Overdub
In overdub mode, we add new input on top of the existing samples in the looper, without changing the loop length.

In addition to those exclusive modes, a looper can have one or more of the following modifiers:

solo color Solo
If solo is enabled, all other loopers will be silenced (aside from those that are also in solo mode).
mute color Mute
When mute is enabled the looper is silenced.

The modes and modifiers can be controlled via the UI or by sending a midi command.

Quantization

When using multiple loopers, it is generally desirable for them to be synchronized together. In Loopers, this is accomplished by having a single time control which is used across all loopers. It is also key that loops have lengths which are exact multiples of each other (for example, you might have a bass loop that is 4 times as long as your rhythm loop). If the length is off by even a few milliseconds, it will quickly be noticeable after a few repeats.

To help performers get loop lengths exactly in sync, Loopers provide a quantization feature. This allows you to synchronize commands (for example, stopping recording and thus setting loop length) to certain metric events.

It supports three quantization modes, set via buttons at the bottom of the UI:

  • Free this disables quantization, and causes all commands to take effect immediately
  • Beat commands take effect on the next beat after they are issued, as determined by the tempo
  • Measure commands take effect at the start of the next measure, as determined by the tempo and time signature

Some commands are affected by quantization, and some take effect immediately. See the commands reference for more.

Commands

Every aspect of the system can be controlled via commands, both in the UI and via midi. For details on configuring midi controls, see settings.

There are two kinds of commands: looper commands, which are applied to one or more loopers, and engine commands which apply to the system as a whole. Commands can take parameters which control the behavior of the command.

Looper commands all take a first parameter that determines which looper will be targeted:

  • Selected: targets only the selected looper, as controlled via the UI or by one of the Select*Looper commands
  • Id: takes an id parameter, and targets the looper with that id
  • Index: takes an index parameter and targets the looper at that index in the currently visible part, starting from 0.
  • All: targets all loopers

Other commands may also take parameters which control their behavior.

Commands also differ in how they are affected by quantization:

  • Immediate commands take place as soon as they are received, regardless of quantization settings or the state of the system
  • Queued commands will wait in a queue for other (possibly quantized) commands to take effect before being executed. This allows you to, for example, send the command to switch to the next part (a quantized command), then send a SelectNextLooper command (a queued command), which will wait for part switch before executing.
  • Quantized commands will wait until the next quantization boundary (e.g., the start of the next measure, see Quantization for details) to execute.

Looper commands

Command Parameters Quantization Description
Record Looper Targets Quantized Moves the selected loopers to the Record mode
Overdub Looper Targets Quantized Moves the selected loopers to the Overdub mode
Play Looper Targets Quantized Moves the selected loopers to the Play mode
RecordOverdubPlay Looper Targets Quantized① Cycles from Record -> Overdub -> Play -> Overdub
Mute Looper Targets Immediate Toggles the mute modifier on the selected loopers
Solo Looper Targets Immediate Toggles the solo modifier on the selected loopers
Delete Looper Targets Immediate Deletes the selected loopers
Clear Looper Targets Quantized Clears all samples from the selected loopers
SetPan Looper Targets, a pan value from -1 (fully left) to 1 (fully right) Immediate Sets the pan for the looper
SetLevel Looper Targets, a level value from 0 (silent) to 1 (full volume) Immediate Sets the output level for the looper
1/2x Looper Targets Immediate Sets the looper to 1/2x speed
1x Looper Targets Immediate Sets the looper to 1x speed
2x Looper Targets Immediate Sets the looper to 2x speed

RecordOverdubPlay is quantized from Record -> Overdub and Overdub -> Play, but queued from Play -> Overdub.

Engine commands

Command Parameters Quantization Description
Start None Immediate Starts the engine
Stop None Immediate Stops the engine, resetting the time
StartStop None Immediate Starts the engine if it is stopped, otherwise stops it
PlayPause None Immediate Pauses the engine if it is active, otherwise restarts it
Pause None Immediate Stops the engine but does not reset the time
Reset None Immediate Resets the engine time
SetTime Time (in samples) Immediate Sets the time to the specified number of samples
AddLooper None Immediate Adds a looper to the end of the current part
SelectLooperById Looper Id Immediate Selects the looper with the given id
SelectLooperByIndex Index Immediate Selects the looper at the given index in the current part (starting from 0)
SelectPreviousLooper None Queued Selects the previous looper in the current part, wrapping around from the first to the last
SelectNextLooper None Queued Selects the next looper in the current part, wrapping around from the last to the first
PreviousPart None Quantized Goes to the previous part, skipping those parts with no loopers
NextPart None Quantized Goes to the next part, skipping those parts with no loopers
GoToPart One of A, B, C, or D Quantized Goes to the specified part
SetQuantizationMode One of Free, Beat, or Measure Immediate Sets the quantization mode for the engine
SetMetronomeLevel 0-100 Immediate Sets the metronome volume to the given percentage
SetTempoBPM bpm (float) Immediate Sets the engine's tempo to the given BPM value
SetTimeSignature upper, lower Immediate Sets the engine's time signature according to the parameters (e.g. 3, 4)
SaveSession Path Immediate Saves the current session to the given path
LoadSession Path Immediate Loads a session from the given path, replacing the existing one

Settings

Configuration is stored the standard system user config location (typically this will be ~/.config/loopers/). Currently the configuration consists of a set of mappings from midi messages to loopers commands. These should be placed in a file called midi_mappings.tsv in that config directory, which will be automatically created after loopers is run for the first time.

Each non-empty line of this file should contain the following tab-separated columns:

  1. Midi channel (either * for any channel or a channel number)
  2. Midi controller number
  3. Midi data (can be * for any data, a single value like 50, or a range like 0-100)
  4. Command name (see tables above)
  5. Command arguments (multiple arguments should be tab-separated; the special value $data can be used in the place of certain numerical arguments to use the data value of the midi event, for example for use with an expression pedal)

The midi values (channel, controller, data) can be thought of as filters for incoming midi events; for each event all matching commands will fire.

An example for configuring for use with the Behringer FCB1010 (an excellent pedalboard):

Channel	Controller	Data	Command	Arg1	Arg2	Arg3
*	22	127	RecordOverdubPlay	Selected
*	22	0	RecordOverdubPlay	Selected

*	23	127	SelectNextLooper
*	23	0	SelectNextLooper

*	24	127	NextPart
*	24	0	NextPart

*	25	127	Clear	Selected
*	25	0	Clear	Selected

*	26	127	PlayPause
*	26	0	PlayPause

*	27	0-127	SetPan	Selected	$data
Comments
  • zombie on creating looper

    zombie on creating looper

    Hi Micah,

    Great project - love it. Looking at some Rust projects myself (previously done audio in C/C++) and found your Loopers-jack code.

    Playing around with it now - getting some "zombified" messages from JACK when adding a looper instance. Is this expected?

    I have lots of experience with message-passing and C/C++ audio app design, could provide some input/design ideas for implementing "real-time-safe" looper additions, however I thought better to ask first if this is a known issue, and perhaps you've thought of a good way to solve it too??

    Side note, I might try getting this ported to LV2 for use on the MOD Devices effects box; https://moddevices.com/

    Great work, looking forward to messing with it a bit more. -Harry

    opened by harryhaaren 2
  • Add initial support for undo/redo

    Add initial support for undo/redo

    This PR adds support for undo/redo of certain operations on loopers:

    • Recording
    • Adding an overdub layer
    • Clearing a loooper

    Currently undo stacks are maintained on a per-looper basis, and the UI buttons are configured to send to the current looper.

    As undo/redo operation can change the looper length and state in unpredicatble ways, we can no longer reasonably track those separately in the frontend and backend. Now, they live solely in the backend and are shared with the frontend in a lock-free manner via Arc<Atomic<_>>.

    opened by mwylde 0
  • Soloing should be handled independently across parts

    Soloing should be handled independently across parts

    This PR causes soloing to be isolated within a part; i.e., if looper 1 in part A is soloed, and we switch to part B which has no solo loopers, all loopers should play in part B.

    opened by mwylde 0
  • Support for more powerful midi configuration

    Support for more powerful midi configuration

    This addresses #6 by allowing midi event data to be passed as an argument to a command, for example allowing you to control pan with an expression pedal.

    opened by mwylde 0
  • Added Dockerfile.aarch64 and build file to build for Raspberry Pi

    Added Dockerfile.aarch64 and build file to build for Raspberry Pi

    Running ./build-rasp-aarch64.sh will build a release version of loopers for the aarch64 (Raspbian 64-bit) architecture at target/aarch64-unknown-linux-gnu/release/loopers that can be scp'ed over to your Raspberry Pi, and chmod +x loopers and then ./loopers should execute it.

    opened by atinm 0
  • Does not compile on Raspberry Pi

    Does not compile on Raspberry Pi

    This project looks great, but it does not seem to compile on a Raspberry Pi. There do not seem to be any skia binaries for armhf architecture. I am not sure if there is a workaround for this (compiling everything from source ?).

    --- stderr Traceback (most recent call last): File "skia/bin/fetch-gn", line 26, in cpu = {'amd64': 'amd64', 'arm64': 'arm64', 'x86_64': 'amd64', 'aarch64': 'arm64'}[platform.machine().lower()] KeyError: 'armv7l' Traceback (most recent call last): File "skia/tools/git-sync-deps", line 266, in exit(main(sys.argv[1:])) File "skia/tools/git-sync-deps", line 261, in main os.path.join(os.path.dirname(deps_file_path), 'bin', 'fetch-gn')]) File "/usr/lib/python2.7/subprocess.py", line 190, in check_call raise CalledProcessError(retcode, cmd) subprocess.CalledProcessError: Command '['/usr/bin/python2', 'skia/bin/fetch-gn']' returned non-zero exit status 1 thread 'main' panicked at 'skia/tools/git-sync-deps failed', /home/pi/.cargo/registry/src/github.com-1285ae84e5963aae/skia-bindings-0.41.0/build_support/skia/config.rs:321:9 note: run with RUST_BACKTRACE=1 environment variable to display a backtrace

    opened by mark-orion 1
  • Unable to build on NixOS

    Unable to build on NixOS

    First of all, thanks for this wonderful project. The video and docs look really appealing, can't wait to make music with this!

    Unfortunately, I'm unable to build it on NixOS. I get the following build output:

    nix-env -f $NIXPKGS -iA loopers  --max-jobs 8 --builders '' --show-trace
    installing 'loopers-0.2.0'
    this derivation will be built:
      /nix/store/gn4ca81s3zppyg3xahj7xh338c3w1234-loopers-0.2.0.drv
    building '/nix/store/gn4ca81s3zppyg3xahj7xh338c3w1234-loopers-0.2.0.drv'...
    unpacking sources
    unpacking source archive /nix/store/9alflm8bv1pn9z18b264xz1hayxdakwh-source
    source root is source
    Executing cargoSetupPostUnpackHook
    unpacking source archive /nix/store/syysm2y64cfq04jmy2hwbz3cisp6yb72-loopers-0.2.0-vendor.tar.gz
    Finished cargoSetupPostUnpackHook
    patching sources
    Executing cargoSetupPostPatchHook
    Validating consistency between /build/source//Cargo.lock and /build/loopers-0.2.0-vendor.tar.gz/Cargo.lock
    Finished cargoSetupPostPatchHook
    configuring
    building
    Executing cargoBuildHook
    ++ env CC_x86_64-unknown-linux-gnu=/nix/store/xiq6j4jsyj351p8q3yw9cg1hdqp9m685-gcc-wrapper-10.3.0/bin/cc CXX_x86_64-unknown-linux-gnu=/nix/store/xiq6j4jsyj351p8q3yw9cg1hdqp9m685-gcc-wrapper-10.3.0/bin/c++ CC_x86_64-unknown-linux-gnu=/nix/store/xiq6j4jsyj351p8q3yw9cg1hdqp9m685-gcc-wrapper-10.3.0/bin/cc CXX_x86_64-unknown-linux-gnu=/nix/store/xiq6j4jsyj351p8q3yw9cg1hdqp9m685-gcc-wrapper-10.3.0/bin/c++ cargo build -j 8 --target x86_64-unknown-linux-gnu --frozen --release
       Compiling libc v0.2.100
       Compiling proc-macro2 v1.0.28
       Compiling memchr v2.4.1
       Compiling unicode-xid v0.2.2
       Compiling cfg-if v1.0.0
       Compiling log v0.4.14
       Compiling autocfg v1.0.1
       Compiling syn v1.0.75
       Compiling serde_derive v1.0.128
       Compiling serde v1.0.128
       Compiling cc v1.0.69
       Compiling ryu v1.0.5
       Compiling lazy_static v1.4.0
       Compiling spin v0.5.2
       Compiling untrusted v0.7.1
       Compiling radium v0.5.3
       Compiling once_cell v1.8.0
       Compiling tinyvec_macros v0.1.0
       Compiling glob v0.3.0
       Compiling serde_json v1.0.66
       Compiling version_check v0.9.3
       Compiling wyz v0.2.0
       Compiling matches v0.1.9
       Compiling funty v1.1.0
       Compiling tap v1.0.1
       Compiling unicode-width v0.1.8
       Compiling unicode-bidi v0.3.6
       Compiling regex-syntax v0.6.25
       Compiling percent-encoding v2.1.0
       Compiling crc32fast v1.2.1
       Compiling ansi_term v0.11.0
       Compiling bindgen v0.59.1
       Compiling khronos_api v3.1.0
       Compiling termcolor v1.1.2
       Compiling strsim v0.8.0
       Compiling adler v1.0.2
       Compiling crossbeam-utils v0.8.5
       Compiling base64 v0.13.0
       Compiling bitflags v1.3.2
       Compiling humantime v2.1.0
       Compiling vec_map v0.8.2
       Compiling version-compare v0.0.10
       Compiling cfg-if v0.1.10
       Compiling ppv-lite86 v0.2.10
       Compiling unicode-segmentation v1.8.0
       Compiling lazycell v1.3.0
       Compiling itoa v0.4.7
       Compiling shlex v1.0.0
       Compiling peeking_take_while v0.1.2
       Compiling rustc-hash v1.1.0
       Compiling chunked_transfer v1.4.0
       Compiling regex-automata v0.1.10
       Compiling xml-rs v0.8.4
       Compiling crossbeam-queue v0.3.2
       Compiling convert_case v0.4.0
       Compiling remove_dir_all v0.5.3
       Compiling arrayvec v0.7.1
       Compiling sdl2 v0.34.5
       Compiling bytes v1.0.1
       Compiling hound v3.4.0
       Compiling either v1.6.1
       Compiling byteorder v1.4.3
       Compiling futures v0.1.31
       Compiling libloading v0.6.7
       Compiling tinyvec v1.3.1
       Compiling miniz_oxide v0.4.4
       Compiling num-traits v0.2.14
       Compiling num-integer v0.1.44
       Compiling atomic v0.5.0
       Compiling textwrap v0.11.0
       Compiling form_urlencoded v1.0.1
       Compiling nom v6.1.2
       Compiling clang-sys v1.0.1
       Compiling sdl2-sys v0.34.5
       Compiling ring v0.16.20
       Compiling tinyfiledialogs v3.8.3
       Compiling heck v0.3.3
       Compiling itertools v0.10.1
       Compiling unicode-normalization v0.1.19
       Compiling fern v0.6.0
       Compiling aho-corasick v0.7.18
       Compiling csv-core v0.1.10
       Compiling getrandom v0.2.3
       Compiling dirs-sys v0.3.6
       Compiling time v0.1.43
       Compiling jack-sys v0.2.2
       Compiling iovec v0.1.4
       Compiling atty v0.2.14
       Compiling xattr v0.2.2
       Compiling which v3.1.1
       Compiling filetime v0.2.15
       Compiling bitvec v0.19.5
       Compiling quote v1.0.9
       Compiling gl_generator v0.14.0
       Compiling crossbeam-channel v0.5.1
       Compiling idna v0.2.3
       Compiling regex v1.5.4
       Compiling flate2 v1.0.20
       Compiling rand_core v0.6.3
       Compiling dirs v3.0.2
       Compiling dirs v2.0.2
       Compiling bytes v0.4.12
       Compiling jack v0.7.1
       Compiling clap v2.33.3
       Compiling tar v0.4.37
       Compiling gl v0.14.0
       Compiling url v2.2.2
       Compiling rand_chacha v0.3.1
       Compiling env_logger v0.8.4
       Compiling webpki v0.21.4
       Compiling sct v0.6.1
       Compiling chrono v0.4.19
       Compiling rand v0.8.4
       Compiling webpki-roots v0.21.1
       Compiling cexpr v0.5.0
       Compiling rustls v0.19.1
       Compiling tempfile v3.2.0
       Compiling ureq v2.1.1
       Compiling derive_more v0.99.16
       Compiling bstr v0.2.16
       Compiling toml v0.5.8
       Compiling csv v1.1.6
       Compiling loopers-common v0.2.0 (/build/source/loopers-common)
       Compiling skia-bindings v0.41.0
       Compiling loopers-engine v0.2.0 (/build/source/loopers-engine)
    error: failed to run custom build command for `skia-bindings v0.41.0`
    
    Caused by:
      process didn't exit successfully: `/build/source/target/release/build/skia-bindings-50ce9445063d0674/build-script-build` (exit status: 101)
      --- stdout
      cargo:rerun-if-env-changed=SKIA_DEBUG
      cargo:rerun-if-env-changed=SKIA_SOURCE_DIR
      cargo:rerun-if-env-changed=SKIA_LIBRARY_SEARCH_PATH
      STARTING OFFLINE BUILD
      HOST: x86_64-unknown-linux-gnu
      cargo:rerun-if-env-changed=OPT_LEVEL
      cargo:rerun-if-env-changed=CC
      cargo:rerun-if-env-changed=CXX
      cargo:rerun-if-env-changed=SKIA_USE_SYSTEM_LIBRARIES
      cargo:rerun-if-env-changed=SDKROOT
      cargo:rerun-if-env-changed=SKIA_NINJA_COMMAND
      cargo:rerun-if-env-changed=SKIA_GN_COMMAND
      Probing 'python'
      Python 2 found: "python"
      Skia args: is_official_build=true is_debug=false skia_enable_gpu=true skia_use_gl=true skia_use_egl=false skia_use_x11=true skia_use_system_libpng=false skia_use_libwebp_encode=false skia_use_libwebp_decode=false skia_use_system_zlib=false skia_use_xps=false skia_use_dng_sdk=false cc="clang" cxx="clang++" skia_use_icu=false skia_use_system_libjpeg_turbo=false target_os="linux" target_cpu="x86_64" skia_use_expat=true skia_use_system_expat=false extra_cflags=["-O3","--target=x86_64-unknown-linux-gnu"] extra_asmflags=["--target=x86_64-unknown-linux-gnu"]
      Done. Made 76 targets from 28 files in 106ms
      ninja: Entering directory `/build/source/target/x86_64-unknown-linux-gnu/release/build/skia-bindings-cd8da1efe10dd65c/out/skia'
      [1/909] stamp obj/android_utils.stamp
      [2/909] stamp obj/arm64.stamp
      [3/909] stamp obj/armv7.stamp
      [4/909] stamp obj/compile_processors.stamp
      [5/909] stamp obj/compile_sksl_fp_tests.stamp
      [6/909] stamp obj/compile_sksl_glsl_nosettings_tests.stamp
      [7/909] stamp obj/compile_sksl_glsl_tests.stamp
      [8/909] stamp obj/compile_sksl_metal_tests.stamp
      [9/909] compile ../../../../../../../../../nix/store/z2g04w32m41h43kjmfj0k1c07hpmc6f9-source/src/opts/SkOpts_avx.cpp
      FAILED: obj/src/opts/avx.SkOpts_avx.o
      clang++ -MD -MF obj/src/opts/avx.SkOpts_avx.o.d -DNDEBUG -DSK_R32_SHIFT=16 -DSK_GAMMA_APPLY_TO_A8 -DSKIA_IMPLEMENTATION=1 -I../../../../../../../../../nix/store/z2g04w32m41h43kjmfj0k1c07hpmc6f9-source -mavx -Wno-attributes -fstrict-aliasing -fPIC -fvisibility=hidden -O3 -fdata-sections -ffunction-sections -O3 --target=x86_64-unknown-linux-gnu -std=c++17 -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -c ../../../../../../../../../nix/store/z2g04w32m41h43kjmfj0k1c07hpmc6f9-source/src/opts/SkOpts_avx.cpp -o obj/src/opts/avx.SkOpts_avx.o
      /bin/sh: clang++: not found
      [10/909] stamp obj/compile_sksl_skvm_tests.stamp
      [11/909] stamp obj/compile_sksl_spirv_tests.stamp
      [12/909] stamp obj/crc32.stamp
      [13/909] stamp obj/dehydrate_sksl.stamp
      [14/909] compile ../../../../../../../../../nix/store/z2g04w32m41h43kjmfj0k1c07hpmc6f9-source/src/ports/SkFontConfigInterface.cpp
      FAILED: obj/src/ports/fontmgr_FontConfigInterface.SkFontConfigInterface.o
      clang++ -MD -MF obj/src/ports/fontmgr_FontConfigInterface.SkFontConfigInterface.o.d -DNDEBUG -DSK_R32_SHIFT=16 -DSK_GAMMA_APPLY_TO_A8 -DSKIA_IMPLEMENTATION=1 -I../../../../../../../../../nix/store/z2g04w32m41h43kjmfj0k1c07hpmc6f9-source -Wno-attributes -fstrict-aliasing -fPIC -fvisibility=hidden -O3 -fdata-sections -ffunction-sections -O3 --target=x86_64-unknown-linux-gnu -std=c++17 -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -c ../../../../../../../../../nix/store/z2g04w32m41h43kjmfj0k1c07hpmc6f9-source/src/ports/SkFontConfigInterface.cpp -o obj/src/ports/fontmgr_FontConfigInterface.SkFontConfigInterface.o
      /bin/sh: clang++: not found
      [15/909] compile ../../../../../../../../../nix/store/z2g04w32m41h43kjmfj0k1c07hpmc6f9-source/src/ports/SkFontConfigInterface_direct.cpp
      FAILED: obj/src/ports/fontmgr_FontConfigInterface.SkFontConfigInterface_direct.o
      clang++ -MD -MF obj/src/ports/fontmgr_FontConfigInterface.SkFontConfigInterface_direct.o.d -DNDEBUG -DSK_R32_SHIFT=16 -DSK_GAMMA_APPLY_TO_A8 -DSKIA_IMPLEMENTATION=1 -I../../../../../../../../../nix/store/z2g04w32m41h43kjmfj0k1c07hpmc6f9-source -Wno-attributes -fstrict-aliasing -fPIC -fvisibility=hidden -O3 -fdata-sections -ffunction-sections -O3 --target=x86_64-unknown-linux-gnu -std=c++17 -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -c ../../../../../../../../../nix/store/z2g04w32m41h43kjmfj0k1c07hpmc6f9-source/src/ports/SkFontConfigInterface_direct.cpp -o obj/src/ports/fontmgr_FontConfigInterface.SkFontConfigInterface_direct.o
      /bin/sh: clang++: not found
      [16/909] compile ../../../../../../../../../nix/store/z2g04w32m41h43kjmfj0k1c07hpmc6f9-source/src/ports/SkFontConfigInterface_direct_factory.cpp
      FAILED: obj/src/ports/fontmgr_FontConfigInterface.SkFontConfigInterface_direct_factory.o
      clang++ -MD -MF obj/src/ports/fontmgr_FontConfigInterface.SkFontConfigInterface_direct_factory.o.d -DNDEBUG -DSK_R32_SHIFT=16 -DSK_GAMMA_APPLY_TO_A8 -DSKIA_IMPLEMENTATION=1 -I../../../../../../../../../nix/store/z2g04w32m41h43kjmfj0k1c07hpmc6f9-source -Wno-attributes -fstrict-aliasing -fPIC -fvisibility=hidden -O3 -fdata-sections -ffunction-sections -O3 --target=x86_64-unknown-linux-gnu -std=c++17 -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -c ../../../../../../../../../nix/store/z2g04w32m41h43kjmfj0k1c07hpmc6f9-source/src/ports/SkFontConfigInterface_direct_factory.cpp -o obj/src/ports/fontmgr_FontConfigInterface.SkFontConfigInterface_direct_factory.o
      /bin/sh: clang++: not found
      [17/909] compile ../../../../../../../../../nix/store/z2g04w32m41h43kjmfj0k1c07hpmc6f9-source/src/ports/SkFontMgr_FontConfigInterface.cpp
      FAILED: obj/src/ports/fontmgr_FontConfigInterface.SkFontMgr_FontConfigInterface.o
      clang++ -MD -MF obj/src/ports/fontmgr_FontConfigInterface.SkFontMgr_FontConfigInterface.o.d -DNDEBUG -DSK_R32_SHIFT=16 -DSK_GAMMA_APPLY_TO_A8 -DSKIA_IMPLEMENTATION=1 -I../../../../../../../../../nix/store/z2g04w32m41h43kjmfj0k1c07hpmc6f9-source -Wno-attributes -fstrict-aliasing -fPIC -fvisibility=hidden -O3 -fdata-sections -ffunction-sections -O3 --target=x86_64-unknown-linux-gnu -std=c++17 -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -c ../../../../../../../../../nix/store/z2g04w32m41h43kjmfj0k1c07hpmc6f9-source/src/ports/SkFontMgr_FontConfigInterface.cpp -o obj/src/ports/fontmgr_FontConfigInterface.SkFontMgr_FontConfigInterface.o
      /bin/sh: clang++: not found
      [18/909] compile ../../../../../../../../../nix/store/z2g04w32m41h43kjmfj0k1c07hpmc6f9-source/src/ports/SkFontMgr_android.cpp
      FAILED: obj/src/ports/fontmgr_android.SkFontMgr_android.o
      clang++ -MD -MF obj/src/ports/fontmgr_android.SkFontMgr_android.o.d -DNDEBUG -DSK_R32_SHIFT=16 -DSK_GAMMA_APPLY_TO_A8 -DSKIA_IMPLEMENTATION=1 -DXML_STATIC -I../../../../../../../../../nix/store/z2g04w32m41h43kjmfj0k1c07hpmc6f9-source -Wno-attributes -fstrict-aliasing -fPIC -fvisibility=hidden -O3 -fdata-sections -ffunction-sections -O3 --target=x86_64-unknown-linux-gnu -isystem /nix/store/z2g04w32m41h43kjmfj0k1c07hpmc6f9-source/third_party/externals/expat/expat/lib -std=c++17 -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -c ../../../../../../../../../nix/store/z2g04w32m41h43kjmfj0k1c07hpmc6f9-source/src/ports/SkFontMgr_android.cpp -o obj/src/ports/fontmgr_android.SkFontMgr_android.o
      /bin/sh: clang++: not found
      ninja: build stopped: subcommand failed.
    
      --- stderr
      thread 'main' panicked at '`ninja` returned an error, please check the output for details.', /build/loopers-0.2.0-vendor.tar.gz/skia-bindings/build_support/skia/config.rs:388:5
      note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    warning: build failed, waiting for other jobs to finish...
    error: build failed
    error: builder for '/nix/store/gn4ca81s3zppyg3xahj7xh338c3w1234-loopers-0.2.0.drv' failed with exit code 101;
           last 10 log lines:
           >   FAILED: obj/src/ports/fontmgr_android.SkFontMgr_android.o
           >   clang++ -MD -MF obj/src/ports/fontmgr_android.SkFontMgr_android.o.d -DNDEBUG -DSK_R32_SHIFT=16 -DSK_GAMMA_APPLY_TO_A8 -DSKIA_IMPLEMENTATION=1 -DXML_STATIC -I../../../../../../../../../nix/store/z2g04w32m41h43kjmfj0k1c07hpmc6f9-source -Wno-attributes -fstrict-aliasing -fPIC -fvisibility=hidden -O3 -fdata-sections -ffunction-sections -O3 --target=x86_64-unknown-linux-gnu -isystem /nix/store/z2g04w32m41h43kjmfj0k1c07hpmc6f9-source/third_party/externals/expat/expat/lib -std=c++17 -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -c ../../../../../../../../../nix/store/z2g04w32m41h43kjmfj0k1c07hpmc6f9-source/src/ports/SkFontMgr_android.cpp -o obj/src/ports/fontmgr_android.SkFontMgr_android.o
           >   /bin/sh: clang++: not found
           >   ninja: build stopped: subcommand failed.
           >
           >   --- stderr
           >   thread 'main' panicked at '`ninja` returned an error, please check the output for details.', /build/loopers-0.2.0-vendor.tar.gz/skia-bindings/build_support/skia/config.rs:388:5
           >   note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
           > warning: build failed, waiting for other jobs to finish...
           > error: build failed
           For full logs, run 'nix log /nix/store/gn4ca81s3zppyg3xahj7xh338c3w1234-loopers-0.2.0.drv'.
    
    opened by magnetophon 0
  • Record MIDI

    Record MIDI

    Hello!

    I'm wondering if MIDI recording and playback is in scope for this project.

    My specific use case would be recording and then playing back MIDI from and to a hardware drum machine.

    I could record the audio output from the drum machine but then I can't tweak the synthesizer settings after the recording.

    opened by szszoke 2
Releases(v0.2.0)
  • v0.2.0(Nov 15, 2021)

    The 0.2 release of Loopers adds a number of new features:

    • Undo/redo for operations on loopers
    • ½x/2x speed modes
    • Experimental support for CoreAudio on MacOS

    and fixes several bugs

    • Soloing is now evaluated independently across parts
    • Jack port operations now occur off of the audio thread, fixing crashes with PipeWire
    • Starting recording in Free mode now correctly starts the engine
    • BPM in save files is now stored independent of the sample rate
    Source code(tar.gz)
    Source code(zip)
  • v0.1.2(Feb 9, 2021)

    • Fixed bug that caused audio glitches during frames which contained a trigger (e.g., when moving from record to overdub)
    • Updated midi configuration to allow filtering on channel and added support for using data values as arguments (e.g., for expression pedals)
    • Added support for panning loopers
    • Added support for controlling looper output levels
    Source code(tar.gz)
    Source code(zip)
Owner
Micah Wylde
Software Engineer @splunk, working on stream processing. Previously @lyft, @SiftScience and @quantcast.
Micah Wylde
Auritia is a DAW coded in Rust and Vue in hopes of having cross platform compatability, while also providing enough features for anyone to use professionally

Steps Install WebView if you're not on Windows 11 Install Node deps npm i To run the dev server do npm run tauri dev Compiling Linux You will need to

Auritia 20 Aug 27, 2022
A Skyline plugin for Super Smash Bros. Ultimate that enables the use and modification of stage features that are otherwise hardcoded into the game.

stage_config A Skyline plugin for Super Smash Bros. Ultimate that enables the use and modification of stage features that are otherwise hardcoded into

TNN 4 Oct 14, 2023
Spotify for the terminal written in Rust 🚀

Spotify TUI A Spotify client for the terminal written in Rust. The terminal in the demo above is using the Rigel theme. Spotify TUI Installation Homeb

Alexander Keliris 14.1k Jan 1, 2023
A music theory guide written in Rust.

Rust Music Theory A library and executable that provides programmatic implementation of the basis of the music theory. Table of Contents Overview Usag

Ozan Kaşıkçı 551 Dec 21, 2022
musify is a simple discord bot to play music within a voice channel, written in the rust programming language.

musify-rs musify is a simple discord bot to play music within a voice channel, written in the rust programming language. Features A simple song queue

NV6 5 Aug 14, 2022
A Spotify downloader written in rust, which does not require a premium account

DownOnSpot A Spotify downloader written in Rust Disclaimer DownOnSpot was not developed for piracy. It is meant to be used in compliance with DMCA, Se

oSumAtrIX 273 Jan 7, 2023
Terminal Music Player written in Rust

Terminal Music Player written in Rust Listen to music freely as both in freedom and free of charge! Freedom: As time goes by, online service providers

null 376 Jan 3, 2023
Synthesizer IO - a synthesizer written in Rust.

Synthesizer IO Hopefully, this will become a synthesizer written in Rust. At the moment, it's experimental bits of technology toward that end. Running

Raph Levien 278 Dec 13, 2022
A drum machine written in Rust

rudiments rudiments is a step-sequencing drum machine that plays rhythm patterns using audio samples. Features 16-step programmable measures. Configur

Jonas Michel 141 Nov 23, 2022
VST2 frequency modulation synthesizer written in Rust

OctaSine VST2 frequency modulation synthesizer written in Rust. Official website with downloads OctaSine.com Audio examples SoundCloud Screenshots Lig

Joakim Frostegård 412 Dec 30, 2022
🎵 A super simple VST written in Rust

DigiDist This is a simple little VST plugin, developed in Rust using the vst2 crate. It doesn't sound particularly great, but it demonstrates just how

Joe Clay 34 May 29, 2022
A simple GUI audio player written in Rust with egui. Inspired by foobar2000.

Music Player A simple GUI music player inspired by foobar2000 written in Rust using egui. The goal of this project is to learn about making gui/ nativ

Ryan Blecher 5 Sep 16, 2022
Small music theory library with MIDI capabilities written in Rust

mumuse Small music theory library with MIDI capabilities written in Rust (wip). Examples Creating notes and transpositions // Declare Note from &str l

Alexis LOUIS 4 Jul 27, 2022
A terminal music player written in the Rust language.

A terminal music player written in the Rust language. (Windows) Requirements Configuration file path: C:\Users\xxx\.config\music_player\config.yml # P

xiao hui 162 Nov 12, 2022
Tool for solving music harmonics written in rust.

Harmonized Tool for solving harmonics tasks Installation steps Requirements Make shure you have installed rust cargo If not: Download and run rust ins

Dmitry Miasnenko 0 Jan 28, 2022
API-agnostic audio plugin framework written in Rust

Because everything is better when you do it yourself - Rust VST3 and CLAP framework and plugins

Robbert van der Helm 415 Dec 27, 2022
ncspot is a ncurses Spotify client written in Rust using librespot.

ncspot is a ncurses Spotify client written in Rust using librespot. It is heavily inspired by ncurses MPD clients, such as ncmpc. My motivation was to provide a simple and resource friendly alternative to the official client as well as to support platforms that currently don't have a Spotify client, such as the *BSDs.

Henrik Friedrichsen 3.4k Jan 8, 2023
🎹 [WIP] Full-fledged software sampler written in Rust.

sampler This project aims to be a full-fledged software sampler written in Rust. While I initially used Apple's AUSampler for sampled instruments in m

soaky audio 12 Dec 27, 2022
Small, compact music player written with Rust.

trill Small, compact music player based on rodio. Usage Run the program with --help to see the available options. To just play a sound file: trill -p

Will 3 Nov 25, 2022