Giter Site home page Giter Site logo

igorski / efflux-tracker Goto Github PK

View Code? Open in Web Editor NEW
185.0 12.0 20.0 4.15 MB

Browser based music making application driving synthesizers, samplers and effects using both a tracker and piano roll/loop based interface. Supports MIDI controllers and provides both local and cloud based project storage.

Home Page: https://www.igorski.nl/application/efflux

License: MIT License

JavaScript 0.20% HTML 0.08% Vue 30.46% SCSS 1.33% TypeScript 67.94%
music-maker audio-applications audio-engine daw webaudio webmidi web-midi web-audio vue vuejs

efflux-tracker's Introduction

Hello kind visitor 👋

In my GitHub repositories, you can find most of my personal projects, be it audio plugins, web based applications or libraries of any kind (for various languages/platforms). All of it for you to see and to get your grubby hands on. All code is production ready without hidden secrets and comes with (varying degrees of) documentation and test coverage. Consult the README of each repo in case you have questions, bug reports or requests. Likewise, if you see something horribly wrong, inefficient or containing a crude oversight, feel free to contribute!

If you don't feel like tinkering with code, you can just go to my website and run the web applications directly from your browser, or download the audio plugins there.

If you like what I'm doing and would like to show your appreciation, you can always:

"Buy Me A Coffee"

Though it's up to you to do so, everything that I do/make will remain both free to use and fully open source.

What I’m currently working on:

  • a "swarm of howling voices"-synthesizer
  • my next record (you can always stream my music on the platform of your choice)
  • a browser based RTS game (nothing world shocking, just to amuse myself)

efflux-tracker's People

Contributors

igorski avatar teteros avatar

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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

efflux-tracker's Issues

Store songs individually in LocalStorage

Currently all songs are serialized in one massive (compressed) Object into local storage. While this works nicely, it does takes it toll on large song libraries.

Refactor this so song-module saves the list of available songs (and meta) in a unique key, and each song in its own unique key. When loading the new activeSong from the song browser, load it from storage at that moment.

This requires a migration strategy to be able to load old song lists (and split them into separately stored songs upon loading).

Remove mpg123-decoder dependency

To solve a bug in Safari 15 regarding the parsing of .mp3 files, the third party mpg123-decoded dependency was added (its loaded async in sample-loader.js on file decoder failure). Once newer Safari versions have resolved the bug, this dependency can be removed.

Releasing keys on computer keyboard does not always trigger noteOff instruction

When playing using the computer keyboard, releasing the keys on a non-NKRO keyboard does not trigger note off events.

You can recreate this by holding down a chord (say using Q, 3 and R) and then using the arrow keys (to transpose the octave). By playing the exact notes again (transposing the octave back first), releasing of those notes will stop sounding the existing notes.

Octaves don't shift for upper set of computer keys

Computer keys in the Q row and number row are stuck on C-4 regardless of the octave setting using [ and ]. I'd like the pitches of the upper computer keys to always be one octave higher than the pitches of the corresponding lower computer keys.

In addition, I'd like to have the notes in each set of keys continue to increase in pitch. Currently, the pitches wrap around before reaching the 8th note of the octave: if Z plays C-2, then the comma key also plays C-2.
I'd like the comma key and the Q key to both play C-3 instead. Following that pattern, the period key, the i key, and the O key would respectively play D-3, C-4, and D-4.

Store instruments individually into LocalStorage

Similar to #25, currently all instruments are serialized in one massive (compressed) Object into local storage. While this works nicely, it does takes it toll on large instrument libraries.

Refactor this so instrument-module saves the list of available instruments (and meta) in a unique key, and each instrument in its own unique key. When loading the new instrument in the instrument editor, load it from storage at that moment.

This requires a migration strategy to be able to load old instrument lists (and split them into separately stored instruments upon loading).

When help is hidden, limit max size of windows

As the right hand help window can be hidden in the settings menu, there is an empty space when maximizing the application on a large screen. Do not extend the application width beyond the track list width in this mode.

Make help pane collapsible

On lower resolutions it would be a tremendous help if the help pane could be collapsed so more track lanes are visible on screen.

Create mixer window

Allowing to adjust balance and level of each instrument, as well as track mute and solo buttons.

Use vue-i18n for translations and copy

Currently all text is displayed using a gigantic JSON file and a getCopy getter in the Vuex store.

Use vue-i18n to specify copy per component for more maintainable, smaller files. Additionally, using vue-i18n can make future translations easier to include.

Add pattern and step jump instructions

It can be both a creative tool (or a helpful utility when working on creating bridging sections) to create a pattern jump instruction.

Pattern jump should allow jumping/forward a whole pattern, while step jump can allow jumping forward/backward a single step.

Migrate application to use Webpack, Vue and Vuex

In order to improve collaborative effort, Efflux will be refactored to use the Vue.js framework. The design pattern adopted by Efflux is largely compatible with Vue's reactivity model (especially in conjunction with Vuex stores). Vue provides the benefit of having great documentation, an active user base as well as a great template engine with two way data binding.

Additionally, the use of Webpack allows us to enjoy nice development benefits such as hot reloading.

Can't get WebMIDI to work on Linux

chrome://version
Chromium | 67.0.3396.99 (Official Build) Arch Linux (64-bit)

efflux sucessfully connects to MIDI API and detects my midi keyboard:
ss

However no midi events seem to get captured for the pattern editor with record mode on.

DevTools console:

Uncaught TypeError: Cannot read property 'addEventListener' of undefined
    at Object.addMessageListener (zMIDI.js:268)
    at addMIDIListener (MidiController.js:94)
    at handleBroadcast (MidiController.js:71)
    at callSubscriberWithDelayedExceptions (pubsub.js:59)
    at deliverMessage (pubsub.js:80)
    at deliverNamespaced (pubsub.js:91)

zMIDI example and websid do work.

zMIDI example
found these devices:

Midi Through Port-0
QinHeng Electronics CH345 MIDI 1

now try sending MIDI messages
received on MIDI port 0: zMIDIEvent type : undefined with value coming in on channel 8
received on MIDI port 1: zMIDIEvent type : undefined with value coming in on channel 8
received on MIDI port 0: note on event value: 60 ( note is C4 @ 261.6255653005986Hz ) @ velocity 80 coming in on channel 0
received on MIDI port 1: note on event value: 60 ( note is C4 @ 261.6255653005986Hz ) @ velocity 80 coming in on channel 0
received on MIDI port 0: zMIDIEvent type : undefined with value coming in on channel 8
received on MIDI port 1: zMIDIEvent type : undefined with value coming in on channel 8
received on MIDI port 0: zMIDIEvent type : undefined with value coming in on channel 8
received on MIDI port 1: zMIDIEvent type : undefined with value coming in on channel 8
received on MIDI port 0: zMIDIEvent type : undefined with value coming in on channel 8
received on MIDI port 1: zMIDIEvent type : undefined with value coming in on channel 8
received on MIDI port 0: zMIDIEvent type : undefined with value coming in on channel 14
received on MIDI port 1: zMIDIEvent type : undefined with value coming in on channel 14
received on MIDI port 0: note on event value: 62 ( note is D4 @ 293.6647679174076Hz ) @ velocity 80 coming in on channel 0
received on MIDI port 1: note on event value: 62 ( note is D4 @ 293.6647679174076Hz ) @ velocity 80 coming in on channel 0
received on MIDI port 0: zMIDIEvent type : undefined with value coming in on channel 8
received on MIDI port 1: zMIDIEvent type : undefined with value coming in on channel 8
received on MIDI port 0: zMIDIEvent type : undefined with value coming in on channel 8
received on MIDI port 1: zMIDIEvent type : undefined with value coming in on channel 8
received on MIDI port 0: note off event value: 60 @ velocity 0 coming in on channel 0
received on MIDI port 1: note off event value: 60 @ velocity 0 coming in on channel 0
received on MIDI port 0: zMIDIEvent type : undefined with value coming in on channel 8
received on MIDI port 1: zMIDIEvent type : undefined with value coming in on channel 8
received on MIDI port 0: zMIDIEvent type : undefined with value coming in on channel 8
received on MIDI port 1: zMIDIEvent type : undefined with value coming in on channel 8
received on MIDI port 0: note off event value: 62 @ velocity 0 coming in on channel 0
received on MIDI port 1: note off event value: 62 @ velocity 0 coming in on channel 0
received on MIDI port 0: zMIDIEvent type : undefined with value coming in on channel 8
received on MIDI port 1: zMIDIEvent type : undefined with value coming in on channel 8
received on MIDI port 0: zMIDIEvent type : undefined with value coming in on channel 8
received on MIDI port 1: zMIDIEvent type : undefined with value coming in on channel 8
received on MIDI port 0: zMIDIEvent type : undefined with value coming in on channel 8
received on MIDI port 1: zMIDIEvent type : undefined with value coming in on channel 8
received on MIDI port 0: zMIDIEvent type : undefined with value coming in on channel 14
received on MIDI port 1: zMIDIEvent type : undefined with value coming in on channel 14

Replace audio-encoder dependency

Versions above 1.0.2 have an error Uncaught (in promise) ReferenceError: MPEGMode is not defined, which stems from an outdated lamejs dependency.

The Git repository for lamejs is updated, but the NPM module isn't, which is why package.json includes the "lamejs": "github:zhuker/lamejs" dependency. Also see zhuker/lamejs#89

This is less than ideal. If the lamejs-library isn't published, or audio-encoder isn't updated to use a different library, we should find a suitable replacement.

Improve CSS selector performance

A lot of the CSS is migrated from the original style sheet where no scoping was used.

As such, a lot of the the CSS performance can be improved by replacing tag or id selector with class based selectors and reducing nesting where possible.

Import/Export and Share options for patterns

Thank you for Efflux 2.0, been having a lot of fun with it, here's my feature request after using it again.

Currently the entire song is able to be saved to a file or to a link as well as the instruments (which are able to be imported/exported to a file, but not shared.)
Would it be easy to make the patterns themselves be exportable too?

The great thing about this tracker is the portability, however I've been wishing Efflux had a bit more collaboration tools to take advantage of it being a webapp.

Being able to copy/paste the pattern data into a clipboard and share them with a friend would be pretty big. You'd be able to work on a song together by working on a pattern locally simultaneously. At the moment this workflow is not really viable because Efflux requires you to work on the whole song so one person would have to wait on the patterns to be finished before being able to work on theirs.
Copy paste-able instruments would be a good addition as well.

The other use case for this is being able to reuse patterns offline (e.g importable drum loops/breaks snippets), to speed up song creation.

Instrument edits should be added to state history

Currently all operations done on the synthesizer properties aren't stored in state history, therefor they cannot be undone/redone.

Link these actions to the state module.

Question is: do we maintain a separate history for the instrument editor or do we think it is logical that upon closing the window, clicking undo/redo restores the slightest of changes made to all the sliders in the now closed modal window?

Copy pasting a pattern within the same channel ignores original event channels

When creating a selection within a channel, the behaviour is such that pasting this selection in any other channel should update the pasted event channels to match the target channel.

However, when pasting a selection within the same channel, it could be convenient to keep the original event channels intact. This is likely only a problem when assigning events to multiple channels within the same track lane.

Create single definition file for automatable parameters

Currently, automatable parameters are defined multiple times:

module-param-handler.js for direct typing inside the track list
module-param-editor.vue for the overlay window
module-router.js to apply changes during playback

Create a single definition file containing the supported parameters and read from it in both files mentioned above. Also update the Wiki when done.

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.