GithubHelp home page GithubHelp logo

ut-proj / undermidi Goto Github PK

View Code? Open in Web Editor NEW
4.0 4.0 1.0 1.33 MB

An Erlang/LFE MIDI soft real time server for live play of MIDI devices

License: BSD 2-Clause "Simplified" License

Makefile 2.91% Erlang 2.21% LFE 94.87%
erlang generative-music hacktoberfest lfe lisp-flavoured-erlang midi music

undermidi's People

Contributors

oubiwann avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar

Forkers

ioolkos

undermidi's Issues

Don't block when playing

Right now, when you play a series of notes with timings (timer:sleep) you block; it would be better to have this play in a spawned process ... that's going to take some work, though .. there's a good chance that #14 could solve this.

Add beatracker

After looking at photos of Småland this morning, I became inspired and an explicit design for this long-standing wishlist item finally solidified in the old brain pan:

Infrastructure tasks:

Features:

Note that stopping playback on the beatracker and then resuming play will cause everything to be played over again, exactly as originally entered.

This design will be the long-sought union / convergence of live play (a la Extempore, SuperCollider, Overtone) and composition (choose your DAW or music notation software) ... essentially providing a very real REPL for musical composition and live-play/playback.

Set the BPM explicitly from LFE

Tasks:

  • Figure out how to get values of 30-300 BPM from MIDI CC to VCV Rack clocks
  • Write an LFE function that maps desired BPM value to the appropriate combination of MIDI CC values (see table and screenshot below, in the comments)
  • Add API support for setting the BPM
  • Remove all code that dynamically calculates the BPM

Part of #42

`make build` error

I don't immediately see why, though. I think I have all dependencies.

➜  undermidi git:(release/0.2.x) make build
>> Building Go examples ...
make[1]: Entering directory '/home/afa/Erlang/plekto/undermidi/priv/go/src/github.com/ut-proj/midiserver'
>> Building bin/midiserver ...
# github.com/ut-proj/midiserver/internal/util
internal/util/signals.go:17:9: undefined: signal.NotifyContext
make[1]: *** [Makefile:43: bin/midiserver] Error 2
make[1]: Leaving directory '/home/afa/Erlang/plekto/undermidi/priv/go/src/github.com/ut-proj/midiserver'
make: *** [Makefile:70: build-go] Error 2

Add support for scales in keys

I.e,. transposing the MIDI conversion of the scales. This might simply entail adding another arity for um.scale:midi ...

Don't require Golang

Users shouldn't need to have Go installed in order to use the midiserver

Tasks:

  • ut-proj/midiserver#7
  • Add Go bin directory in priv
  • Add target to download correct binary
  • Update LFE code to build correct binary name
  • Update docs on how to build midiserver from source and how to run it from pre-compiled binaries
  • Testing
    • macos amd64 bin
    • macos arm bin
    • linux amd64 bin
    • linux arm bin
    • macos go src
    • linux go src

Allow users to easily provide custom scales

Right now, um:scales performs a lookup in the undertheory scales module. We should let users provide their own sequence of notes (in the form of, e.g., (1 3 |#4| 5 b7), etc.). To do things, we'll need to readjust some things and create some new functions:

  • rename midi to pitches
  • rename get to create
  • add a guard to pitches
    • if scale is an atom, convert
    • if scale is a list, don't do a lookup
  • update create to use new pitches

This need has arisen as a result of investigating implementation ideas for #16 -- chords are much more varied than scales and definitions are not consistent, so users will need to provide their own notes/forms even more there, than here with scales.

That being said, the majority of the logic will be shared between the two. So this change should take that info consideration:

  • what functionality will be shared?
  • move that out of um:scales and into um (or wherever else makes sense)
  • adjust um:scales as necessary

Support external clock-based orchestration

Part of epic:

Tasks:

  • Allow changes to time signature while running
  • Change single start/stop data to a list of starts/stops
    • update the map for tracks to remove started_at and stopped_at
    • add new key transport that's an empty list by default
    • every call to start-track and stop-track will append to the transport field, e.g., #(stop ,now))
  • #46
  • Receive start/stop messages from midiserver
  • Support callbacks based upon changes in timeclock data (e.g., sending MIDI messages, leaving room/time for message transmission -- should be delivered before the target beat, but after the beat prior to the target beat), e.g. at:
    • a given beat by absolute count
    • a given beat for a given measure
    • next beat
    • next nth beat of the next measure
    • next nth beat of the next nth measure

Add support for cycling functions indefinitely

In order to stop them at will, they'll need to be run by a controller / executor / supervision tree. Probably spawning dynamic children is all that's needed.

  • Update the supervision tree to support spawning children dynamically
  • Create a cyclic cc function for MIDI control
  • Add wrapper for stopping the cycles by killing the child process

Add batch IDs

All messages in a give batch should get the same id. This will require a change to how messages are batched.

Add VCV modular synth support

Features / Tasks

  • Investigate interop to determine if any new MIDI CC messages need to be supported
  • Experiment with existing MIDI CC support to see if any VCV Rack-specific convenience functions / macros are warranted
  • Add the ability to send realtime messages to the Go midiserver (and thus to VCV Rack)
  • ut-proj/midiserver#26
  • #41
  • #42

Resourrces

VCV is a free, open source modular synthesis framework (Eurorack emulator):

Specific support: MIDI control of the synth. See the MIDI plugins for more details:

Original issue created here:

Create new gen_servers in support of external MIDI clocks

This gen_server will be in charge of:

  • updating state according to an external clock source
  • a remote-callable API for setting and getting data related to an external clock source

Tasks:

  • Test eprc calls from LFE REPL (separate, non-undermidi node)
  • ut-proj/midiserver#26
  • Create new gen_server in undermidi/clock/ext.lfe for tracking clock ticks
    • Implement basic gen_server functions
    • add state for tracking clock counter and last-n times (timestamps for when ticks received
    • add functions for incrementing clock tick, total ticks
    • keep a queue of last N tickets and ensure that times for each tick are recorded
    • use times to calculate BPM (most recent, last-n, and for total queue size ... the last being useful for curve-fitting calculated BPM polynomial adjustment on different hardware)
  • Create new gen_server in undermidi/clock/ext/beats.lfe for song-specific features built on the clock tick gen_server's data
    • Implement basic gen_server functions
    • add ETS-based state-tracking for song name, start timestamp, time signature, stop timestamp
    • add functions for returning song name, start timestamp, time signature, current BPM (aliased to other gen_server function)
    • add functions for starting and stopping a song
    • add function for calculating current measure
  • Add new gen_servers to the supervisor

Follow-on work:

Resources:

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.