mmontag / chip-player-js Goto Github PK
View Code? Open in Web Editor NEWWeb-based music player for a variety of video game and chiptune music formats.
Home Page: https://chiptune.app
License: GNU General Public License v3.0
Web-based music player for a variety of video game and chiptune music formats.
Home Page: https://chiptune.app
License: GNU General Public License v3.0
This needs some work.
Channels do not match up for the FM chips supported by libgme.
When seeking past last song in a context, App goes to ejected state.
When last song plays through to the end, App doesn't go to ejected and player goes zombie.
Especially a problem when lookahead is enabled. game_music_emu sees silent frames, renders 2 seconds into the future, and ends the track before you can unmute the voices.
Is this possible with react-virtual-list component?
This is important for directories with thousands of items, like MIDI and SNES.
This hotkey (Cmd+Arrow) is history navigation in the browser.
Yu-No pyn_007b.mid
ERROR: Invalid MIDIFileTrack (0x3e0) : The track size exceed the buffer length.
EVE Burst Error EVE_07.MID
ERROR: 0x4b Running status without previous event
Due to shift-JIS encoded track titles
Gran Turismo MIDI files spu_04.mid, Smokey Robinson - I Second That Emotion.mid , Taito - metalb2.mid , Aqua - Barbie Girl.mid
Drum channel is playing as piano (probably due to a bad bank select event combined with this change 7bb5db2 - which reverts hardcoded ch10 bank selection in fluidlite.) Fix it in the MIDI player (ignore drum channel bank selects)?
Even More Incredible Machine, The - 06. Rock.MID - stuck note at end of track; song hangs. This game also has an extra drum channel that plays as piano
Tyrian MIDI files Camanise.MID
MThd prefix not found. Bad game rip? Doesn't work with MIDIPlayer X
Transport Tycoon Deluxe
Invalid MIDIFileHeader : MThd prefix not found
LB3_-_Felest_Tower.mid - Sounds jittery with external MIDI device. Could be issue with the custom MIDI throttling code in MIDIFilePlayer.js, or due to excessive CC 10 (panning) on channel 1, 2, 3, 4.
https://chiptune.app/?play=Contemporary%2FSTAFFcirc%20vol.%209%20-%20MIDI%20MODULE%20FANATIX%2F16%20HueArme%20-%20Yakumotatsu%20(Microsoft%20GS).mid almost 1 MB, like black MIDI, meant for Microsoft GS softsynth and breaks throttling
Theme Hospital Error: Unable to play Game MIDI/Theme Hospital (PCโDOS, 1997)/Steady.mid (Invalid MIDIFileTrack (0xe) : No track end event found at the expected index
https://chiptune.app/?play=MIDI%2FCamel%2FThe%20Snow%20Goose.1.mid 4357 minutes long
On certain VGZ files there's volume inconsistency. One of the prime examples is in Black Knight 2000 main theme. Notice how the vocals, as well as percussion are very quiet compared to the rest of available voices. Here's the video of the main theme BGM of this pinball machine. Notice how the percussion can be heard, as well as all the vocals. https://www.youtube.com/watch?v=p61YjWczwLM&t=17s This was fixed when vgm playback was switched to libvgm.
would love to be able to drag and drop songs and see the visualisation โ it is mesmerising ๐
Getting reports of glitchy MIDI audio. FluidSynth has a hardcoded polyphony. Would be nice to change this in the UI.
game-music-emu sometimes finds artist metadata.
Yuzo Koshiro - The Super Three
Streets of Rage II - Sega Master System / Game Gear (1993/7/23)
4 bits of information:
should be
Game Title - Track Title
Composer - Game System
i.e.
Streets of Rage II - The Super Three
Yuzo Koshiro - Sega Master System / Game Gear (1993/7/23)
some formats have a different set of metadata, such as MIDI, where there is virtually none. Any metadata has to be inferred from file path, which varies in use:
/Piano+E-Competition+MIDI/2014/Cheng+Guang+-+5th+Prize/Rachmaninoff+-+Prelude+in+D+Major,+Op.+23,+No.+4.mid yields
2014 - Rachmaninoff - Prelude in D Major, Op. 23, No. 4.mid
Piano E-Competition MIDI
vs.
/MIDI/Frankie+Valli/December+1963+(Oh+What+a+Night).mid yields
Frankie Valli - December 1963 (Oh What a Night).mid
MIDI
vs.
/Game+MIDI/Ultima+Online/CREATE1.MID
CREATE1.MID
Ultima Online - Game MIDI
The metadata formatting and fallback behavior should be consolidated in one place. The app, after receiving metadata back from whichever player engine is in use, should combine the info with the file path and reconcile something. The player can return whatever sparse metadata it knows about, but the app is responsible for resolving all this to a "Title" and "Subtitle".
i.e.
getTitleAndSubtitleFromMetadataAndFilepath(metadata, filepath) {
let title, subtitle;
// inspect metadata
if (metadata.artist) { ... }
...
// make a decision about how to put together a title and subtitle
return { title, subtitle };
}
In order to easily link out to the current song in an environment where the address bar/URL is not readily visible.
Right now, the player engines are bundled into one large (~1.3 MB) chip-core.wasm module. We should try to split the player engines into separate WASM bundles without incurring the overhead of loading a separate Emscripten runtime for each engine. This may be possible with Emscripten dynamic linking (or something simpler).
https://github.com/emscripten-core/emscripten/wiki/Linking#hyper-dynamic-linking
Sometimes there is an audio glitch when switching songs. A player might leave stale sample data in the buffer when switching player engines or switching songs. I don't really know the cause.
I clone this repository successful, and cd chip-player-js
, run bash-command yarn install
, then console tips compile-failed, and output stack-error on console, and I found this error:
node-pre-gyp WARN Tried to download(404): https://node-precompiled-binaries.grpc.io/grpc/v1.20.0/node-v83-linux-x64-glibc.tar.gz
How to resolve this? I'm not good at node.js, because node.js dependency is so complex...
System/Software Environment/Runtime:
[root@centos7-console chip-player-js]# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
[root@centos7-console chip-player-js]# gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[root@centos7-console chip-player-js]# npm -v
6.14.8
[root@centos7-console chip-player-js]# yarn -v
1.22.5
[root@centos7-console chip-player-js]# npm config get registry
https://registry.npmjs.org/
[root@centos7-console chip-player-js]# yarn config get registry
https://registry.yarnpkg.com
Big problem in some MIDI files.
It would be nice to also add volume normalization for quiet VGMs. Look at Muki for inspiration.
any plans to support YM-2149F (Atari) / AY-3-8910 (ZX Spectrum) ?
Right now the CSS style situation is scattered.
Most styles are defined in a single styles.css file, but some styles are defined in component-local CSS objects. Some styles are defined inline in JSX.
The local component CSS rules out the possibility of supporting separate skins for the player.
The layout of the player is tightly coupled to the component structure. (Maybe a fixed layout is fine for now.)
In order to support themes, all the CSS needs to exist either in a styles.css file, or using a CSS-in-JS library.
It's confusing that the page asks for WebMIDI permission on first load.
This should be requested only as needed, when the user chooses WebMIDI in MIDI Player Settings.
Steps to reproduce:
Follow up to #51. Some formats have native support for looping, i.e. NSF files that run forever, or MIDI with loop points.
Repeat-One mode should take advantage of this, i.e. Repeat-One should have multiple effects:
These are two distinct behaviors, but I think it makes sense to link them together under Repeat-One.
Export channels to wav files could be a nice feature. Could be possible to do that?
Currently I try to do this job with RYMCast, but the channels completely panned to the right, generate an empty wav file.
Thanks for this amazing project
I don't know how you would achieve this, but I would like to be able to listen to a few more PC game music tracks e.g:
Add a link or button somewhere to display keyboard shortcuts.
It seems that Chrome will suspend XHR requests when a tab is in the background. When the sequencer is playing through a song list, and the player is in a background tab, it gets stuck between tracks. This indicates that the audio process (and JavaScript) continues to run just fine, but something else that only happens between songs (like a network request) is held up by the browser.
https://github.com/Doom64/fluidsynth-lite
Fluidsynth-lite has similar purpose like Fluidlite, but it doesn't tightly dependent with libvorbis, so it may be a nice alternative for web and easier to port than fluidlite.
When I try to open the player it simply disappears shortly during loading process. Once that happens the "Error initializing constant Q transform." error pops up in the developer console.
This screenshot is made while Chrome is in Incognito Mode to rule out adblock extensions interfering with site's functionality.
Chrome version: 83.0.4103.97 64-bit
On certain VGZ files there's volume inconsistency. One of the prime examples is in Black Knight 2000 main theme. Notice how the vocals, as well as percussion are very quiet compared to the rest of available voices.
https://mmontag.github.io/chip-player-js/?q=black+kni&play=VGM+Rips%2FBlack_Knight_2000_(Williams_System_11B)%2F04+Main+Theme.vgz
Here's the video of the main theme BGM of this pinball machine. Notice how the percussion can be heard, as well as all the vocals.
https://www.youtube.com/watch?v=p61YjWczwLM&t=17s
just a black canvas. no errors in console.
Plays about 20% slower than it should.
Such as Visualizer On/Off, Player Settings show/hide, etc.
Why not allow the Chip Player JS volume control to adjust the volume of Web MIDI devices? Even though devices have hardware volume controls, it can be a pain if you have multiple devices.
One of the following methods should work:
0xF0 0x7F 0xid 0x04 0x01 0xmm 0xnn 0xF7
(ignoring this if it appears in songs)This is complicated by MIDI statefulness, but it doesn't have to be perfect. Consider restarting songs acceptable.
For example at 05:00 in this mod.
Please, add repeat function! [ask for a function]
Sometimes, I want to listen to music more than it's length.
The "Voices" panel is slightly different for each player.
In the case of the MIDI player, it displays the initial GM instrument on each MIDI channel (not MIDI tracks).
The instrument played on each channel can change during the course of the song with a "program change" event. The voices displayed in Chip Player then will be incorrect because it does not update.
We should intercept program change events and update a state map of Channel โ Instrument inside the MIDI player.
Hi, @mmontag ๐ .
This is a very interesting and most feature complete javascript based music player.
I am really curious, what is license for this project as I cannot find any license notes here, except at every 3rd party player library project directory?
Thanks.
catalog.json is 2.6 MB (740 KB gzipped).
This is a blocking request for the whole player to function (unacceptable).
What can be done to improve this situation? Anything short of building a backend?
Maybe a backend is okay, but it needs to be extremely simple and fast. PHP, mysql? Go? Node.js?
What about backend as a service? Firebase does not provide full text search in Cloud Firestore. The trie-search functionality is not covered by SQL.
The artwork info for each music file should be included in catalog.json (in a compact representation - maybe just a flag to indicate its presence, such as img: 1
) so that HTTP requests don't have to be made for every single item played, resulting in a lot of 404s. This will also allow synchronous logic in the case where there is no artwork. User should not have to wait for an HTTP request to 404 in order to see the fallback artwork for a given file.
Add some support to display a description.txt/info.txt in each directory.
I want to curate these to add provenance and other details to the main directories of the catalog.
At the root directory, this can be used to display latest updates to the catalog (or to chip player itself).
Slightly different from the TXT link displayed along with individual song files.
Hi
When I attempt to save a song as favourite the little heart icon goes yellow for a second and then reverts back to its original colour. Nothing can be found under the favourites tab.
Naturally, I am logged in.
Here's my user agent string in case that is useful: Mozilla/5.0 (X11; Linux x86_64; rv:69.0) Gecko/20100101 Firefox/69.0
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.