GithubHelp home page GithubHelp logo

la-jarre-a-son / midi-jar Goto Github PK

View Code? Open in Web Editor NEW
53.0 2.0 7.0 12.33 MB

MIDI Jar is a tool box for musicians, learners, streamers, that want to route MIDI message between devices, and display a piano or chords while playing, and integrate it on a video or on a Twitch stream.

Home Page: http://midi-jar.ljas.fr/

License: MIT License

TypeScript 89.47% JavaScript 2.23% SCSS 8.17% EJS 0.12%
chords midi music-theory obs-studio piano-keyboard twitch music-learning piano piano-chords midi-router

midi-jar's Introduction

MIDI Jar logo

MIDI Jar is a tool box for musicians, learners, streamers, that want to route MIDI message between devices, and display a piano or monitor chords while playing, and integrate it on a video or on a Twitch stream with OBS.

Releases

Check out the releases on Github: Releases

Unsigned App

Due to code sign certificates being a bit expensive, MIDI Jar is not signed (yet?). If you are willing to help me sign this app, financially, don't hesitate to contact me.

So to install it on Windows, Windows Defender may block it, and warn you that this could be dangerous. You can still execute it anyway.

On MacOS though, the .dmg or any downloaded unsigned file will be blocked, as if "app is damaged and can’t be opened".

You will need to unquarantine the file after you downloaded, by executing in a terminal:

xattr -dr com.apple.quarantine <Your Downloaded File Name>

Why this app ?

I needed a way to display a piano and monitor chords when i was playing, but found no solution to do it properly. So I created a previous tool called Chord Display to do it in a Web browser, but due to Windows having exclusive MIDI (only one software can use the same MIDI device at a time), I needed a new solution. Plus, OBS BrowserSource is unable to use MIDI devices, so integrating it in a Twitch stream was not possible.

MIDI Jar fixes all theses issues as a Standalone Desktop Application made with Electron.

Features

MIDI Jar includes:

  • MIDI routing between devices and internal modules
  • A Chord Display module, to display a piano and monitor chords being played
  • A Circle of Fifths highly customizatble
  • A Chord Quiz module, with different modes and settings to train
  • A HTTP/Websocket server to include modules externally (in OBS Browser source for instance)
  • Running at startup
  • Running in background (no window, only Tray icon)

Routing

MIDI Jar Routing Example

You can route MIDI between devices, or to internal and external modules of MIDI Jar, and MIDI messages will be routed when the application is running.

This can be a simple alternative to replace complex softwares like MIDI-OX if you just want to route messages from a device to another.

NOTE FOR WINDOWS USERS:

Windows Standard MIDI drivers are exclusive, only one software can be connected to a device at the same time.

If you want to use MIDI Jar with other sofwares like your DAW, or a Standalone VST, you should install loopMIDI by Tobias Erichsen.

You will be able to create multiple Virtual MIDI devices (loopbacks) and route MIDI messages to it. Plus, those virtual devices are non-exclusive, so multiple softwares can use them.

Latency

MIDI Jar may introduce latency to MIDI messages. I did my best to keep it as low as possible, in the Routing settings page you can see the latency that is introduced by your config: this is only the latency added to the existing latency, from when MIDI Jar receives a message, and forwarded it to other devices and modules.

Any other latency (due to USB, your device drivers or LoopMidi loopback) is not taken into account.

My tests had an average additional latency < 0.2ms but this can vary a lot with PC configuration, routing, and CPU Usage, and some freezes could occur.

Chord Display

MIDI Jar Chord Display example

Chord Display is a module of MIDI Jar for displaying a piano keyboard and the chords played.

It is based on tonal, but with a custom chord dictionary and a modified chord detection feature that allows omissions of intervals (depending on the dictionary).

To use it, route your MIDI devices to the internal chord-display output.

Music Notation

You can enable displaying the standard music notation in Chord Display.

It is implemented with VexFlow and supports displaying notes in any major Key.

NOTE: Key signature that would have more than 7 alterations will be changed automatically to the equivalent major key (e.g. G# will produce a key signature of Ab).

DISCLAIMER: As i am not really into reading and writing music, Chord Display notation could be wrong... If so, do not hesitate to post an issue.

Customize in Settings

Chord Display rendering is customizable in the Settings:

  • Keyboard:
    • Keyboard length: start & end note
    • Wrap: display notes outside of keyboard with a different color
    • Theme:
      • classic - a classical looking piano
      • flat - a simplified version on a single row
    • Sizes: change skin specific display sizes.
    • Colors: blacks and whites, played & sustained & wrapped notes.
    • Enabling some infos on the piano:
      • key names - name displayed on keys (none, only C, pitch class or note)
      • key info - additional info display on keys (none, tonic dot, chord intervals)
      • label- additional info display above played keys (none, pitch class, note, chord interval)
    • Fade out duration: key disappear with a delay on release
    • Sustained notes: can be disabled on display
  • Customizing elements:
    • chord - the detected chord
    • alternative chords - a list of other detected chord names if any
    • chord name - full name of the chord
    • chord notation - choose how chords are notated
      • long - maj, min, dom, dim, aug
      • short - M, m, dim, aug
      • symbol - Δ, -, °, +
    • allow omissions - detect chords with omitted intervals (like 5P, 9M and 11P)
    • use sustain - should sustained notes be used in detection (also disables display of sustained notes)
    • highlight chord alterations - display chord parts more distinctly
    • notation - the staff notation of the played notes
    • piano - a keyboard displaying your played notes
    • intervals - a list of intervals that constitutes the chord

Customize via CSS

OBS Browser Source let you inject any CSS in the page, so you can add any style to existing layout, like:

Disable Background image:

body { background: none !important; color: white; }

Remove detected Chord:

#chord {
  display: none;
}

Remove Bass Note / Slash chord notation:

.chord-root {
  display: none;
}

Remove played Notes:

#notes {
  display: none;
}

Remove piano keyboard:

#keyboard {
  display: none;
}

Change display order:

#keyboard {
  order: 1;
}
#container {
  order: 2;
}
#notes {
  order: 3;
}
#intervals {
  order: 4;
}

Change Text Color:

body {
  color: #fff;
  background: transparent;
}

Change chord size and placement:

#chordDisplay {
  align-items: flex-end;
  justify-content: flex-end;
  padding: 2vh;
  flex-direction: column-reverse;
}

#container {
  align-items: flex-start;
  justify-content: space-between;
}

#chord {
  flex-grow: 0;
  font-size: 10vh;
}

#notes {
  display: none;
}

#alternativeChords {
  display: none;
}

#intervals {
  font-size: 2vh;
}

#notation {
  color: black;
  width: 300px;
  height: 300px;
  background: rgba(255, 255, 255, 0.3);
  border-radius: 32px;
  margin-top: 16px;
}

Chord Dictionary

MIDI Jar Chord Dictionary Example

Chord Dictionary is a module of MIDI Jar for browsing the all the chords available in the software, that is a customized diectionary from tonal.

You can access it from the home view of MIDI Jar, or by clicking a chord name in a chord-display module.

It also allows you to customize how the chords are displayed in all other modules that are using the preferred chord notation:

  • You can choose what chord alias to be displayed (instead of only the long, short or symbol flavours)
  • You can disable a chord type from being detected by the chord-display modules.

This module can also be interactive, so you need to route your MIDI devices to the chord-dictionary output to let the dictionary work in two possible modes:

  • DETECT: browse the detected chord page automatically when playing. Notes that are not part the detected chord will be displayed in red, and correct intervals in green.
  • PLAY: disable automatic browsing, but still display correct and incorrect intervals towards the current displayed chord.

Circle of Fifths

MIDI Jar Circle of Fifths Example

The Circle of Fifths is a music theory tool to help understanding and writing music.

This modules let you choose easily the Key signature you are playing in, and displaying notes.

It will react (in green), at your choosing:

  • on Chords: the circle sector that corresponds the most to the currently played chord will be highlighted
  • on Notes: all sectors that represent the played notes will be highlighted

You can customize its rendering by adding/removing sections of the wheel:

  • Display Major: displays the circle of major fifths
  • Display Minor: displays the circle of minor fifths
  • Display Diminished: displays the circle of diminished fifths
  • Main Scale: choose which of Major or Minor is displayed first in the circle
  • Display Dominant Chords: Adds a section containing for each key, the corresponding dominant chords (and substitutions) - V7, bVII7, bII7 and III7
  • Display Suspended Chords: adds sectors around each minor and major key that are suspended. Their position corresponds to their inversion in the adjacent fifths (e.g.: Csus2 can be inverted as a Gsus4 so it is placed between C and G).
  • Display Alterations: displays the number of ♭ or ♯ of the coresponding key signature
  • Display Modes: displays the enharmonic modes above the corresponding keys (e.g. when in C ionian, the next fifth enharmonic mode is G mixolydian)
  • Display Degree: adds labels for each fifth with its degree and its name
  • Display Degree Label: adds degree inside the key sectors. Left is major degree, right is minor degree.
  • Highlight Sectors in the key: shows in blue the sectors in the currently selected key scale

NOTE: The Circle of Fifths is usually for displaying notes, not chords. But i found that it was also suited for chords, and particularly visualizing resolutions between degrees. Any chord in a same angular part of the circle will tend to resolve to the first degree in the scale. This module is more a personal vision than a standard representation. Don't hesitate to disable the sections you don't need.

HTTP/WS Server - Overlay

It enables integrating modules in an external web browser, or in an OBS Browser Source. For instance, you can integrate MIDI Jar in your Twitch stream, or load it on a different computer or phone for displaying chords while jamming, and even use it as a Desktop Wallpaper using Lively Wallpaper.

All MIDI Jar module can be accessed externally, and you can create as many chord-display modules as you want if, for instance, you want multiple keyboards, or customize their arrangement in OBS.

Currently, updating settings externally is not supported, but this is planned.

Music Notation

Music Notation can be displayed in the Chord Display module and changed through the Circle of Fifths.

You can customize it in the settings, and this will affect all modules (including the overlay)::

  • Key Signature: the key signature to display notes in, and for choosing the key in staff notation.
  • Accidentals (when in C Key): displays flats ♭ or sharps
  • Staff Clef: the Clef to display in staff notation
  • Staff Transpose (in semitones): transcribes notes for transposing instruments

Chord Quiz

MIDI Jar Chord Quiz Example

You can train piano by using the Chord Quiz module.

Each round of a game you will be prompted a chord that you must play, and will also see the next chord to play (to anticipate your finger movements).

Your answer will be committed when you release all the keys, and can result to different score for the round:

  • different: You did not play the right chord - you will lose points
  • subset: You played some intervals of the chord - you will not gain all the points
  • exact: you played the chord that was asked
  • superset: you played additional interval that were not asked (and it is considered as a bonus)

Any addition, repetition, or inversions of a chord will grant you additional points.

You can choose which mode (algorithm) to play with:

  • random: All chords will be picked randomly, in a random key signature
  • random in key: All chords will be picked from the current key signature (in Notation settings), in the major scale + additions (melodic and harmonic alterations).

And finally, to adapt your training, you can choose the difficulty, each levels adds new chords to the possible list:

  • Very Easy: maj, min
  • Easy: maj7, majadd2, majadd4, maj6, min7, min6, minadd9, minadd4, minmaj7, dom7, sus4, sus2
  • Medium: maj9, maj11, maj13, majaddb2, majadd#4, majaddb6, maj6/9, maj6add11, maj6/11, maj7add11, maj7add13, majb5, majb9, min9, min11, min13, minaddb2, min6/9, min7add11, minaddb6, min#5, minb9, minmaj9, minmaj11, minmaj13, minmaj7b9, minmaj7add11, dim, dim7, dom9, dom11, dom13, dom7add6, dom7add11, dom7b9, sus2sus4, sus2maj7, sus4maj7, dom7sus2, dom7sus4, dom9sus4, aug
  • Hard: maj6#11, maj7add#11, maj7addb13, maj7b5, maj#9, maj#11, maj11b9, minaddb6addb9, min7#5, minb11, min#11, min7#11, min11b13, minmaj7#5, minmaj7addb13, minmaj7b11, minmaj7#11, dimmaj7, dim7maj7, min7b5, dom7b5, dom7add#11, dom7addb13, dom7#9, dom11b9, dom13b9, sus2maj11, sus2maj7add13, sus4maj13, dom7sus4b9, dom13sus4, aug7, augmaj7, augaddb9, augadd9
  • Very Hard: maj6/9add#11, maj9b5, maj9#9, majb9#9, maj#11b9, maj11#9, maj13#11, min9#5, min11#5, min13#5, min11b11, minmaj9addb13, minmaj11addb13, minmaj9#11, minmaj11b11, min9b5, min7b5b9, min11b5, dom9b5, dom11b5, dom13b5, dom9#11, dom9addb13, dom7b9#9, dom7b9#11, dom7b9b13, dom11b13, dom13#9, dom13#11, dom11susb2, dom7sus4addb13, aug9, aug11, aug13, augmaj9, augadd#9, augmaj7b9, aug7b9, augsus4add7
  • All Chords: the rest of the dictionary

If the game mode is too annoying, you can turn off the scoring, the reactions, and choose to display or not the asked intervals, but have in mind that the gamification is only for fun, there is no persistent scoreboard or high score, it's only a tool to help exploration.

Hopefully in the future, this module will be able to have an "Intelligent" mode capable of generating random chord progressions with key changes.

Midi-Jar-Quiz.In-Key-Mode.mp4

What then ?

Build

This project is built with Electron & Webpack:

npm install

npm run start
 -or-
npm run package

Planned features / Ideas

  • Simple Routing (v1)
  • Chord Display (v1)
  • HTTP/WS overlay for OBS (v1)
  • Display Standard notation
  • Circle of Fifths
  • Chords Quiz
  • Chord Dictionary
  • Tonnetz chart
  • More Keyboard themes
  • Virtual Keyboard (use pc keyboard as a MIDI device)
  • Visualizations / Vertical scrolling notes
  • Soundboard
  • MIDI recording (playback/backup)
  • Chromesthesia
  • Advanced Routing (split keyboard, filter, velocity/value remapping)
  • Update settings externally (HTTP/WS)

Contribute / Bugs

This project is fully open to contribution and it would be appreciated to have some feedbacks and new ideas. Please feel free to open an issue or open a Merge request.

For any UI or UX bug, please Open an issue.

If you discover unexpected Chord detection, please see tonaljs/tonal issues and contribute to make it work perfectly.

Credits

  • tonal: A functional music theory library for Javascript, that detects chords, and handles MIDI notes
  • VexFlow: A JavaScript library for rendering music notation and guitar tablature.
  • node-midi / @julusian/midi: A node.js wrapper for the RtMidi C++ library that provides realtime MIDI I/O.
  • React Flow: Highly customizable library for building interactive node-based UIs, editors, flow charts and diagrams. It allows MIDI Jar to have understandable MIDI routing with nodes and draggable edges.
  • React Electron Boilerplate: A Foundation for Scalable Cross-Platform Apps in Electron, the base boilerplate for MIDI Jar.

midi-jar's People

Contributors

artistix 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

Watchers

 avatar  avatar

midi-jar's Issues

MIDI Signals when triggered don't stop triggering when letting go of a key.

OS: Windows
MIDI Controller: Novation Launchkey MK3 MINI (usb)

When my controller is connected to the chord monitor/display, it picks up incoming MIDI signals whenever I press a key correctly. However, it does not stop registering the key being pressed whenever I let go of the key. There is no sustain that should be whenever the key is being pressed. Whenever this happens, I can't get the chord monitor to clear and stop perceiving the keys as being pressed down unless I exit to the settings page and then click back to the display.
The debug text file shows that MIDI Jar keeps picking up some type of "undefined" signal constantly from the keyboad (even when inactive). And whenever I pressed a C, E, and G to make a chord a couple times it will emit an "on" for its signal but never an "off".
debug.txt

Staff customization for MIDI guitar

Hi, Rémi, congratulations for your great work! Everything is working fine here, WIndows 10. I teach both keyboard and guitar (online lessons and video recordings using OBS), and your software is a great solution for displaying the notes on the staff in real-time. I use Roland-A88 keyboard controller and Roland GI-20 as guitar MIDI interface. The problem is that guitar notation uses a single staff with treble clef, and the notes sound one octave lower than written. Can this feature be implemented, so you can switch between the keyboard grand staff and guitar treble clef single staff? It would be nice if the lower ledger lines could go as low as low D, for when you have to drop the low E 6th string down to D. Also, guitar notation demands a considerable amount of upper ledger lines. Thank you very much!

Add easier key selection

Switching keys is inconvenient. I only use the mouse when i'm at my piano

I was thinking..a way to improve upon this, perhaps a dropdown embedded on the chord display that shows and lets you edit the current key

But I think what would be even better is, adding the circle of 5ths on the chord display, then clicking it will switch to that key. Also be very great for teaching/showing/learning

Chord display should understand no 5th chords

It seems that midi jarr gets confused when you drop the 5th from extended chords

Take an Emaj7 for instance, root position. E, G#, B and D#...

You can see it understand this chord. However, if you remove the 5th(leave out the B) as jazz often does... It gets confused and won't show it as any chord...

But, to my eyes I can see this and understand it's just an Emaj7 without a 5th. What's weird is I've seen it before say "no5" for a chord... So it does kinda understand this concept in some contexts...

Give setting for font size of key note labels

My primary workflow with this app is having the web interface connected through my tablet. However, the main UI elements that have difficulty are the ones on the piano keys themselves. The ones above the notes that show the name and the ones inside the notes that show the degree. As well as the labels at the bottom of the keys

To me, the most important one is the note names on the top of the keyboard... All in all, these labels are really small even on my A4 sized tablet screen, like text for ants...

To be honest, they're even super small on my desktop monitor. Especially relative to the other UI elements

If you find ways to address these issues this would be huge for me, it's really the biggest complaint I run into these days. Other than that, this thing is serving me so well, I love it. It's really been helping my piano learning journey tremendously

Extend a key selector up to 7 sharps / 7 flats

Music notation may contain up to 7 flats or up to 7 sharps. Some keys have exactly the same notes as others (enharmonical keys), but anyway, it would be nice to have them separately. Right now it's up to 6 sharps and 5 flats.

Default startup mode and remembering last state

Every time after startup I have to select mode (Chord Display (internal) in my case) and pin "always on top" button. It's not convenient. Asking for ability to define startup mode or maybe "remember last state" with remembering on exit operating mode and pin state.

Native support for PipeWire or alternatively Jack

Hello!

I just discovered your project after screen-sharing a virtual keyboard application during my online music lesson.

I already was already using OBS to bring everything together and I think that MIDI Jar overlay with an OBS Browser Source will be a much more elegant solution going forward.

The application has a built-in MIDI router. This is useful on operating systems like Windows where the MIDI routing capabilities are limited or non-existent by default.

On Linux, with PipeWire or Jack (with some tweaking), this sort of internal routing implemented by applications becomes redundant because there already is a node-based virtual patchbay where MIDI inputs/outputs can be routed to one or many outputs/inputs.

The few graphical applications that exist to manage the virtual page look very similar to the routing page of MIDI Jar.

Each application that is aware of this PipeWire/Jack would register itself as a node, with all the necessary ports.

In the case of MIDI Jar, the application would register itself as a node with three MIDI ports, one for the chord-display in the app, one for the debugger and another for the overlay chord-display.

Routing would be handled outside of the application with whatever tool the user is already using for routing their other MIDI/audio devices/programs between each other.

By disabling the internal router and relying on the audio server MIDI Jar could better integrate with the underlying system.

Is there any interest in this?

Fail to build on Linux (ArchLinux)

Expected Behavior

  • MIDI Jar version:v1.0.0
  • Operating System: Linux (Archlinux)
  • Hardware Devices: n/a

i ran npm install and got this failure on linux, run as my user. interestingly, your previous project builds fine and i can use npm start with it


[email protected] postinstall
npm run licenses && ts-node .erb/scripts/check-native-dep.js && electron-builder install-app-deps && cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.renderer.dev.dll.ts

[email protected] licenses
ts-node ./.erb/scripts/licenses.js

• electron-builder version=23.0.3
• loaded configuration file=package.json ("build" field)
• installing production dependencies platform=linux arch=x64 appDir=/home/sreich/Downloads/midi-jar-main/release/app
⨯ /usr/bin/node process failed ERR_ELECTRON_BUILDER_CANNOT_EXECUTE
Exit code:
1
Error output:
npm WARN config production Use --omit=dev instead.
npm ERR! code 1
npm ERR! path /home/sreich/Downloads/midi-jar-main/release/app/node_modules/midi
npm ERR! command failed
npm ERR! command sh /tmp/install-03c68391.sh
npm ERR! gyp info it worked if it ends with ok
npm ERR! gyp info using [email protected]
npm ERR! gyp info using [email protected] | linux | x64
npm ERR! gyp info find Python using Python version 3.10.5 found at "/usr/bin/python3"
npm ERR! gyp http GET https://electronjs.org/headers/v16.2.1/node-v16.2.1-headers.tar.gz
npm ERR! gyp http 200 https://artifacts.electronjs.org/headers/dist/v16.2.1/node-v16.2.1-headers.tar.gz
npm ERR! gyp http GET https://electronjs.org/headers/v16.2.1/SHASUMS256.txt
npm ERR! gyp http 200 https://artifacts.electronjs.org/headers/dist/v16.2.1/SHASUMS256.txt
npm ERR! gyp info spawn /usr/bin/python3
npm ERR! gyp info spawn args [
npm ERR! gyp info spawn args '/home/sreich/Downloads/midi-jar-main/node_modules/node-gyp/gyp/gyp_main.py',
npm ERR! gyp info spawn args 'binding.gyp',
npm ERR! gyp info spawn args '-f',
npm ERR! gyp info spawn args 'make',
npm ERR! gyp info spawn args '-I',
npm ERR! gyp info spawn args '/home/sreich/Downloads/midi-jar-main/release/app/node_modules/midi/build/config.gypi',
npm ERR! gyp info spawn args '-I',
npm ERR! gyp info spawn args '/home/sreich/Downloads/midi-jar-main/node_modules/node-gyp/addon.gypi',
npm ERR! gyp info spawn args '-I',
npm ERR! gyp info spawn args '/home/sreich/.electron-gyp/16.2.1/include/node/common.gypi',
npm ERR! gyp info spawn args '-Dlibrary=shared_library',
npm ERR! gyp info spawn args '-Dvisibility=default',
npm ERR! gyp info spawn args '-Dnode_root_dir=/home/sreich/.electron-gyp/16.2.1',
npm ERR! gyp info spawn args '-Dnode_gyp_dir=/home/sreich/Downloads/midi-jar-main/node_modules/node-gyp',
npm ERR! gyp info spawn args '-Dnode_lib_file=/home/sreich/.electron-gyp/16.2.1/<(target_arch)/node.lib',
npm ERR! gyp info spawn args '-Dmodule_root_dir=/home/sreich/Downloads/midi-jar-main/release/app/node_modules/midi',
npm ERR! gyp info spawn args '-Dnode_engine=v8',
npm ERR! gyp info spawn args '--depth=.',
npm ERR! gyp info spawn args '--no-parallel',
npm ERR! gyp info spawn args '--generator-output',
npm ERR! gyp info spawn args 'build',
npm ERR! gyp info spawn args '-Goutput_dir=.'
npm ERR! gyp info spawn args ]
npm ERR! gyp: name 'openssl_fips' is not defined while evaluating condition 'openssl_fips != ""' in binding.gyp while trying to load binding.gyp
npm ERR! gyp ERR! configure error
npm ERR! gyp ERR! stack Error: gyp failed with exit code: 1
npm ERR! gyp ERR! stack at ChildProcess.onCpExit (/home/sreich/Downloads/midi-jar-main/node_modules/node-gyp/lib/configure.js:259:16)
npm ERR! gyp ERR! stack at ChildProcess.emit (node:events:513:28)
npm ERR! gyp ERR! stack at ChildProcess._handle.onexit (node:internal/child_process:291:12)
npm ERR! gyp ERR! System Linux 5.18.12-arch1-1
npm ERR! gyp ERR! command "/usr/bin/node" "/home/sreich/Downloads/midi-jar-main/node_modules/.bin/node-gyp" "rebuild"
npm ERR! gyp ERR! cwd /home/sreich/Downloads/midi-jar-main/release/app/node_modules/midi
npm ERR! gyp ERR! node -v v18.6.0
npm ERR! gyp ERR! node-gyp -v v8.4.1
npm ERR! gyp ERR! not ok

npm ERR! A complete log of this run can be found in:
npm ERR! /home/sreich/.npm/_logs/2022-08-05T02_19_37_707Z-debug-0.log
failedTask=installAppDeps stackTrace=Error: /usr/bin/node process failed ERR_ELECTRON_BUILDER_CANNOT_EXECUTE
Exit code:
1
Error output:
npm WARN config production Use --omit=dev instead.
npm ERR! code 1
npm ERR! path /home/sreich/Downloads/midi-jar-main/release/app/node_modules/midi
npm ERR! command failed
npm ERR! command sh /tmp/install-03c68391.sh
npm ERR! gyp info it worked if it ends with ok
npm ERR! gyp info using [email protected]
npm ERR! gyp info using [email protected] | linux | x64
npm ERR! gyp info find Python using Python version 3.10.5 found at "/usr/bin/python3"
npm ERR! gyp http GET https://electronjs.org/headers/v16.2.1/node-v16.2.1-headers.tar.gz
npm ERR! gyp http 200 https://artifacts.electronjs.org/headers/dist/v16.2.1/node-v16.2.1-headers.tar.gz
npm ERR! gyp http GET https://electronjs.org/headers/v16.2.1/SHASUMS256.txt
npm ERR! gyp http 200 https://artifacts.electronjs.org/headers/dist/v16.2.1/SHASUMS256.txt
npm ERR! gyp info spawn /usr/bin/python3
npm ERR! gyp info spawn args [
npm ERR! gyp info spawn args '/home/sreich/Downloads/midi-jar-main/node_modules/node-gyp/gyp/gyp_main.py',
npm ERR! gyp info spawn args 'binding.gyp',
npm ERR! gyp info spawn args '-f',
npm ERR! gyp info spawn args 'make',
npm ERR! gyp info spawn args '-I',
npm ERR! gyp info spawn args '/home/sreich/Downloads/midi-jar-main/release/app/node_modules/midi/build/config.gypi',
npm ERR! gyp info spawn args '-I',
npm ERR! gyp info spawn args '/home/sreich/Downloads/midi-jar-main/node_modules/node-gyp/addon.gypi',
npm ERR! gyp info spawn args '-I',
npm ERR! gyp info spawn args '/home/sreich/.electron-gyp/16.2.1/include/node/common.gypi',
npm ERR! gyp info spawn args '-Dlibrary=shared_library',
npm ERR! gyp info spawn args '-Dvisibility=default',
npm ERR! gyp info spawn args '-Dnode_root_dir=/home/sreich/.electron-gyp/16.2.1',
npm ERR! gyp info spawn args '-Dnode_gyp_dir=/home/sreich/Downloads/midi-jar-main/node_modules/node-gyp',
npm ERR! gyp info spawn args '-Dnode_lib_file=/home/sreich/.electron-gyp/16.2.1/<(target_arch)/node.lib',
npm ERR! gyp info spawn args '-Dmodule_root_dir=/home/sreich/Downloads/midi-jar-main/release/app/node_modules/midi',
npm ERR! gyp info spawn args '-Dnode_engine=v8',
npm ERR! gyp info spawn args '--depth=.',
npm ERR! gyp info spawn args '--no-parallel',
npm ERR! gyp info spawn args '--generator-output',
npm ERR! gyp info spawn args 'build',
npm ERR! gyp info spawn args '-Goutput_dir=.'
npm ERR! gyp info spawn args ]
npm ERR! gyp: name 'openssl_fips' is not defined while evaluating condition 'openssl_fips != ""' in binding.gyp while trying to load binding.gyp
npm ERR! gyp ERR! configure error
npm ERR! gyp ERR! stack Error: gyp failed with exit code: 1
npm ERR! gyp ERR! stack at ChildProcess.onCpExit (/home/sreich/Downloads/midi-jar-main/node_modules/node-gyp/lib/configure.js:259:16)
npm ERR! gyp ERR! stack at ChildProcess.emit (node:events:513:28)
npm ERR! gyp ERR! stack at ChildProcess._handle.onexit (node:internal/child_process:291:12)
npm ERR! gyp ERR! System Linux 5.18.12-arch1-1
npm ERR! gyp ERR! command "/usr/bin/node" "/home/sreich/Downloads/midi-jar-main/node_modules/.bin/node-gyp" "rebuild"
npm ERR! gyp ERR! cwd /home/sreich/Downloads/midi-jar-main/release/app/node_modules/midi
npm ERR! gyp ERR! node -v v18.6.0
npm ERR! gyp ERR! node-gyp -v v8.4.1
npm ERR! gyp ERR! not ok
npm ERR! A complete log of this run can be found in:
npm ERR! /home/sreich/.npm/_logs/2022-08-05T02_19_37_707Z-debug-0.log
at ChildProcess. (/home/sreich/Downloads/midi-jar-main/node_modules/builder-util/src/util.ts:250:14)
at Object.onceWrapper (node:events:628:26)
at ChildProcess.emit (node:events:513:28)
at maybeClose (node:internal/child_process:1091:16)
at Socket. (node:internal/child_process:449:11)
at Socket.emit (node:events:513:28)
at Pipe. (node:net:757:14)
npm ERR! code 1
npm ERR! path /home/sreich/Downloads/midi-jar-main
npm ERR! command failed
npm ERR! command sh /tmp/postinstall-c756e17a.sh

npm ERR! A complete log of this run can be found in:
npm ERR! /home/sreich/.npm/_logs/2022-08-05T02_19_09_993Z-debug-0.log

feature - show the history of previous chords

I'm thinking this could be useful especially for improvising and learning.. But I would like to hear other thoughts on it, too.

I'd like it to store and show a little bit of history of the chords\notes that were previously played, especially helping to look back and see how to move between the chords

What do you think?

Wrong G/Em key info in menu of Circle of Fifths

Expected Behavior

Em/G keys have one #

Current Behavior

This menu in Circle of Fifths shows 5#

5#

Steps to Reproduce

Just select menu in Circle of Fifths.

Suggested Solution (if any)

Correct the typo :)

Your Environment

  • MIDI Jar version: 1.7.0
  • Operating System: Windows 10
  • Hardware Devices: USB MIDI Keyboard

Recognize invertions and display more common chords first

Issue has been forwarded to author of tonal library, but may be useful here for tuning display algorithm when several variants available.

Expected Behavior

E-A-C triad is expected to be displayed as Am/E

Current Behavior

E-A-C chord recognizing as C6/E without alternatives

am-inversion

Yes, it could be C6 with omitted V, but primary display should be basic minor triad.

Soon I found than midi-jar do not recognize inversions (as in Am/E case) or treat them as very uncommon chords for main display. For example when playing simple D major chord inversion from A (A-D-F#) midi-jar displays as main choice a very uncommon Gb6addb6/A chord and then small display of DM/A that is definitely more relevant in most cases.

d-inversion

Steps to Reproduce

  1. Play almost any triad inversion

Suggested Solution (if any)

Tune algorithm of chords recognition to recognize inversions and display most relevant (simplest, most common) variants first.

Your Environment

  • MIDI Jar version: 1.5.0 (2023-11-07)
  • Operating System: Windows 10 64-bit
  • Hardware Devices: USB MIDI Keyboard

Rootless voicing quiz?

Hi, great work on this! I'd love it if there was a way to support a quiz for rootless voicings common in jazz, and would be happy to try to help implement. Change would be to recognize the four expected intervals but not expect the root, during the quiz. Taking a quick look it seems like the "complexity" is used to filter chord types for the quiz, so adding a new type of quiz with a different subset of chord types might be more complicated than just adding a new list of intervals -- curious to know if you have considered this and have any advice for potential implementation.

Change might look something like this, in terms of the chord data, with the parentheses indicating that the root is implied. This seems like it would be reasonably straightforward to implement for the quiz but of course would not work for the chord recognition mode.

// '' Rootless Major 7th chords
['(1P) 3M 5P* 7M 9M', 'rootless major seventh added eleventh', 'maj7 M7 Δ7'],

// '' Rootless Minor 7th chords
['(1P) 3m 5P* 7m 9M', 'rootless major seventh added eleventh', 'maj7 M7 Δ7'],

// '' Rootless Dominant 7th chords
['(1P) 3M 5P* 7m 9M', 'rootless major seventh added eleventh', 'maj7 M7 Δ7'],

Support flatpak

Flatpak seems to be the best and most popular Linux package mechanism, with availability on flathub and such, package managers like those on KDE and thus the steam deck, support flatpak too.

Confusions with inversions

Expected Behavior

Simplest chords (triads, 7-th) inversions expected to be displayed as main chord (highest priority). Like midi-jar now displays Am/E chord:

ame-inversion

Current Behavior

Here is display for A/E (first) inversion

ae-inversion

Expected "A/E" display as main variant.

Here is display for C/E (second) inversion:

ce-inversion

Expected "C/E" display as main variant.

At least because both chords definitely sounds as pure major and are used in diatonic scales as A and C respectively.

Second inversion of minor chords displayed as 6 chord with omitted V but retains pure minor sound.

amc-inversion

Sometimes first inversion shows as expected but second (as far as I can see) never.

Role of inversions for 7-chord (except dominant-seventh) and more complex chords is not so clear topic (honestly it's a big mess) because of significant sound changes after inversions. But triads and dominant-7 inversions retain distinctive sound and thus their roles in diatonic scales they're used. So prioritizing of basic chords inversions have solid practical and functional background.

Steps to Reproduce

  1. Just play inversions of any major or minor triad

Suggested Solution (if any)

Globally prioritize basic triads inversions over their exotic relatives. Prioritizing of dominant-7 inversions also have a sense.

Your Environment

  • MIDI Jar version: 1.6.1
  • Operating System: Windows 10
  • Hardware Devices: USB MIDI Keyboard

Malfunction with keyboards that send 'Note On' with 0 velocity instead of 'Note Off'

Expected Behavior

The notes should go off when releasing the keys.

Current Behavior

The notes show up doubled upon releasing and stay on forever, because the midi message is always Note On.

Capture

Debug log:
[58496.5730] Axiom 61 MIDI In: channel 1 - 144:Note On - note 48 - 57
[58667.0615] Axiom 61 MIDI In: channel 1 - 144:Note On - note 48 - 0
[60075.9404] Axiom 61 MIDI In: channel 1 - 144:Note On - note 50 - 57
[60208.6306] Axiom 61 MIDI In: channel 1 - 144:Note On - note 50 - 0
[60919.7518] Axiom 61 MIDI In: channel 1 - 144:Note On - note 52 - 82
[61023.0185] Axiom 61 MIDI In: channel 1 - 144:Note On - note 52 - 0
[64152.0226] Axiom 61 MIDI In: channel 1 - 144:Note On - note 53 - 52
[64264.1501] Axiom 61 MIDI In: channel 1 - 144:Note On - note 53 - 0

Suggested Solution (if any)

The midi message Note On (0x90) should only be considered to be a note on trigger when its velocity is not 0. Also an 0x90 message with 0 velocity should be equivalent to Note Off (0x80).

Unfortunately this setting cannot be changed in my midi keyboard itself.

Your Environment

  • MIDI Jar version: v1.2.0
  • Operating System: Windows 10 Version 10.0.16299 Build 16299
  • Hardware Devices: M-Audio Axiom 61 Mk2 through USB, Creative Audigy RX (with native ASIO driver)

Start minimized option seems doesn't work

Expected Behavior

Expect midi-jar to be minimized when launching at startup

midi-jar-start-minimized

Current Behavior

Every system restart I see midi-jar window like above screenshot.

Steps to Reproduce

  1. Restart system

Your Environment

  • MIDI Jar version: 1.6.1
  • Operating System: Windows 10 Pro

Ability to copy chord

Hello!

I think that it would be useful to be able copy to the clipboard the current chord (or the last one, in case that no chord is currently playing) in the "Chord Display" view if we right click it, as a shortcut.
Also, it could be extended to the "Chord Dictionary" view and to the individual notes that were forming that chord.

For example, for a D, F# and B chord, we could be able to copy or "D6" or "Bm/D" depending what chord was right clicked and "D F# B" if, for example, we right click on the keyboard or in one of the notes.
I have attached a screenshot of the "zones" that I'm referring to.
2024-03-02_19-32

Chord Display keyboard range

Hello and thanks for Midi Jar!

It would be very practical IMO to have a chord/melody split point. (i.e. A4)

This way I can display my entire keyboard range (i.e. C2 thru C6) but notes above (i.e.) A4 are NOT included in the chord calculation. Additionally, I would like to highlight the melody notes with a different color (ignored by the chord calculation, and played with right hand).

[Feature] Allow switching Key from web interface

I've really loved the web interface feature...I have the app hooked up to my computer and then i have my tablet show the chord interface while I practice in piano marvel and other spots.

This works super well and it wasn't even a feature I knew i wanted. but, i'd love to be able to switch certain settings from the server interface. Like what key it is in

Suggestions for improving "Chord Display" GUI in MIDI-Jar

Hi Remi,

I'm loving Midi-jar. This is a very useful application. I love the fact that is has a server attached to it. It displays lots of useful information that has made me reach for it time and time again. I'm not a developer, but I am a teaching musician and I would like to offer a few suggestions to improving the Chord Display.

  1. I would love to be able to rearrange the GUI elements in the Chord display. I haven't figured out a way of doing this. I love to be able to move the Staff exactly where I want it as well as all the other elements that show up on screen.

  2. Provide an option for removing the background. So it could truly be used as an overlay in OBS. It also haven't figured out a way of doing this. I assumed the Chord Display overlay would remove the background but haven't been able to figure it out. Please provide guidance if this is possible.

  3. I see two options for keyboard skin "classic" and "flat". Is it possible to create additional skins? I'm currently using the classic. I like it, but the dimensions are not quite right for my use case. I'd be willing to create one if it's possible.

  4. This is the first application I've come across that displays "Chord degrees". I love this feature!. I'd love the option to move the "chord degrees", and "key names above the keys and display it for the keys that are actively being played not everywhere on the piano. Also give the option of turning off keyboard display for sustained notes. Sustained notes are currently displayed grayed out.

As I stated already, I love the application. I use it for my in-person students. and the interface works very for that use case. I would love to use it for my virtual students as well. I also want to thank you and everyone who contributed to making MIDI-Jar happen. It has been a useful tool for me.

After some time, ALSA fails with cannot allocate memory

I'm currently tracing a system crash periodically that...as I dig more into this, I am becoming more suspect it is this app/node-midi, in particular

I'm currently connecting my raspberry pi as a client to this desktop machine's server of rtpmidid. It could very well be rtpmidid, but more digging on the error pointed me towards this issue below

Log issue I receive is:


Aug 24 20:57:42 sreich-archlinux-desktop rtpmidid[674]: [rtppeer.cpp:351] Send CK0 to raspberrypi
Aug 24 20:57:42 sreich-archlinux-desktop rtpmidid[674]: [rtppeer.cpp:292] Latency raspberrypi: 65.60 ms (client / 2)
Aug 24 20:57:42 sreich-archlinux-desktop rtpmidid[674]: [rtppeer.cpp:300] Latency raspberrypi/rtpmidi raspberrypi-sreich-archlinux-desktop: 3.50 ms (server / 3)
Aug 24 20:57:42 sreich-archlinux-desktop rtpmidid[674]: [mdns_rtpmidi.cpp:297] (Browser) REMOVE: service 'raspberrypi' of type '_apple-midi._udp' in domain 'local'
Aug 24 20:57:42 sreich-archlinux-desktop rtpmidid[674]: [rtpmidid.cpp:284] Removing rtp midi client raspberrypi
Aug 24 20:57:42 sreich-archlinux-desktop rtpmidid[674]: [rtpmidid.cpp:290] Found client to delete: alsa port 3. Deletes all known addreses.
Aug 24 20:57:42 sreich-archlinux-desktop rtpmidid[674]: [rtpmidid.cpp:647] Removing peer from known peers list. Port 3
Aug 24 20:57:42 sreich-archlinux-desktop rtpmidid[674]: [rtpmidid.cpp:340] Disconnect aseq port 3, signal: disconnect(4)
Aug 24 20:57:42 sreich-archlinux-desktop rtpmidid[674]: [rtppeer.cpp:53] ~rtppeer 'sreich-archlinux-desktop/PipeWire-RT-Event-input' (local) <-> 'raspberrypi' (remote)
Aug 24 20:57:42 sreich-archlinux-desktop MIDI-Jar-1.1.0_b94c6fccb5821201111ab46ec635f799.appimage[1413]: ALSA lib seq_hw.c:466:(snd_seq_hw_open) open /dev/snd/seq failed: Cannot allocate memory
Aug 24 20:57:42 sreich-archlinux-desktop MIDI-Jar-1.1.0_b94c6fccb5821201111ab46ec635f799.appimage[1413]: MidiOutAlsa::initialize: error creating ALSA sequencer client object.
Aug 24 20:57:42 sreich-archlinux-desktop MIDI-Jar-1.1.0_b94c6fccb5821201111ab46ec635f799.appimage[1413]: ALSA lib seq_hw.c:466:(snd_seq_hw_open) open /dev/snd/seq failed: Cannot allocate memory
Aug 24 20:57:42 sreich-archlinux-desktop MIDI-Jar-1.1.0_b94c6fccb5821201111ab46ec635f799.appimage[1413]: MidiOutAlsa::initialize: error creating ALSA sequencer client object.
Aug 24 20:57:42 sreich-archlinux-desktop MIDI-Jar-1.1.0_b94c6fccb5821201111ab46ec635f799.appimage[1413]: ALSA lib seq_hw.c:466:(snd_seq_hw_open) open /dev/snd/seq failed: Cannot allocate memory
Aug 24 20:57:42 sreich-archlinux-desktop MIDI-Jar-1.1.0_b94c6fccb5821201111ab46ec635f799.appimage[1413]: MidiOutAlsa::initialize: error creating ALSA sequencer client object.
Aug 24 20:57:42 sreich-archlinux-desktop MIDI-Jar-1.1.0_b94c6fccb5821201111ab46ec635f799.appimage[1413]: ALSA lib seq_hw.c:466:(snd_seq_hw_open) open /dev/snd/seq failed: Cannot allocate memory
Aug 24 20:57:42 sreich-archlinux-desktop MIDI-Jar-1.1.0_b94c6fccb5821201111ab46ec635f799.appimage[1413]: MidiOutAlsa::initialize: error creating ALSA sequencer client object.
Aug 24 20:57:42 sreich-archlinux-desktop MIDI-Jar-1.1.0_b94c6fccb5821201111ab46ec635f799.appimage[1413]: ALSA lib seq_hw.c:466:(snd_seq_hw_open) open /dev/snd/seq failed: Cannot allocate memory
Aug 24 20:57:42 sreich-archlinux-desktop MIDI-Jar-1.1.0_b94c6fccb5821201111ab46ec635f799.appimage[1413]: MidiOutAlsa::initialize: error creating ALSA sequencer client object.
Aug 24 20:57:42 sreich-archlinux-desktop MIDI-Jar-1.1.0_b94c6fccb5821201111ab46ec635f799.appimage[1413]: ALSA lib seq_hw.c:466:(snd_seq_hw_open) open /dev/snd/seq failed: Cannot allocate memory

when I run aconnect -l I get this

ALSA lib seq_hw.c:466:(snd_seq_hw_open) open /dev/snd/seq failed: Cannot allocate memory

My system gets into a state of this, looks like it is resource locked until I reboot. Mind you, this is now for all clients. But I think it might be a resource leak caused by midi-jar which of course causes issues for everyone.

justinlatimer/node-midi#118

Mind you these are just bits of info I've been scavenging, i'm trying to trace it through my system. Do you happen to know if the architecture could cause something like this, and the node-midi that you are using? I don't want to waste your time if it is not this software, but perhaps you will have a "ah-ha!" moment by me asking this

I will further investigate(gotta wait for it to reproduce itself) to see if I can blame it on the other MIDI client software that I am using (rtpmidid). But for now it is pointing this way. I will keep you updated.

  • MIDI Jar version:1.1.0
  • Operating System: Archlinux
  • Hardware Devices: Roland FP-30

v1.5.0 is actually 1.4.0 and tries to download an update for AppImage

Expected Behavior

That installing the 1.5.0 appimage says 1.5.0 on startup

Current Behavior

It says 1.4.0 on the startup and then says it will download it. But I don't think the self updating works properly for AppImages (linux) anyways. Unless the auto updater isn't pointed correctly to the latest version

Your Environment

  • MIDI Jar version:1.5.0
  • Operating System:Archlinux
  • Hardware Devices:

Optional hide "M" and "maj" for major when displaying triads

Displaying three-notes major chords with single letter is a common way of notation. CM, G#M, Cmaj, Gmaj etc in midi-jar looks unusual for many musicians and chord display apps (e.g. Simple Chord Detection) usually have option to remove M for three-note major chords. Can you add this option to midi-jar for short mode of notation? For long mode this option will remove "maj" in same cases, i.e. for three-notes chords.

Circle of fifths screen is empty on Linux

I can send screenshots but basically, the whole circle of fifth screen doesn't have the graphic visible on Linux. Linux. I can see it on Windows but the graph is not here on Linux.

Your Environment

Arch Linux, kde

  • MIDI Jar version:
  • Operating System:
  • Hardware Devices:

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.