Giter VIP home page Giter VIP logo

midis2jam2's Introduction

🎵 midis2jam2

midis2jam2 midis2jam2 midis2jam2 midis2jam2 midis2jam2

midis2jam2 is a remaster of MIDIJam, a 3D MIDI file visualizer. It plays and animates any MIDI file with a 3D virtual band.

It is written in Kotlin/JVM and uses jMonkeyEngine for graphics.

Not all instruments are implemented yet; this is a work in progress.

🖥️ Installation

Install midis2jam2 with the appropriate installer for the latest version.

⌨️️ Controls

  • WASDQZ — Forwards / Left / Backwards / Right / Up / Down

  • Click and drag to rotate the camera

    • Shift — Move fast

    • Ctrl — Move slow

  • 1–6 — Cameras 1–6 / Exit autocam

  • Grave/Tilde — Reset camera

  • 0 — Autocam

  • Esc — Exit

💾 Building

$ git clone https://github.com/wyskoj/midis2jam2
$ cd midis2jam2 && ./gradlew run

✒️ Authors

Executive developer:

Development contributors:

Internationalization contributors can be found on the About screen of the application.

✴️ Acknowledgements

⁉️ Support

Find guides and answers to common questions on the documentation site. For support, join our Discord server.

⚖️ License

midis2jam2 © MMXXI–MMXXIV Jacob Wysko. The software is licensed under the GNU General Public License v3.0 and comes with absolutely no warranty.

Some assets Copyright © 2007 Scott Haag (used with permission).

View the About screen in the application for contribution attributions.

SoundFont is a registered trademark of E-mu Systems, Inc.

midis2jam2's People

Contributors

jlachniet avatar jonnycrash420 avatar nikitalita avatar remtrik avatar vgking1 avatar wyskoj 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

midis2jam2's Issues

Harp Strings should ring out/sustain after they've been played

As I was mentioning a while back, I think it would be appreciated if the harp strings in midijam should sustain/ring out, like what you would normally see on a real harp. The tubular Bells/Chimes in the program actually do that automatically, so why not the harp strings too?

Add MIDI mixer

Implement MIDI mixer, possibly encapsulate AWT window into Swing GUI and have together or have as a separate frame.

Clones should fill empty gaps

Clones of monophonic instruments do not move closer to the 0-clone when other clones cull when they are not playing. This should be as simple as rotating by the degree of polyphony, that are also visible?

Better CLI support

I want to add better support for running midis2jam2 from the command line, primarily for my testing purpose, but I imagine some would find it helpful.

Execution error on Java 16 (OpenJDK)

Describe the bug
Crashes with assertion

[parker@wolfcola Downloads]$ java -jar midis2jam2-b08e1626.jar 
Jul 26, 2021 9:44:11 PM org.wysko.midis2jam2.GuiLauncher lambda$main$2
INFO: Checking for updates.
Exception in thread "Thread-0" java.lang.NullPointerException
        at java.base/java.util.Objects.requireNonNull(Objects.java:208)
        at org.wysko.midis2jam2.util.Utils.resourceToString(Utils.java:133)
        at org.wysko.midis2jam2.GuiLauncher.getVersion(GuiLauncher.java:194)
        at org.wysko.midis2jam2.GuiLauncher.lambda$main$2(GuiLauncher.java:144)
        at java.base/java.lang.Thread.run(Thread.java:831)
Jul 26, 2021 9:44:55 PM com.jme3.system.JmeDesktopSystem initialize
INFO: Running on jMonkeyEngine 3.4.0-stable
 * Branch: HEAD
 * Git Hash: cb5173b
 * Build Date: 2021-05-30
Inconsistency detected by ld.so: dl-lookup.c: 105: check_match: Assertion `version->filename == NULL || ! _dl_name_match_p (version->filename, map)' failed!

Expected behavior

I don't know, first time using it...

System
Arch Linux x86_64
openjdk 16

Only the legacy engine prints a stack trace

When a midi file is opened (i used canyon.mid) without using the legacy render, when the application crashes it is impossible to see why. It just simply freezes, without opening a stack trace.
I used the latest build from CI and the problem was a missing texture.

Uncaught exception thrown in Thread[jME3 Main,6,main]
AssetNotFoundException: Assets/ChoirPeepVoiceSynth.png (Flipped) (Mipmapped)

Add pitch bend visualization

Is your feature request related to a problem? Please describe.

Kinda, currently when the pitchwheel is used there is no visual indication that it was, so it feels like something that should be there is missing, specially noticeable when the pitchslide is slow and/or is sliding through a lot of semitones

Describe the solution you'd like
A clear and concise description of what you want to happen.

First of you would have to detect the current pitch bend range set on every midi channel that have CC100 at 0 and CC101 at 0, then CC6 becomes how many semitones the pitch bend range is.

Here my ideas:
For guitars and bass at least the "finger" could smoothly go up and down
For pianos/organs you could put a (pretty big so it's visible) pitch bend wheel on them like a real midi piano and maybe a led number close to the pitch bend wheel saying how many semitones the pitch bend range is set at

With midi you can pitch bend literally any instrument unregarding wherever you can in real life or not
For example a flute physically can't irl so how would pitchbend be implemented? Well simply by being way less precise and only have visual movement on it if the pitch is bent for example 51 to 150 cents the fingers would go to the position to play the next semitone, most of the left instruments apart from the pianos/guitar/bass would have to be implemented like this

Then there are the instruments that would be completely pointless to have visual pitch bend like a timpani

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Well an way easier implementation would be to simply put a floating pitch bend wheel next to the instruments that would only appear if the pitch wheel value is changed for ALL instruments, but I'm not too sure about this one

Add visualized fingerings/hand positions for the missing oboe, english horn, clarinet, and bassoon presets

It might take a while before the missing instruments are added to the program, but I would like to suggest this.

I think it would be appreciated if the oboe, english horn, clarinet, and bassoon could have a visualized fingering hand position, just like the flute for example:
Screen Shot 2021-04-05 at 11 58 35 AM

The recorder and piccolo do the same thing, but I didn't bother putting these images there anyway. Since the flute, piccolo, and recorder show fingerings and hand positions, why not do the same thing for the oboe, english horn, clarinet, and bassoon.

Add drop tuning support for guitar and bass guitar

I think it would be cool if the guitar and bass guitar would detune their lowest string if the lowest note they play is a D♭, D, or E♭. That way, those notes wouldn't be lost. To detune a string, the tuning knob should be rotated slightly, according to the amount of detuning, to signify this.

Rapid notes are dropped

On really rapid sections, notes will not visualize. Probably because the render thread is not able to catch events that are less than the current FPS. Maybe somehow get scene updates on a new thread? The bug can be seen in soulless5.mid.

Reengineer guitar/strings fretting algorithm

The current algorithm is very hacky and buggy. Instead of calculating the fret positions on each frame, calculate frets as the note periods occur, then release the string as they elapse.

Potential pseudocode:

frets = [-1, -1, -1, -1, -1, -1]
currentNotePeriods = []
allNotePeriods = calculateNotePeriods(...)
lastFretPosition = [string = 1, fret = 1]

tick(time, delta) {

    /* Stop playing note periods that have elapsed */
    for each notePeriod in currentNotePeriods:
        if (notePeriod is elapsed):
            frets[notePeriod.string] = -1

    /* Collect all note periods that should start */
    while allNotePeriods[0] should start:
        currentNotePeriods.add(allNotePeriods.remove(0))

    for each notePeriod in currentNotePeriods:
        /* Calculate the fret that has the shortest distance to the last fret */
        validPositions = guitarPositions(notePeriod.midiNote) // guitarPositions() accounts for occupied strings
        sort validPositions ascending by distance to lastFretPosition

        /* Assign the best position */
        position = validPositions[0]
        frets[position.string] = position.fret

        /* Update last position */
        lastFretPosition = position

    /* Animate strings */
    animateStrings()
}

Load time interrupts A/V sync

So recently I've updated the midis2jam2 jar file. When I imported a midi file into Terminal, the window opens up showing the instruments not playing the right notes in the beginning when the synthesizer playback actually plays at the very beginning. I meant that the instruments show up at the wrong measure/duration of the midi file when the synthesizer audio playback started at the start of the midi file.

I don't know what caused this bug to happen, but I'm sure that it'll get fixed soon.

Add auto-cam

Basically, add an option to automatically randomly choose the multiple different camera angles in order to create an experience more like the original program. Everything else in this program is great, I just wish that automatic camera angles were added.

Add complete z axis controls

The Q key allows for positive z axis movement, it would be nice if the E key would allow for negative z axis movement

Move the tuba

The tuba and double bass overlap. Consensus shows that the tuba should just be moved somewhere else.

Add Key/Tempo Change Feature

Is your feature request related to a problem? Please describe.
Since midis2jam2 is a midi player I think adding a key change and tempo change feature like a lot of midi players have on the launcher would be another nice feature that original midijam didn't have

Describe the solution you'd like
On the launcher on the settings a key modifier that would normally be on 0 that can be changed from -12 to +12 keys for example
And a Tempo that would normally be at 100% speed that can be changed from 25% to 200% for example

Describe alternatives you've considered
It would be a nice bonus if you could also change these settings while playing a midi on the 3D visualizer window by pressing a button, 4 keyboard buttons 2 for increasing and decreasing key and 2 for tempo speed change, maybe pressing both the increase and decrease buttons would reset it to the default value, text saying current key/tempo might be necessary

MIDI parsing fails with Windows-1252 characters

So I was trying to test out onestop.mid with the midis2jam2 jar file, but for some reason, I get an error message.

Midi File Error

I tried out some other midi files that you can check out here and they literally do the same thing and give me the same error message.

Maybe it's because these midi files are too powerful, or that they're offbeat or syncopated way too much? Or maybe they were created with a professional midi editing program.

Is there a way you could fix this problem?

Saxophones do not pivot around a point on polyphony

Currently, saxophones (and potentially other monophonic instruments) do not rotate around a pivot point when displaying clones of polyphony.

Ideal layout:

multiChannel    // For moving up when there are multiple channels
   ^
   |
   |
cloneNode       // For rotating (by the degree of polyphony)
   ^
   |
   |
animNode        // For rotating (the slight rotation when playing)
   ^
    \
     \
    hornNode        // Contains the horn, bell, keys
     ^ ^   ^
    /   \   \
   /     \   \
  horn  bell  keys

multiChannel's adjustments:
    translation.y (move by y for multi channel offset)

cloneNode's adjustments:
    rotation.y (rotate by degree of polyphony)

animNode's adjustments:
    rotation.x (dynamic rotation during playing)
    location.x (to offset from pivot)

hornNode's adjustments:
    none

Choir notes are reversed

I was trying out the onestop.mid file using the Midis2jam2 Jar file on my Mac OS Big Sur. I noticed that the Choir Visuals have swapped chromatic notes. When I mean swapped, I meant that the notes are in the order of (Ab/G# G Gb/F# F E Eb/D# D Db/C# C B Bb/A# and A), just like the original visualized Brass section from the Original MidiJam program.

The correct chromatic notes in order for the choir visuals should be (A A#/Bb B C C#/Db D D#/Eb E F F#/Gb G and G#/Ab).

I'm sure that this will be a simple and easy bug to fix.

Trombone slide slides into space

The trombone slide sometimes will overshoot and appear briefly somewhere else in the scene on its track axis if the time between two notes is very short.

Allow for .sf3 support

sf3 is basically the same as sf2 but uses vorbis encoding. Might be as simple as extending Sf2Reader?

Make the Window Name from the Configurator Window Different from the Name of the 3D Visualization Window

Is your feature request related to a problem? Please describe.

Recently I've discovered your proyect to modernize midijam and I love it since I use the original in my channel VGMRUS in 99% of the videos.

While you version it's amazing I'm actually having some trouble capturing it with OBS with midis2jam2 on window mode since OBS knows what window to capture by the name of the window itself and since both the configurator window and the actual 3D visualization window have the same exact name OBS will a lot of times capture the configurator window instead which is pretty fustrating, and when the 3D windows closes it starts capturing the Config and the next time you open the 3D window again OBS will still record the config and you have to change manually to the 3D window again
imagen

Here is both the configurator and 3D window seen by OBS, as you can see there's no difference at all which is why OBS does this behavior
imagen

Describe the solution you'd like

Rename the Configurator window from "midis2jam2" to "midis2jam2 configurator" or something similar
Or alternatively the 3D window from "midis2jam2" to "midis2jam2 visualizer" or something similar

Or both if you want, but by changing one of the two should be enough to make OBS capture reliable

Instruments should spawn and despawn on idleness

Currently, instruments (not their clones) remain visible throughout the entirety of the MIDI file. Instruments should spawn and despawn based on when they are about to play and after they are done playing (for a while).

Potential pseudocode:

notePeriods = .. calculateNotePeriods() ..

tick(time, delta) {

    // This is O(n), not great but should work
    for each notePeriod in notePeriods {
        if (abs(time - notePeriod.start) < SPAWN_THRESHOLD
            || abs(time - notePeriod.end) < SPAWN_THRESHOLD) {
            this.show;
        } else {
            this.hide;
        }
    }
    
}

Add FluidSynth as a bundled software synth device

Is your feature request related to a problem? Please describe.
This would eliminate vastly different sounds and configuration problems on other platforms and enable the use of soundfonts to be easily provided by the user.

Describe the solution you'd like
I had looked around for an ingestible java library for fluidsynth, but I had found none. It appears that FluidSynth got rid of their official JNI implementation a while ago; there's android bindings, but those are specific to the Android platform.

However, I did find this:
https://github.com/svenmeier/jorgan/tree/master/jorgan-fluidsynth
This implements the relevant classes for javax.sound.midi, and it uses a recent version of fluidsynth 2.0. It looks like this could be appropriated.
I'm not really sure how to build the project, as there are no instructions, but I've left an issue and the author seems decently active.

Describe alternatives you've considered
I can't find anything else that is even worth considering; fluidsynth support on java may be slight, but I really can't find any other decent software synth with support for java.

Violin/Fiddle and Viola bows are on the wrong side

I was trying out one of the testmidi files in the Midis2Jam2 jar file called "8liccstring.mid" or something like that.

For some odd reason,, the Violin/Fiddle and Viola bows look a bit off. I mean, they were held backwards.
However, the Cello and Bass's bows still looked fine the way they are.
You wouldn't see real violinists/violists holding their bows on the wrong side like that.
Violin:Viola bows are backwards

In the original midijam program, the bows looked very accurate and that they're in the right position.
midijam12

Crash on launch on some OSs

Describe the bug
A clear and concise description of what the bug is.
I was trying to use both engines, and kept seeing:

Uncaught exception thrown in Thread[jME3 Main,6,main]
IllegalMonitorStateException: current thread is not owner

Offending MIDI file
Upload the MIDI file that causes the bug here.
(Unable to upload mid files)
Expected behavior
A clear and concise description of what you expected to happen.
I was just expecting my short song to play.
Screenshots
If applicable, add screenshots to help explain your problem.

System
Provide your OS, and computer specs if applicable.
Ubuntu 14.04.6 LTS x86_64, nearly 4GB RAM,
CPU: Intel Core 2 Duo E8400 (2) @ 3.
GPU: Intel OptiPlex 755
Additional context
Add any other context about the problem here.

Crash When Some Midi Files End

Describe the bug
When some of my MIDIs end the program gets completely stuck and I have to end it with task manager, sometimes the 3D visualizer is stuck and sometimes the 3D manages to close but the launcher still crashes, sometimes the crash doesn't happen, I use Virtual midi synth and all the midis I have are edited in Mixcraft which might not be the most general midi compliant thing there is so that could be the issue

Offending MIDI file
This is the shortest midi I have that managed to crash midis2jam2, just start it several times until it crashes:
Contra Arcade 1 Contra Official.zip

Expected behavior
To not completely crash every time a midi ends of course 😆

System
Ryzen 7 3700x, Shappire pulse rx 580 4gb, 2x8gb 2666mhz ram, windows 10 pro 21H1

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.