Giter Site home page Giter Site logo

loopers's Introduction

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

loopers's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

loopers's Issues

Automaticaly set bpm

is it possible to automatically deduce the tempo based on the signature and the first recording?

or do you think this feature is useful / easy to develop?🤔

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

keyboard bindings?

Is there a list of keyboard bindings anyplace? Would like to use keypresses to control it from my USB foot pedal. Thx!

I looks so nice

In the last days I checked several looper programs for Linux and I'm a little disappointed by them.
I looks so nice and I would love to use them if the work on it is continued and if there would be snap or flatpack releases.

Is there a reason why you discontinued it?

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'.

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.

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

Error on install

Hello floks, thank you for this project!
I have an error on install with a fresh Ubuntu Studio 22.04. I followed install steps, but got an error error: linking with cc failed: exit status: 1

Maybe it is something obvious, but I can't see what... Here is the detailed log:

error: linking with `cc` failed: exit status: 1
  |
  = note: LC_ALL="C" PATH="/home/vvatelot/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/bin:/home/vvatelot/.deno/bin:/home/vvatelot/bin:/usr/local/bin:/home/vvatelot/.local/bin:/usr/local/go/bin:/home/vvatelot/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/vvatelot/.local:/home/vvatelot/.npm-packages/bin:/home/vvatelot/.local/share/yabridge" VSLANG="1033" "cc" "-m64" "/tmp/rustcY9yyf2/symbols.o" "/tmp/cargo-installRRV1kb/release/deps/loopers-9077c86fcd36ebe8.loopers.076f2a35-cgu.0.rcgu.o" "/tmp/cargo-installRRV1kb/release/deps/loopers-9077c86fcd36ebe8.loopers.076f2a35-cgu.1.rcgu.o" "/tmp/cargo-installRRV1kb/release/deps/loopers-9077c86fcd36ebe8.loopers.076f2a35-cgu.10.rcgu.o" "/tmp/cargo-installRRV1kb/release/deps/loopers-9077c86fcd36ebe8.loopers.076f2a35-cgu.11.rcgu.o" "/tmp/cargo-installRRV1kb/release/deps/loopers-9077c86fcd36ebe8.loopers.076f2a35-cgu.12.rcgu.o" "/tmp/cargo-installRRV1kb/release/deps/loopers-9077c86fcd36ebe8.loopers.076f2a35-cgu.13.rcgu.o" "/tmp/cargo-installRRV1kb/release/deps/loopers-9077c86fcd36ebe8.loopers.076f2a35-cgu.14.rcgu.o" "/tmp/cargo-installRRV1kb/release/deps/loopers-9077c86fcd36ebe8.loopers.076f2a35-cgu.15.rcgu.o" "/tmp/cargo-installRRV1kb/release/deps/loopers-9077c86fcd36ebe8.loopers.076f2a35-cgu.2.rcgu.o" "/tmp/cargo-installRRV1kb/release/deps/loopers-9077c86fcd36ebe8.loopers.076f2a35-cgu.3.rcgu.o" "/tmp/cargo-installRRV1kb/release/deps/loopers-9077c86fcd36ebe8.loopers.076f2a35-cgu.4.rcgu.o" "/tmp/cargo-installRRV1kb/release/deps/loopers-9077c86fcd36ebe8.loopers.076f2a35-cgu.5.rcgu.o" "/tmp/cargo-installRRV1kb/release/deps/loopers-9077c86fcd36ebe8.loopers.076f2a35-cgu.6.rcgu.o" "/tmp/cargo-installRRV1kb/release/deps/loopers-9077c86fcd36ebe8.loopers.076f2a35-cgu.7.rcgu.o" "/tmp/cargo-installRRV1kb/release/deps/loopers-9077c86fcd36ebe8.loopers.076f2a35-cgu.8.rcgu.o" "/tmp/cargo-installRRV1kb/release/deps/loopers-9077c86fcd36ebe8.loopers.076f2a35-cgu.9.rcgu.o" "/tmp/cargo-installRRV1kb/release/deps/loopers-9077c86fcd36ebe8.1mamel2hwumle0ij.rcgu.o" "-Wl,--as-needed" "-L" "/tmp/cargo-installRRV1kb/release/deps" "-L" "/usr/lib/x86_64-linux-gnu" "-L" "/tmp/cargo-installRRV1kb/release/build/skia-bindings-ac74a630e2130a5a/out/skia" "-L" "/tmp/cargo-installRRV1kb/release/build/tinyfiledialogs-eed98524b8b95292/out" "-L" "/home/vvatelot/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-Wl,-Bstatic" "/tmp/cargo-installRRV1kb/release/deps/libfern-5371e2a105c209cd.rlib" "/tmp/cargo-installRRV1kb/release/deps/libclap-8946347088383757.rlib" "/tmp/cargo-installRRV1kb/release/deps/libvec_map-7b25bb90ab08f82f.rlib" "/tmp/cargo-installRRV1kb/release/deps/libtextwrap-3d6583a8dfa78297.rlib" "/tmp/cargo-installRRV1kb/release/deps/libunicode_width-bbebe6f0812c30ee.rlib" "/tmp/cargo-installRRV1kb/release/deps/libstrsim-262d8bc63ae9c131.rlib" "/tmp/cargo-installRRV1kb/release/deps/libatty-e6ac6f5b8e5105bc.rlib" "/tmp/cargo-installRRV1kb/release/deps/libansi_term-fc569761c513f564.rlib" "/tmp/cargo-installRRV1kb/release/deps/libloopers_gui-a9cc5fe92c98ee72.rlib" "/tmp/cargo-installRRV1kb/release/deps/libtinyfiledialogs-88ce58f7ba5ff8ac.rlib" "/tmp/cargo-installRRV1kb/release/deps/libgl-b76f5d952cba8b96.rlib" "/tmp/cargo-installRRV1kb/release/deps/libskia_safe-059b4bc9926f37c5.rlib" "/tmp/cargo-installRRV1kb/release/deps/libskia_bindings-d5a44e01d727d78d.rlib" "/tmp/cargo-installRRV1kb/release/deps/libsdl2-0ed08ae88fc6550e.rlib" "/tmp/cargo-installRRV1kb/release/deps/libsdl2_sys-e1aa7a2f9bdac56d.rlib" "/tmp/cargo-installRRV1kb/release/deps/libregex-7167774a23191df9.rlib" "/tmp/cargo-installRRV1kb/release/deps/libaho_corasick-4433db8dd5f3d5a1.rlib" "/tmp/cargo-installRRV1kb/release/deps/libregex_syntax-57c75579a8fceb80.rlib" "/tmp/cargo-installRRV1kb/release/deps/libloopers_engine-3a6a5bd2b367cce3.rlib" "/tmp/cargo-installRRV1kb/release/deps/libdirs-91d1b916baf4d45b.rlib" "/tmp/cargo-installRRV1kb/release/deps/libserde_json-6484d919b96a6618.rlib" "/tmp/cargo-installRRV1kb/release/deps/libhound-e8140e083c56408f.rlib" "/tmp/cargo-installRRV1kb/release/deps/libitertools-c5cf339f461a74d1.rlib" "/tmp/cargo-installRRV1kb/release/deps/libeither-10d0c51b32ed8a2e.rlib" "/tmp/cargo-installRRV1kb/release/deps/libatomic-b20fd98801918198.rlib" "/tmp/cargo-installRRV1kb/release/deps/libloopers_common-fddc9cd9746b97fd.rlib" "/tmp/cargo-installRRV1kb/release/deps/libarrayvec-88855718cdab6f84.rlib" "/tmp/cargo-installRRV1kb/release/deps/libcsv-9b9a610563487c4a.rlib" "/tmp/cargo-installRRV1kb/release/deps/libryu-2a3ed2ef503105f5.rlib" "/tmp/cargo-installRRV1kb/release/deps/libitoa-a7b1f8b015ad0e78.rlib" "/tmp/cargo-installRRV1kb/release/deps/libcsv_core-6ad980ac26da33ab.rlib" "/tmp/cargo-installRRV1kb/release/deps/libmemchr-2cbe141a73b58ecf.rlib" "/tmp/cargo-installRRV1kb/release/deps/libcrossbeam_channel-a2c891d6c4fd4093.rlib" "/tmp/cargo-installRRV1kb/release/deps/libserde-e0d4e9fb69ccde32.rlib" "/tmp/cargo-installRRV1kb/release/deps/libjack-c5d76812596fa3d3.rlib" "/tmp/cargo-installRRV1kb/release/deps/liblog-ae64da9d89890be7.rlib" "/tmp/cargo-installRRV1kb/release/deps/libbitflags-d708dc7fb6cd55fa.rlib" "/tmp/cargo-installRRV1kb/release/deps/libjack_sys-2845cf10beb31f31.rlib" "/tmp/cargo-installRRV1kb/release/deps/liblibloading-1730f4b0d132bae2.rlib" "/tmp/cargo-installRRV1kb/release/deps/liblazy_static-a1515f106746c5a2.rlib" "/tmp/cargo-installRRV1kb/release/deps/libfutures-cec7681de5553ff4.rlib" "/tmp/cargo-installRRV1kb/release/deps/libdirs-707b1e3878b352f2.rlib" "/tmp/cargo-installRRV1kb/release/deps/libdirs_sys-add2509fa993c01b.rlib" "/tmp/cargo-installRRV1kb/release/deps/libcfg_if-5ec661f0b366b230.rlib" "/tmp/cargo-installRRV1kb/release/deps/libcrossbeam_queue-fb65519987f59232.rlib" "/tmp/cargo-installRRV1kb/release/deps/libcrossbeam_utils-b092ddac5946b2fd.rlib" "/tmp/cargo-installRRV1kb/release/deps/libcfg_if-f2340c58ea21a555.rlib" "/tmp/cargo-installRRV1kb/release/deps/libchrono-b7d7372a225b811a.rlib" "/tmp/cargo-installRRV1kb/release/deps/libiana_time_zone-bb355ecb288521a2.rlib" "/tmp/cargo-installRRV1kb/release/deps/libnum_integer-115151c055b8b928.rlib" "/tmp/cargo-installRRV1kb/release/deps/libnum_traits-c9b0f029bd0d59b1.rlib" "/tmp/cargo-installRRV1kb/release/deps/libtime-ba3dcc550c919c55.rlib" "/tmp/cargo-installRRV1kb/release/deps/libbytes-6f24ab727c0ff875.rlib" "/tmp/cargo-installRRV1kb/release/deps/libiovec-d1a9897c98a089d9.rlib" "/tmp/cargo-installRRV1kb/release/deps/liblibc-846aad08a8d083ea.rlib" "/tmp/cargo-installRRV1kb/release/deps/libbyteorder-caabb44180139e96.rlib" "/home/vvatelot/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-bc6b80525d6b1f3b.rlib" "/home/vvatelot/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libpanic_unwind-dbb416fff97e9855.rlib" "/home/vvatelot/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libobject-af60be54961a030f.rlib" "/home/vvatelot/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libmemchr-1303bc5098cb2f44.rlib" "/home/vvatelot/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libaddr2line-96ca4807f9d03fdf.rlib" "/home/vvatelot/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libgimli-03b108942351d49a.rlib" "/home/vvatelot/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_demangle-b348df34b7d8ac11.rlib" "/home/vvatelot/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd_detect-26a06d9c5ec29d3a.rlib" "/home/vvatelot/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libhashbrown-b5295fdab67e4cf6.rlib" "/home/vvatelot/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libminiz_oxide-b257ed099e7f67d0.rlib" "/home/vvatelot/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libadler-c27b5dca54e295d8.rlib" "/home/vvatelot/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_alloc-f6c8245d52afa66d.rlib" "/home/vvatelot/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libunwind-642c68f15c02cc52.rlib" "/home/vvatelot/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcfg_if-eecd84150c4ad967.rlib" "/home/vvatelot/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liblibc-123ffa13a38501db.rlib" "/home/vvatelot/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-2177aff67f4e9999.rlib" "/home/vvatelot/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_core-2298a66e03bd0fd2.rlib" "/home/vvatelot/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcore-f3c3b25345711552.rlib" "/home/vvatelot/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-10f041ff25bad5f3.rlib" "-Wl,-Bdynamic" "-lstdc++" "-lfontconfig" "-lfreetype" "-lGL" "-lSDL2" "-ljack" "-ldl" "-lgcc_s" "-lutil" "-lrt" "-lpthread" "-lm" "-ldl" "-lc" "-Wl,--eh-frame-hdr" "-Wl,-znoexecstack" "-L" "/home/vvatelot/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-o" "/tmp/cargo-installRRV1kb/release/deps/loopers-9077c86fcd36ebe8" "-Wl,--gc-sections" "-pie" "-Wl,-zrelro,-znow" "-Wl,-O1" "-nodefaultlibs"
  = note: /usr/bin/ld: cannot find -lfontconfig: No such file or directory
          /usr/bin/ld: cannot find -lfreetype: No such file or directory
          collect2: error: ld returned 1 exit status
          

error: could not compile `loopers` due to previous error
error: failed to compile `loopers v0.2.0`, intermediate artifacts can be found at `/tmp/cargo-installRRV1kb`
? sudo apt install jackd2 libjack-jackd2-dev libgl1-mesa-dev libsdl2-dev gcc

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.