vgmtrans / vgmtrans Goto Github PK
View Code? Open in Web Editor NEWVGMTrans - a tool to convert proprietary, sequenced videogame music to industry-standard formats
VGMTrans - a tool to convert proprietary, sequenced videogame music to industry-standard formats
Current VGMTrans converts program number 128 to bank MSB=0/LSB=1 program 0. This is arithmetically correct, but many editors/plugins seem to use bank MSB and just ignore bank LSB.
So I hope VGMTrans will swap the bank output.
*Reported by SOU1, thanks.
I've noticed there are a few cases where vibrato isn't being translated in QSound songs. One good example is Akuma's theme in Super Street Fighter 2 Turbo (sequence 231). The sitar track (track 1) mostly has its vibrato replicated. However, during the last 4 bars it suddenly loses its vibrato. Also the electric guitar track (track 3) should have some vibrato, but it isn't getting any.
I think using a memory-mapped file could increase loading speed of a large file, like as some hex editors do.
Repeating pin/unpin a pane causes an error.
Steps to reproduce:
Something like overlaying a tab with another one may cause an error.
I want a option to load all tracks at the same time by a tick-based loop.
Current VGMTrans loads track one by one, but it causes a problem when two tracks want to share a variable, because of its read/write timing.
For instance, Bad Bird Rag of Donkey Kong Country 2 causes tempo overflow because of this problem.
Chunsoft SNES music engine can read note length from a prior track, so that it probably causes a similar problem. (It is not supported by VGMTrans yet, though.)
Hello. In previous versions of vgmtrans, there was support for N64 Games. However, it did not extract soundbanks, only midis. http://www.mediafire.com/download/w3o9lyp3ltc3z94 (version that supported n64)
Is there any way that in a future version, there could be support for N64? It would be greatly appreciated
Thank you,
Dozzyrok
How about adding a class for driver-specific global parameters?
For example, MP2k has main volume, maximum polyphony count, and sampling rate, at the top of driver object. They are not included in each songs/instruments.
As the title says, the tool should have a configuration file.
YAML-cpp is stored in the code repository for this purpose, but I have not tried it yet.
When I right-click on a RawFile, a popup menu opens twice, because OnContextMenu is called twice by an unknown reason.
ReadMe, Licenses and ChangeLog should be attached to the release package, but I think there is no need to attach other documents (Formats, How To Build, etc.) I suggest managing them in Wiki instead of Git repository.
Currently, variable-based SSEQ if-else statements are completely ignored. The variable is not emulated at all, and all if statements are unconditionally executed. This breaks ripping Spirit Tracks SSEQ_0018 overworld theme.
The correct way of emulating it is to keep track of the variable. However, that is not a complete solution, because the ripping will terminate early whenever it loops back to an already-ripped section, but with a different variable that affects the future progression. So you have to save the variable contents along with your current byte offset. And if the game increments the variable once per loop, but does nothing else with it, (for example), the ripper will enter a nearly-endless loop, ripping the same thing over and over again, but with the variable changing.
Is it possible to add a hack fix?
Each track stops ripping its partial MIDI as soon as its own jump occurs.
The user's dump choice is applied to all tracks.
This method assumes all tracks' jump points are equivalent structurally. I'm fairly certain that's true for Zelda ST SSEQ_0018
If not, the tracks will desync.
Key correction of Rare SNES engine is wrong. Probably, an instrument can be used by multiple tracks in different tuning, but current parser does not expect it.
Depending on the installed MIDI drivers on a computer, vgmtrans can take a long time to boot.
My computer lists 8 DirecMusic devices (including BASSMIDI and VST MIDI drivers) and it takes about 30 seconds to boot.
The source of the issue seems to be the way devices are enumerated in the CMidiPort class.
On my system m_pMusic8->EnumPort() takes 3 seconds to get the information of device 0 (MIDI mapper), all other devices are enumerated fairly quickly.
Unfortunately EnumPort() is called not only to get the number of available devices (GetNumPorts), but it also is called N times when getting the device information for the Nth port in GetPortInfo. (It enumerates from 0 onwards until the Nth valid device is reached.)
So in my case it calls EnumPort() for device 0 nine times in total, each time taking 3 seconds.
If the CMidiPort class would get the information of all devices once during the initialization phase and cache them for GetPortInfo, it would reduce the boot time a lot.
Game: Secret of Mana
SPC: Meridian Dance
Bug: instrument 34 (zero-indexed) is not ripped properly. (percussion sample used in channel 2 (one-indexed))
Other: I tried Split700, which skipped sample 35. Your code either has an off-by-one when enumerating valid samples, or otherwise fails to extract 34.
Trying to build with Visual Studio 2015 Community (successor of Visual Studio Express) results in linking errors against DxErr.lib and tinyxmlSTL-mt.lib.
packaged tinyxml:
LNK2038 - _MSC_VER mismatch between 1800 and 1900
LNK2001 - several unresolved external symbols
Solution:
Rebuild tinyxml with your own compiler
packaged DxErr.lib:
LNK2001 - unresolved external symbols _vsnprintf and _vsnwprintf
Solution:
Use FormatMessage function (Windows) instead of the DX*
See Where's DXERR.LIB?
Having something like "Save All Selected Sequences As MIDI" seems to be useful to convert all songs of the game. I'd like to use it.
Multiple files can be selected in Collections tab and it provides Save menu, but it saves only a single file.
Game: Secret of Mana
SPC: Meridian Dance
Bug: Channel 0 (track 1) is empty, resulting in missing percussion. akaospc CLI is not affected.
Using the latest interim build in Releases, and checking against older versions, it seems that bgm40 in RPG Tsukuru DS will not load. It loads the other 39 songs, sound effects (due to how this works in the game) and musical effects just fine, but for some reason won't load bgm40, which is the editor music. I was able to load it in the sequel, RPG Tsukuru DS+, but not the original. I also know that it is sequenced since I was able to rip the music into the new NCSF format (minincsf) in its entirety.
Seems this project can convert a VAB to SF2. I'm trying to do this "in memory" for this project:
https://github.com/paulsapps/alive
Are there any docs on how this works? Right now I can parse SEQ and VAB, but I have no idea how to get fluidsynth to play the sound as-is without somehow converted to SF2. Also its unclear exactly how a midi channel/note/velocity maps onto a VAB program/tone?
http://www.mediafire.com/download/u3oo3v94ayzj17w/submarine_tech_demo_sdat.sdat
EDIT:
Thanks for fixing.
IsOffsetUsed returns true even if it's the first visit, since an event is already added in READMODE_ADD_TO_UI.
Example: Pop'n Twinbee - Far East Sky
VGMTrans (2015-02-22 interim) crashes when I load a sequence. It happens quite randomly. I have never reproduce the issue in Debug build yet.
Apparently it crashes at SetPPQN (this->ppqn = ppqn), because NULL (or whatever illegal value) is set into "this".
SPCLoader parses basic information of ID666 tag, however, it currently does not support XID6 at all. XID6 support will allow us to handle long song names correctly.
VGMTrans puts unwanted note at the end of song, when the song has an infinite loop.
A mechanism to "truncate" a note and/or slider event at the end is required. Or, VGMTrans should not do timer-based conversion.
VGMTrans doesn't have NDS STRM decoder. I want it.
Snip, see link below for notes.
When VGMTrans loads Dewprism PSF, it fails to load HOSAInserset::sampColl. As a result, it fails to export DLS/SF2.
Current VGMTrans does not have a loader for GSF, SNSF, 2SF, etc. They are almost the same as PSF1. I hope VGMTrans will support it in future.
I think I will make an Interpolation class someday.
I have not been able to get the psfs from Chocobo Mystery Dungeon (Chocobo no Fushigi na Dungeon) to work correctly with vgmtrans. In vgmtrans it lists the file name as VGMSampColl and is unable to play it or save a midi file. In the right window it lists everything as a sample with a number. Any chance you could look into it?
A song sequence sometimes may have a special jump event. The jump condition is determined from external input (CPU variable) and the song syncs to the situation of the game, as a result. (for example, an intro part repeats until a certain conversation has begun)
It is hard to parse such songs without external input. I think a feature that can write to such a variable from an external script (Lua?) may be useful.
Any good ideas to handle such cases?
Xenogears instruments seem to have ADSR values that cannot be handled by PSXConvADSR. Current VGMTrans just ignores the invalid ADSR (otherwise it may cause an infinite loop), but it should apply a correct ADSR setting to the instrument rather than ignoring it.
I would be happy if VGMTrans supported MP2kInstrSet.
A program called GBAMusRiper does MP2k to SF2 conversion. Every technical things can be referred from it.
http://www.romhacking.net/utilities/881/
Current VGMTrans can play only VGMColl. If it could also play VGMSeq or VGMSamp, it would be handy.
I don't even know if this is the right place to request this, but I'll give it a go. Pokemon Mystery Dungeon EOT/D/S for the DS use a different sequence format than the standard SSEQ, and nothing can rip it right now--is it possible you could look into it?
If VGMTrans can load a file from command line, people can make a file association and can open a file from Explorer.
Hi, was just shown this program by a friend the other day, and as someone who has long been interested in Capcom's QSound soundtracks, I love it! However, I would like to point out one issue in your implementation of the QSound format. One parameter in the instrument definitions is currently listed as "Unknown". Based on my prior research, it would seem this is a signed fine-tuning value. Listening to Super Street Fighter 2 Turbo's soundtrack as played back in the program, the electric piano instrument (instrument 0143) is noticeably out of tune (listen to arpeggio a few seconds into song 3 for a good example) , and I believe it might be due to the lack of this parameter being reflected.
WHERE IS THE APPLICATION? THRE ISNT AN EXE FILE? I SPELLED THE 5TH WORD WRONG.
There is an infinite loop that occurs when extracting SDAT from the NDS game, Animal Crossing: Wild World.
The current offset (curOffset) on line 137 is always updated, but it never exceeds stopOffset. It keeps repeats the following values: 0x01397829, 0x0139782b, 0x0139782d, and 0x0139782f.
MP2kScanner cannot find data from ROM in GSF. Maybe a slightly looser scan logic is needed.
At present, a scanner parses the whole file, and the next one will do the same, and so on.
A scanner should skip the region that is already found by other scanner. Also, all scanners should run parallelly. And it will give a chance to skip unneeded scanning to every scanners.
Current VGMTrans has a lot of warnings and dead codes (which are commented out). It should be fixed, removed or suppressed someday.
Sometimes, VGMTrans causes an assertion error when I close the application.
It happens in TimerProc in DockingFocus.h
ATLASSERT(!This()->m_qHwndCaption.empty());
Whenever I try to save a PS1 SEQ file as MIDI with SF2 from the PSX game Breath of Fire 3, it generates a .mid file and a .sf2 that play just fine with Winamp or foobar2000, but the problem is that some notes are played double with a short delay between each other, about 400-500ms. At first, the notes are played on the left audio channel and then, 400-500ms later, on the right channel, which sounds unfortunately very bad. The playback within VGMTrans works just fine without those problems.
Open button is not implemented. It should be implemented or removed/disabled.
Bass instrument (Instrument 12) of SNES Dragon Ball Z: Super Butouden 2 plays in wrong pitch. (Vegeta's Theme, for example)
It is not caused by wrong tuning process. Instrument 12 needs to be associated with Sample 12, but it's associated with Sample 8 in fact. They refer the same address, but have different loop points.
In other words, it's not possible to associate samples correctly, with the following conditions:
How can I solve it? Any good idea?
It seems like it currently doesn't convert SCEI banks to either SF2 nor DLS even though it has options for both in the context menu for the instrument set item. I assume there just isn't support for it yet? If this is not some bug, when do you suppose you could try adding support for it?
Hey there,
I've been using mutliple programs to extract DLS's from the DS Phoenix Wright 3 game. I've been using a relatively easy track, Godot's Theme, as my test BGM (BGM116 in the SDAT file).
However VGMTrans extracts the DLS bank incorrectly. It extracts 4 instruments when there are 6 (not counting pulsewaves which the program cannot extract as yet).
MKDS Course Modifier can extract all 6 but the loop points in the samples are not defined, causing notes to cutoff/decay incorrectly.
If anyone needs referenced DLS to be uploaded I can do that.
Regards,
Oh dear. A git bisect reveals this was caused by the sequence/track loading rewrite in commit b285850.
I first noticed that some notes in QSound have shortened durations. Turns out the problem is with tied note events. You'll find these everywhere in QSound, but for an isolated track, look at sfa2 sequence 10 (Rose) track 6.
Since tied notes in QSound use NoteOn and NoteOff instead of NoteWithDur, I wondered if this problem is affecting other formats that use NoteOn/Off. Sure enough, SquarePS2 uses NoteOn/Off exclusively, and It's totally broken.
Stepping back for a moment, I'm still working on understanding the rewrite code. It seems to have added a lot of complexity and state to the VGMSeq and SeqTrack classes. I understand that some formats require that we process all tracks at once, tick by tick, but I don't think this should be the default approach. This method is more complicated and less intuitive, as it effectively emulates real-time playback. Most formats don't require we do this. My instinct would be to create subclasses of VGMSeq/SeqTrack that handle tick by tick processing for the formats that need it.
Thoughts?
One example is DS Zelda Spirit Tracks's SSEQ_0018 (overworld train theme). VGMTrans locates the tracks properly, but calculates each of their stopTime's as zero, and immediately aborts the MIDI extraction. As a result, I get a MIDI file containing all the tracks, named by hex location, but with no note events whatsoever.
The hex-dump viewing of the SSEQ also recognizes each track as containing no note events.
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.