Giter VIP home page Giter VIP logo

crashedit's Introduction

CrashEdit

This program is an application designed for modifying the game files of the original Crash Bandicoot video game trilogy.

This is the 2.0 version of the software. See README-CE2.md for the detailed readme on this updated version.

Supported Games

Note that CrashEdit does not work directly with ISO's, but rather with the NSF/NSD files stored on the game discs.

  • SCUS-94900 Crash Bandicoot (no prelude patching)
  • SCES-00344 Crash Bandicoot (no prelude patching)
  • SCPS-10031 クラッシュバンディクー (no prelude patching)
  • US BETA 96/03/08 Crash Bandicoot "Prototype"
  • US BETA 96/05/11 Crash Bandicoot "E3 Demo"
  • SCUS-94154 Crash Bandicoot 2: Cortex Strikes Back
  • SCES-00967 Crash Bandicoot 2: Cortex Strikes Back
  • SCPS-10047 クラッシュバンディクー 2: コルテックスのぎゃくしゅう! (incomplete support)
  • EU BETA 97/09/14 Crash Bandicoot 2: Cortex Strikes Back "Review Copy"
  • SCUS-94244 Crash Bandicoot: Warped
  • SCES-01420 Crash Bandicoot 3: Warped
  • SCPS-10073 クラッシュバンディクー 3: ブッとび! 世界一周 (incomplete support)
  • US BETA 98/08/15 Crash Bandicoot 3: Warped "Alpha Demonstration" (as Crash 3)

Usage

For users acquainted with Microsoft Windows, "directories" are commonly referred to as "folders" on windows. When the term "directory" is used here, think "folder".

Some basic knowledge of how Crash Bandicoot game files are laid out is necessary to use this application. CrashEdit is not designed to work directly on disc images (aka ISO's), but instead on files with the "NSF" and "NSD" file format. This is a custom format created by Naughty Dog and used in the original Crash Bandicoot trilogy (not including CTR).

First, a Crash Bandicoot game CD will have a root directory with contents similar to the following:

  • S0 (directory)
  • S1 (directory)
  • S2 (directory)
  • S3 (directory)
  • SYSTEM.CNF (playstation game boot configuration file)
  • SCUS_949.00 (playstation game exe file, US Crash Bandicoot in this case)

Within the S0/S1/etc directories you will find files named similar to the following:

  • S0000013.NSD (nsd file)
  • S0000013.NSF (nsf file)
  • S0000014.NSD (nsd file)
  • S0000014.NSF (nsf file)
  • S0000015.NSD (nsd file)
  • S0000015.NSF (nsf file)
  • ...

Notice how each filename has an NSD/NSF pair. Each pair corresponds to a specific level in the game, and these files contain the game data for that level. The last two characters before the .NSD or .NSF extension are the "level ID" for that specific level. As an example, the level titled The Lost City has the level ID 20, and its file pair is the following, found in the S2 directory:

  • S0000020.NSD (nsd file)
  • S0000020.NSF (nsf file)

A complete list of level ID's and their associated levels can be found here:

https://wiki.cbhacks.com/w/Level_ID

The NSF file contains the actual game data for the level and is what CrashEdit is designed to read and manipulate. An NSF file consists of entries. Each entry has a 5-character name, and represents a game asset such as a sound effect or 3D model. The fifth character must match the character expected for an entry of that type. For example, animation entries must end in V and GOOL entries must end in C. The following entry types are recognized and supported by CrashEdit:

  • Animation: One animation used by a game object. Each frame is a full set of vertices.
  • Model: One model used by a game object. Polygon data is stored in a Model Entry, but vertex data is stored in an Animation Entry.
  • Scenery: One section of the 3D model for a level's world geometry.
  • Sort List: A list of values that indicate what polygons should be drawn on-screen and in what order. These require world indexing, which means they'll only operate along with a Zone Entry.
  • Texture Chunk: A chunk with the format of an entry. A single 64 KiB page whose data will be directly uploaded to VRAM on load. Double-click the display to open a texture viewer window.
  • Zone: Describes one level "zone", including objects in that zone as well as the zone's camera configuration and collision octrees.
  • GOOL: One dynamically-linked object executable. Contains all object code as GOOL bytecode (and also R3000A MIPS for Crash 2 and 3) for a specified object type as a series of code blocks, including animation references. Crash 3 GOOL is not fully supported.
  • Sound: A sound effect. This entry only contains the raw sound data without any metadata such as the sample rate, which is determined by an object's code.
  • Music: A set of music tracks in SEQ format (very similar to MIDI format), and the associated VH file (wavebank header file). Each level zone will refer to a single music entry which will be used for playback while the camera is in that zone.
  • Image: One single large image consisting of 16x16 blocks, meant for use with a Map Entry. Each bitmap can be in one of many formats.
  • Map: Describes a "map", composed of a background image, followed by several "map entities" which are overlayed. CrashEdit only supports the background layer. Right-click the image to save to a file.
  • Palette: A list of 256-color palettes, meant for use with Image Entries in indexed formats (8-bit).
  • Wavebank: Part of the level's wavebank data (VB file). Crash music is in MIDI format, but does not use General MIDI (GM) instruments. Instead, a custom instrument set is used for each level. The audio data for this instrument set (wavebank) is very large, so it must be split into multiple entries (up to a maximum of 7).
  • Speech: Similar to the sound entry, but streamed, meaning a single Speech Entry is part of a longer audio track. It is possible for one streamed audio track to fit into a single Speech Entry, though this is rare.

Entries are organized into containers which are referred to as chunks. Each chunk is exactly 64 KB in size, and so it cannot contain more than 64 KB of entry data. (If you attempt to save an NSF file which has a chunk containing more than 64 KB of entry data, a packing error will occur and the save operation will fail.) There are different types of chunks: the normal type and special audio types. (As a general rule, you should keep audio-related entries in their proper chunk types or else the playstation will be unhappy.) There is also a special chunk type, Texture Chunk, which contains raw texture data instead of entries.

The NSD file contains various data used to assist the game in properly accessing the NSF files. Included in the NSD file is a table mapping entries to chunks. If you add chunks, delete chunks, add entries, delete entries, move entries, rename entries, or reorder chunks, you will need to update this table. CrashEdit can automatically patch this table with the Patch NSD button. It will remove any and all prelude data._

System Requirements

Aside from the obvious monitor, keyboard, and mouse. A mouse scroll wheel is not required, but is used to control the 3D viewers.

  • .NET 8.0
  • Preferably at least 256 MB of physical memory available to the application or you may encounter thrashing while loading or saving large files

Known Issues

Incomplete Features

Significant Issues

  • Crash 1 Retail: Saving preludes is not yet supported.
  • Crash 2/3 NTSC-J Retail: The lip-sync data used for Aku Aku hints is not supported, making Speech Entries unopenable.

Insignificant Issues

These issues have no significant effect on the operation of the program, but are still technically issues with the program. This list can be safely ignored by most users.

  • All Games: Any data hidden within unused sections of NSF files may be ignored by the program without warning, and will not be preserved.
  • Crash 1 All: Music entries containing VH data may be saved out with different data in unused sections.
  • Crash 1 Retail: "Patch NSD" does not patch all of the NSD.
  • Crash 2 NTSC-J Retail: A music entry in S000003C.NSF containing VH data may be saved out with different data in unused sections.

Bugs

  • All Games: Exporting VABs in DLS format is currently broken. The workaround is to open and resave the DLS file with Awave Studio.
  • Crash 1 All: Exporting to COLLADA format is currently broken. However, these files can be opened without issue in Noesis.

Broken Game Files

  • Crash 1 All: S0000002.NSF, if present, must be opened as a "1995 Prototype" file. When viewing its zones, press O to fix the octree display.
  • Crash 1 All: S0000010.NSF, if present, must be opened as a "1995 Prototype" file.
  • Crash 1 Retail: S0000038.NSF contains a music entry with an incorrect SEP track count.
  • Crash 1 Retail: S0000004.NSF is actually a beta MAR08/MAY11-format file.
  • Crash 1 Retail: S000000B.NSF is actually a beta MAR08/MAY11-format file.
  • Crash 1 Retail: S000000D.NSF is actually a beta MAR08/MAY11-format file.
  • Crash 1 Beta MAY11: S000001C.NSF contains two demo entries with incorrect magic numbers.

Installation

Just unzip into a directory and run the exe.

If you are working with the source code, it is a VS 2022 solution which consists of four projects, "CrashEdit", "Crash.UI", "CrashEdit.Main", "CrashHacks", "ISO2PSX" and "FTBitmapExtensions". You will need to set "CrashEdit" as the startup project to run the application. "CrashHacks" is a separate application not documented on this repo and not used by CrashEdit itself.

Where To Get

Precompiled binary files (EXE files) are available at: http://www.cbhacks.com/crashedit.html

The original source code is currently available as a git repository on github at:
https://github.com/cbhacks/CrashEdit/tree/deprecate (deprecate branch)

crashedit's People

Contributors

airumu avatar arahaan avatar mandude avatar ughman avatar wurlyfox avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

crashedit's Issues

Export music as WAV

Grabs the first SEQ (or second, maybe there should be an option for this), VAB and "merges them together", so you'll get the SEQ as if it was in the game (but doesn't loop). This should also include in-game effects such as reverb and echo and whatever.

NSD support

Opening an NSD should make CrashEdit show its content similar to the way it shows NSFs: Instead of chunks you got chunk index, spawn point index, etc. and inside those are the EIDs and CIDs (and spawn point garbage in the spawn point section, this is made in a weird way though)

Automatic type/subtype existence detection

When saving (or before, technically), CrashEdit should detect whether a type on a non-camera entity exists by checking the code entries. Additionally (but possibly only available in the far future), CrashEdit should also detect if animations and models by EID for all of the subtypes in the level and if data for them exists too. If any of these is not available, an error should pop up with an appropriate description i.e. "Type {Type} for object with ID {ID} does not exist.", "Subtype {Subtype} (in object with ID {ID}) does not have a model/an animation/available code." (this last one is picked accordingly).

Zone collision octree rendering

CrashEdit should support a default-off toggleable option to render the collidable geometry used in zones.

I already have an uncommitted implementation of this using immediate mode, with terrible performance. GL display lists help this somewhat, but not enough to be very useful. VBO's may be able to get much better performance, and non-VBO-capable hardware is not going to be powerful enough to get even one FPS on immediate mode anyway.

I'd also like to look into ways of using fragment shaders. Perhaps a quad could be rendered across the entire screen, and a fragment shader could do the octree walk for each fragment? Not sure about the math involved or the potential performance issues, since the kind of conditional execution it will take might be pretty bad on GPU hardware. We'll see.

MIDI parser

The backend needs a real MIDI parser which can parse the MIDI event stream as well as save it back out.

This will be needed for MIDI import as well as MIDI editing, and also to fix the broken MIDI export tempo problem

Entities need a "Delete Entity" option

Duplicating entities can cause packing errors, but because there's no way to delete them again, these errors can be difficult to solve. To rectify this, a "delete entity" option should be added.

CrashEdit needs a better system for handling and solving packing errors

The error messages for packing errors are unhelpful, notably:

  • _Which_ chunk the error occurred in is not reported at all.
  • How much excess space is used is not reported either.
  • If there is more than one packing error, only the first is reported.
  • The error message does not describe what a packing error is.

The entire system should be redesigned. Preferrably, it should show entry sizes and remaining chunk-space live as the entries are modified. One possible design is this:

  • Controllers gain the ability to invalidate themselves and their parents.
  • Invalidated controllers have their names recalculated, and EntryChunkControllers recalculate their size minus capacity.
  • Entries should have an EstimateSize method which returns their size in bytes. This method should be efficient so it can run every time a minor change is made to an entry's editor control. By default, it could return Save().Length as a slow default.

This setup would also have the side-benefit of having entity names updated in the tree view as their names are modified in the control.

Import/Change texture chunk

"Import" adds another texture chunk, but the user is prompted to choose a texture image (which format? I dunno), "Change" replaces the current texture image with another one.

MIDI import

CrashEdit should be able to import MIDI files and convert them to SEQ with the necessary conversions:

  • 100%/127% volume check
  • Note Off -> Note On 0% Volume
  • MIDI Tempo -> SEQ Tempo
  • Check for other unsupported metaevents

Needs #15

Simple SEQ or MIDI editor

This should support some batch actions such as:

  • Shifting all notes on a channel or program by some amount
  • Correcting the 100%/127% volume issue
  • Batch program change number replacement

This should make it easier to just jam in external midis and try them out, although playback would help with that as well.

Needs issue #15

Crash 1 object support

Objects in Crash 1 (all versions) are significantly less complicated and are also way smaller. They have some sort of Int16 that pretty much says how they will show up (after 4 empty bytes with unknown purpose), then ID, then something that says that it's an object and not anything else, then 3 special settings (all of what I listed is in Int16, not sure if they're signed or not), then a byte for type followed by a subtype, then positions: Int16 for X, Y and then Z, followed by more positions if they exist. Note: there must be an extra empty (unsigned?) Int16 if an object has more than 1 position (so you'll have 2 empty Int16 instead of only 1). The editing box fro this should be pretty simple to code, but I don't know where the draw lists (or load lists for that matter, if they exist) are, so I guess there's not much that can be done.

Edit: Ninja'd by #30 I think.

Better crash 3 scenery entry support

The scenery entry format for crash 3 is nearly identical, except one field was made unsigned instead of signed. Still thinking about how exactly I want to approach this, but it should be easy either way.

New 3D backend

This encompasses a set of features:

  • 3D rendering to the screen
  • 3D rendering to OBJ file
  • 3D rendering to DAE file
  • 3D rendering to any future model export formats

Right now the code for this is all over the place, I want to design a common interface for all of the model formats, and then have a "renderer" for each output format or OpenGL feature-set which will use that one single interface.

The problem is, all of the model formats have varying and unusual requirements. We can ignore textures for now, the vertex and color scheme is complicated enough.

Crash 1 Objects

  • SVTX or CVTX contains:
    • List of vertices (vec3 position, vec3 normal)
    • Reference to TGEO
  • TGEO contains:
    • List of references to TPAG's
    • List of triangles (3 vertex indices, material index)
    • List of materials (vec3 color, texturepage index (from tpag ref list), some kind of texture-mapping data)

Crash 1 Scenery

  • WGEO contains:
    • List of vertices (vec3 position, vec3 color, some kind of texture information)
    • List of texture information?

Crash 2 & 3 Objects

  • per-vertex color...I think?
  • SVTX has ref to TGEO in 2 but not in 3?
  • Vertex or face colors are indexed from a list defined in the TGEO entry

Crash 2 & 3 Scenery

  • WGEO contains:
    • List of vertices (vec3 position, color index)
    • List of triangles (3 vertex indices, material index, some other data???)
    • List of quads (4 vertex indices, material index, some other data???)
    • List of materials (???)
    • List of colors (vec3 color)

So the problem is too many different possibilities:

  • Colors could be:
    • Per-material direct
    • Per-vertex direct
    • Per-vertex indexed
  • Vertices could be:
    • Inside the same entry as the polygons and materials, with no normals
    • Inside a different entry from the polygons and materials, with normals
  • Polygons could be:
    • Triangles only
    • Triangles and quads

I'm working on something now which I think might work for this, but we'll see.

SLST regeneration

Regenerating the SLST entries, needs issue #25. This is absolutely mandatory for some significant things:

  • Moving scenery vertices
  • Adding or removing scenery vertices or polygons
  • Importing scenery from external models (damn this sounds really good)
  • Significant changes in camera path position and pitch/rotation

I'll also need to reverse engineer the exact projection and rotation/scaling/etc the cameras use so I can do this accurately.

This will probably take quite a bit of processing power, so I'm considering OpenCL to allow computing on graphics cards and/or across multiple systems or processors. OpenCL supports CPU-only systems, supposedly, so that's good for compatibility. OpenTK already includes bindings for OpenCL.

Blocked by anti-virus (accidentally)

Most advanced anti-virus programs (AVG, etc.) can detect CrashEdit as a virus, but the anti-virus programs don't delete CrashEdit, just block it from using other files (the DLLs), this causes CrashEdit.exe to just open a crash message whenever you try to open it. This can be fixed by adding the CrashEdit folder to the exceptions list (or disabling your anti-virus before starting it up).

"Show Entire Level" option

There should be some method for opening a 3D view of the entire level, similar to a normal zone viewer.

Chunk free space detection/reporting

Chunks in the UI should show the amount of free space available within them, as well as indicate when they have been over-allocated. Entries should also indicate their size to give some idea of how the user might reorganize to fix packing errors.

Add/change instruments

Replaces or adds a VB file to the game. The appropriate number of chunks should also be automatically made and the wavebank entries should be named whatever the user wants. No more than 7 chunks should be created otherwise it should spit an error saying it's too big.

Separate camera entities from non-camera entities

This would actually simplify a lot of code as well, especially the draw list handling and "duplicate entity" option.

This would also simplify some Entity backend code as well if the cameras were a different class.

Special Japanese file compatibility

CrashEdit is currently completely incompatible with:

  • The VB S000003C.NSF in Crash 3. (Seems to be something with the VB itself maybe.)
  • Speech files inside a Crash 3 level (see S000000B.NSF/Toad Village).

Haven't tested NTSC-J Crash 2, so I'm not aware of the problems in that one.

Better memory management

CrashEdit likes to eat memory, and uses a LOT of memory when seeing zones, and uses even more memory for each frame in an Old Animation Entry (instead of just using the animation that's already loaded). The program eventually crashes at around 350 MB of RAM usage no matter how much free space you've got.

T15 entry support

Texture/image (i.e. loading screen) in Crash 1, collision tree in Crash 2 and 3: "Vcol is a collision tree (crash used video collision). Imag is either a texture block or some kind of display image like the loading screens or other static screens"

"Rename Entry" option

Pretty simple. The real question is, should it also be able to go around and update all of the references to itself to use the new name? Potentially a search-and-replace EID's menu option could be added for that.

Recompute drawlists and loadlists

A warning should show up when saving in case a draw list (any) does not contain an object (with ID, name, at least 1 position, type and subtype). The warning prompts the user to either save anyway or go to draw list(s) in the same zone(s) as said object(s).

Higher compatibility for double-clicking NSFs

Double-clicking an NSF file while a CrashEdit instance is open caused it to open another CrashEdit instance (so you have 2 of them open), this should be optimized so it opens in the currently open exe. If you for some reason have 2 exes open, the last or first one that was initialized should be chosen to avoid confusion.

Rename "T11 Entry" to "Script Entry"

These are the GOOL scripts used by the game objects. Code is a decent enough name and some of them also contain MIPS machine code intermixed with the GOOL.

Minor cosmetic change.

T4 entry support

"SLST" entries, already RE'd out by wurlitzerfox. I'll need to go over his docs in more detail to get a better understanding about how they work.

I'll probably call these Scene List Entries, or something similar to that.

GOOL entry support

Including a disassembler for the known opcodes, plus MIPS. This is a dependency for having a debugger and interpreter, the interpreter then being necessary for a bunch of other features.

Live view of loaded/unloaded entries and chunks

https://github.com/ughman/c2c

Given some more work on c2c, CrashEdit should be able to launch the (external) program directly into the currently opened level, and c2c would report when individual chunks are loaded or unloaded which could then be displayed in the editor.

The next step after this would be live application of level changes to the game while it runs, similar to editing memory in cheat engine, but with the editing capabilities of CrashEdit.

Change music entry settings

Clicking a music entry should show the contents in the first item, such as the location of the VH file and the wavebank entries used.

More streamlined NSF loading and saving

Some kind of thread pool should be used to parse and process chunks as soon as they're read. There's no point in waiting for the entire file read to complete before beginning parsing.

Same thing for saving, may as well start writing as soon as the first chunk is ready.

ErrorManager will need to be thread-safe for loading. Errors while processing should wait for all of the preceding chunks to finish before appearing, so they don't start showing up out-of-order.

New features for version 1.0.0

Not really sure where to post anything, so here it goes.

I've had a fair amount of work done on CrashEdit locally which hasn't been pushed (apparently the version on here is from december of last year? ancient).

I intend to release 1.0.0 at some point, I think this versioning scheme is much better than what I was doing before. I'll probably make a small post on xentax once it's out, but then I'll switch to hpzr.proboards.com to start a thread and announce any further work there. There are certain features I want in before I publish 1.0.0:

  • (done) Reworked graphical interface. This should have a rather small user impact, the interface should be mostly the same because I think it works well for what it is. The entire code within to implement this, though, is going to be majorly modified. This is what's been holding back some other changes I want to make.
  • #58 An undo/redo system. This is absolutely critical. I never made one because I didn't think I could pull it off but now I have some ideas and I'm going to roll with them.
  • #11 A system that will show exactly how much free space is left in a chunk so you can see how much space you need to free. This is really important in solving packing errors.
  • #14 The ability to delete entities.
  • #18 Rename T11Entry to CodeEntry, and EntityEntry to ZoneEntry. I believe there was another renaming I wanted as well. This one is rather minor.
  • #21 Moving OBJ and COLLADA export code into the 3d renderer (or at least all in one place). The model export code suffers from all the different model types having essentially duplicated export code.
  • #22 Support for the other "animation entries" in crash 1 which have a mysteriously different type id. The format is actually identical, or so it seems, so this should be no problem.
  • #24 Better support for crash 3. The object scale issue is already fixed locally, but the scenery code will need to be duplicated and changed to support crash 3's (very slightly) different scenery entry format.

Some other things I want but probably won't make it into this version:

  • #10 Visualizing the collidable parts of a level. I actually already have this implemented locally (though uncommitted) but the performance is absolute garbage.
  • (?) A 3d renderer which can use newer OpenGL features when they're available. It's important that I keep good OpenGL compatibility for pre-2.0, but there are serious performance advantages in using some new features such a VBOs, so those features should be used if they are available. I also fear rendering textures on models may necessitate the use of shaders, and I'm not opposed to requiring shaders for textures and falling back to an inferior quality image if shaders are unavailable. Box and pickup types still need to be differentiatable, though.
  • #17 Automatic regeneration of "draw lists" and "load lists". The game utilizes "draw lists" to detemine which game objects should be present and running. Along each section of a given camera rail is a list of which objects to spawn and despawn when the camera hits the associated points on the rail. These lists need to be regenerated based on where objects are placed in the level. This would also enable box stacking to be implicit rather than careful and complex. Similarly, the "load lists" determine which entries need to be preloaded for upcoming areas. If the data isn't present at the time it's required, the game does a blocking read for the chunk data (waits until it's fully read). On a CD this is extremely slow (could be over a second long without PS2 FDS, unacceptable). __This change would also facilitate an "add entity" command which wouldn't require an object to already exist within the zone (entity entry), and could also allow moving entities between zones.
  • #27 An actually functional "import entry" option. This is necessary for, for example, placing a mask box in Crash Dash or utilizing wireframe boxes in Spaced Out.
  • #29 A GOOL disassembler and editor. This is a pretty big undertaking, but very powerful in the right hands. This is the kind of thing that will allow (sufficiently experienced) people to make their own box types, for example. This would also make it much easier to figure out more on how GOOL works. A debugger would also be nice.
  • #30 Support for crash 1 zone entries. These have a completely different format from the ones in crash 2 and 3, which is why there's no support for them right now.
  • #34 Support for importing music directly from standard MIDI files. Right now importing music involves programs to convert MIDI to SEQ before importing, all of which seem to be proprietary and DOS or Windows only.
  • #32 A barebones MIDI editor built-in. The code to convert MIDI to SEQ will pretty much perfectly match the non-UI code needed for this anyways, and this would be pretty handy.

This doesn't mean 1.0.0 is coming soon, but it is something I intend to happen.

Import/Export Entry

Pretty significant, but also not too difficult, hopefully.

Import needs the rewritten NSD patcher from #23. Export isn't really useful without import.

Moving entries between chunks does nothing?

The bug is simple to reproduce:

  • Make a couple new chunks (any kind).
  • "Overload" a different chunk (make it go over 64KB of data) that is already present (I recommend using big SEQ tracks so you know how much space they use). You won't be able to save (as expected).
  • Move each entry to each chunk you created.
  • You wont be able to save even though the chunk that was over 64KB of data has no entries in it, and the entries that were inside it are inside 1 chunk each (edit: obviusly I used a SEQ that was only about 23KB big).

I'm trying to change Cortex boss fight's music, but it's hard because there's Crash code in the same chunk (which is a big pile of code).

EDIT: This bug only happens when you cause the packing error.

Music entry playback

There should be a music entry player as discussed in issue #32

Could potentially use c2c as the playback engine.

Needs #15

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.