Program Download and Source: Github
By AndrewFM

About

The VOEZ Song Editor allows you to create custom songs/charts for the rhythm game
VOEZ. Created songs can be exported and modded to be playable in the Nintendo Switch version of the game.

You can see some examples of charts that were made with the editor below:

Starting a new Project

In order to start a new project, start by navigating into the ActiveProject folder, and then creating a new subdirectory in there for your song. At minimum you need to place the following file into the folder:
  • The audio file for the song. This should be a .wav or an .ogg file whose name starts with "song_".

Optionally, you can also add any of the following into your subdirectory:
  • A background image for the song. This should be a .png file whose name starts with "image_", and it should be 1024x1024 pixels large.
  • A thumbnail image for the song. This should be a .png file whose name starts with "image_thumbnail", and it should be 256x256 pixels large.
  • A preview track for the song. This should be a .wav or an .ogg file whose name starts with "song_pv", and it should be 20 seconds long.

Note that the length of your "song_" audio file will be the length of your project's song. If you want your song to be shortened, you need to edit the file with an audio editor.



Boot up the program and you should see the song you added in the list of projects. Each project is three beatmaps in one... one for Easy difficulty, one for Hard, and one for Special. Select your song, then select the difficulty that you'd like to start building, and hit 'Edit' to enter the main editor interface.

General Interface and Tools



From left to right, the tools are:
  1. Play/Pause: Resume or pause playback of the song. While the song is paused, the interface enters edit mode. While the song is playing, edit mode is disabled.
    • Keyboard Shortcut: Spacebar
  2. Playback Time: Change the playback speed of the song to make it slower/faster. Useful for calibration and tweaks.
    • Keyboard Shortcuts:
    • 1 Key - 0.25x Playback Speed
    • 2 Key - 0.5x Playback Speed
    • 3 Key - 1.0x Playback Speed
    • 4 Key - 2.0x Playback Speed
  3. Editing Mode: Change which type of note is currently being placed, or change between note editing mode and track editing mode.
    • Keyboard Shortcuts:
    • Z Key - Place Click Notes
    • X Key - Place Slide Notes
    • C Key - Place Swipe Notes
    • V Key - Enter Track Editing Mode
  4. Grid Snapping: Change the grid snapping/time signature used in edit mode. This controls the increments at which notes are placed, and the increments at which the tracks are scrolled. Anything time related in the interface and edit mode is snapped to this grid.
    • Keyboard Shortcuts:
    • Shift + 1 Key: Turn off the Grid
    • Shift + 2 Key: 16 Beats per Measure
    • Shift + 3 Key: 12 Beats Per Measure
    • Shift + 4 Key: 8 Beats Per Measure
    • Shift + 5 Key: 6 Beats Per Measure
    • Shift + 6 Key: 4 Beats Per Measure
    • Shift + 7 Key: 3 Beats Per Measure
    • Shift + 8 Key: 2 Beats Per Measure
    • Shift + 9 Key: 1 Beat Per Measure
  5. Scroll Speed: Change the speed at which the notes scroll down along the tracks. This is a visual change only, it does not affect the timings of the song at all.
  6. Audio Assistance: Provides a few audio guide tools:
    • Metronome: When this is enabled, a click will be heard every time one beat elapses.
    • Hit Sounds: When this is enabled, a sound will play whenever a note on a track intersects with the play line.
    • Note Quantization: Colors the click notes different colors depending if they fall on-beat, on half-beat, on quarter-beat, etc.
  7. Beats Per Minute: Adjusts the BPM value for the song. If this value is not correct, then the time signature grid (and thus, the notes you place) will be out of sync with the beats in the song. Calibrating this value is the very first thing you should do before starting creating a beatmap for your song. Performing this calibration is explained in the next section.
  8. Save: Saves all of your edits to disk. Note that this will overwrite your previous save files every time. If you want to keep periodic backups, you'll need to manually backup the ActiveProjects folder from time to time.
  9. Scrubber: This bar shows the current playback progress through the song, and allows you to navigate to any time in the song by clicking and dragging the scrubber.
    • Loop Point: You can right-click the scrubber to set a loop point at its current location. Once the loop point is placed, the scrubber can be jumped back to that position at any point by pressing the Enter key, or by pressing the Middle Mouse Button, or by right-clicking the Play button.
    • While the song is paused, you can use the Arrow Keys/WASD keys, or the Scroll Wheel on the mouse to frame advance/rewind the scrubber. Hold down the Shift key to advance the time at a faster rate.
  10. Timer: The current song time. The number on top is the time in seconds, the number on bottom in parentheses is the cumulative beat count.

Setting the BPM

Click on the BPM button to enable BPM editing mode. While active you can use the Scroll Wheel on the mouse, or the Arrow Keys/WASD Keys to edit the value of the BPM. Hold down the Shift key to scroll the value at a faster pace. (This is the standard control scheme for editing any numeric values in the editor)

While BPM editing mode is enabled, if you start playing the song, the screen will pulse at the current BPM rate that you have set. Adjust the BPM value until the pulsing rate is perfectly in sync with the music. The playback speed options and the metronome can be helpful with this calibration.

When done, click the BPM button again to exit BPM editing mode.

Track Editing Mode



Track Editing mode allows for the adding, deleting, and editing of tracks, which are the vertical columns that notes scroll over.
  • To add a new track, hold down the Left Mouse Button while also keeping the Shift key held down through the whole process. A pending track will appear over the mouse's position (in the screenshot above, the red track in the middle is the pending track, while the others are actual tracks that had previously been added). Drag the pending track to the position you want it to be located at, then let go of the left mouse button to finalize its position and add the actual track.
  • To delete a track, press the Delete button while hovering over a track, or right click on a track while also holding down the shift key. If you try to delete a track that currently has notes at it, the warning below will be displayed. Be very careful as the editor does NOT have an undo feature. Anything you delete cannot be recovered.

Once you have tracks placed down, they need to be configured to adjust their duration, animations, etc... to begin editing the properties of a specific track, left click on it to bring up the track edit window:

The track window is divided up into three different tabs, each of which looks and behaves the same. These tabs are switched between using the three buttons at the top left of the window. Each tab is used to modify a different attribute about the track... from left to right, they are Position, Scale, and Color.

Use the left mouse button on the different fields in the window to select them from editing. Each tab has three main values:
  • Spawn Time: The time at which the track will first spawn.
  • Despawn Time: The time at which the track will disappear.
  • Value: The base value the track will have when it is first spawned, for the current tab:
    • Position: A value between 0% and 100%, where 0% is the far left side of the screen, and 100% is the far right side of the screen. Note that when editing postion values, you can hold the Right Mouse Button to snap the track to the mouse cursor and drag and drop it to the desired position, instead of trying to set the numerical value manually.
    • Scale: The width of the track. 2.0x will be double the typical width, 0.5x will be half, etc. Note that when editing scale values, you can hold the Right Mouse Button to drag the track to the desired width, instead of trying to set the numerical value manually.
    • Color: The color of the track. VOEZ has 10 different base colors to choose between.

All three of these value types can be animated over time. This is the purpose of the Keyframes section of this editing window. Each keyframe defines a new value to animate towards, the time the animation should start, the time the animation should end, and the transition style between the two values. Note that the value in a keyframe is the value the track will be at once it reaches the End time of the keyframe.

The buttons at the bottom of the window are used for working with the keyframes. From left to right, they are:
  1. Previous Page: Navigation for when you have multiple pages worth of keyframes.
  2. Next Page: Navigation for when you have multiple pages worth of keyframes.
  3. Add: Adds a new keyframe. By default it will add a new keyframe after the currently selected keyframe. You can hold the Shift key to instead add the new keyframe before the currently selected keyframe. Note that keyframe times cannot overlap, and they cannot exceed the spawn/despawn bounds of the track. The window will not allow you to add a keyframe if there is no empty time gap in the spot you're trying to add it, so adjust the start/end times of the keyframes to make room for a new one if you run into this problem.
  4. Delete: Deletes the selected keyframe.
  5. Copy: Copies ALL keyframes in this tab to the program's clipboard.
  6. Paste: Pastes the list of copied keyframes. This will not append the keyframes to the list, it will overwrite the whole list with the pasted contents. Also note that each tab has its own clipboard, so if for example, you copy keyframes from the Position tab, you can only paste in into another Position tab.
  7. Mirror: This button only exists for the Positions tab. Clicking it will mirror the track's position and mirror all of its keyframes' positions so the track is on the opposite side of the screen. You can use this option to help make symmetric animations. If you hold the Shift key, then only the selected keyframe will be mirrored, rather than all the keyframes.
Tip: You can hold the Ctrl key while ajdusting the track's start/end time to shift the time of the entire track, all its keyframes, and all attached notes simultaneously. Likewise, if you hold the Ctrl key when editing a keyframe's start/end time, it will simultaneously shift the time of all keyframes that come after it as well.

Note Editing Mode



Set the Editing Mode selection to any of the other options other than track, to enter note editing mode. This mode allows for the adding, deleting, and editing of notes onto any of the tracks you've placed down.
  • To add a new note, hover you mouse over any of the tracks, and a ghost image of the note will appear. Left Click to place the note down.
  • To delete a note, press the Delete button while hovering over a note, or Right Click on the note.
To edit the attributes of a placed note, hover over it with the mouse, and left click it. The following window will open:



The three buttons on the top will change which type of note this is. The value fields below will change attributes about the note:
  • Spawn Time: The time in the song when this note needs to be tapped/swiped by the player.
  • Hold Duration: Only available for click notes. If this is set to a value other than 0, then the click note becomes a hold note. If you want to make a hold note that moves around, you need to keyframe the track's position. See the previous section on track editing above.
  • Direction: Only available for swipe notes. Lets you select whether it should be swiped to the left, or swiped to the right.

Editing Song Info

After saving your song at least once, navigate back to your project's subdirectory on your harddrive, and there will be a new file called "info_song.json". Open this file up in a text editor to edit the information about your song:
{
	"info":{
		"version":"1.04",
		"name":"The Song Name",
		"author":"The Author",
		"bpm":155,
	}
	,"level":{
		"easy":1,
		"hard":1,
		"extra":1
	}
}
  • version: This is the version of the editor your song was last edited with. Don't modify the value of this.
  • name: The title of the song. Make sure the name is between double quotes, as shown.
  • author: The author of the song. Make sure the name is between double quotes, as shown.
  • bpm: The BPM value of your song. Best to use the in-editor tools to properly calibrate this value.
  • easy: The level of the song on Easy mode. Set this to any whole number greater than zero.
  • hard: The level of the song on Hard mode. Set this to any whole number greater than zero.
  • extra: The level of the song on Special mode. Set this to any whole number greater than zero.

Exporting to Nintendo Switch: What you will need

  • Unity 5.5.0p1
  • A Hex Editor
  • A Nintendo Switch with a CFW running LayeredFS
  • VOEZ for the Nintendo Switch (obviously)
  • Your project files outputted by the Song Editor

Setting up the Asset Bundler

Create a new 2D Unity project. In the Project window, add the following three folders to your project's Assets:
  • assetbundle
  • AssetBundles
  • Editor
Inside the Editor folder create a new C# Script called CreateAssetBundles. Its contents should be:

	using UnityEditor;

	public class CreateAssetBundles {
	    [MenuItem("Assets/Build AssetBundles")]
	    static void BuildAllAssetBundles()
	    {
	        BuildPipeline.BuildAssetBundles("Assets/AssetBundles", BuildAssetBundleOptions.UncompressedAssetBundle, BuildTarget.StandaloneWindows);
	    }
	}
Inside the assetbundle folder, create another folder called songs.

That's it. This is a one-time setup, and you can reuse this Unity Project from now on for exporting any future tracks that you create.

Bundling a Track Mod

Create a new folder for your song inside of the assetbundle/songs folder. The name of this folder can be anything, though keep it all lowercase, no spaces, no special characters, just letters and numbers. Remember the name of the folder because you will need to reuse it several times later.

Populate this new folder with your project files. It should contain all of the following files, named and formatted exactly as described:
  • image_regular.png: A 1024x1024 background image for your song.
  • image_blur.png: The same image as above, resized to 256x256, and blurred.
  • image_thumbnail.png: A 256x256 image used for the icon thumbnail in the song select menu.
  • song_full.mp3: The full music track for your song.
  • song_pv.mp3: A preview music track for your song, exactly 20 seconds long, for use in the song select menu.
  • note_easy.json: Notes definitions for your song, exported by the Song Editor. For Easy mode.
  • note_hard.json: Notes definitions for your song, exported by the Song Editor. For Hard mode.
  • note_extra.json: Notes definitions for your song, exported by the Song Editor. For Special mode.
  • track_easy.json: Tracks definitions for your song, exported by the Song Editor. For Easy mode.
  • track_hard.json: Tracks definitions for your song, exported by the Song Editor. For Hard mode.
  • track_extra.json: Tracks definitions for your song, exported by the Song Editor. For Special mode.
Since your music files are likely in wav/ogg format for use with the song editor, you can use a program like
Audacity to convert them to mp3 for use with the game.

For the image_blur file, change the import settings in the Inspector to match the following (otherwise the blurred image will look pixelated in-game):



For all other files, the import settings can be left as the defaults.

Once all of the project files are there, select all of them in the Project window, and at the bottom of the Inspector, you will see a dropdown called "AssetBundle". From that dropdown box, select New..., then name the new AssetBundle songs/XXXX, where XXXX is the same name as the folder you created for your project files.

Once everything is done succesfully, your setup should be looking something like this:



From the menu options at the top of the Unity Window, select "Assets > Build AssetBundles". Once this process finishes running, the bundle for your project files will be available in the AssetBundles/songs folder. The bundle file is the one that's named the same as the project folder you created. It won't have any file extension, so rename it to add the extention ".assetbundle" onto the file. Then open the file up in your hex editor:



You want to look for the part of the file that has the second occurance of the unity version number (5.5.0p1, highlighted in green in the image above), and find the value located two bytes after the version number (0x05, highlighted in red in the image above). Change that value from 05 to 26. Then save the file.

All done. Your project is bundled and ready to be put onto the Nintendo Switch.

Deploying the Track Mod

In your titles folder for LayeredFS on the microSD card for your Switch, create the following directory structure:

0100A7F002830000/romfs/Data/StreamingAssets/songs2.0

The 2.0 at the end of the folder name denotes the version number that your songs will be categorized under if you sort by version in the game's song menu. It helps to have all your custom songs in their own category so you can find them easily. You can change that number to something else, but just don't use one of the actual version numbers from the original game, otherwise you'll overwrite the entire song list for that version.

Inside that songs folder, place the .assetbundle file you bundled for your project. Additionally, in that folder you need to have a song_asset_list.json file. That is a listing of all the songs that will be listed under that version category.
Click here to download an example song_asset_list.json file to use as your base.

Open the song_asset_list.json file in a text editor, and add your new song as an entry in the list. The song_asset_list.json file downloaded above has two placeholder entries in it, just to illustrate the format and structure of the file. You should remove/replace those with your song(s). Your entry should look like:

{
  "info": {
    "author": "Song Author",
    "bpm": 120,
    "id": "XXXX",
    "name": "Song Name"
  },
  "level": {
    "hard": 7,
    "easy": 1,
    "extra": 10
  }
}
The values to put here can be taken from the info.json file outputted by the Song Editor for your project. The only additional piece of information is the "id" field, which should be set to have the same name as your assetbundle.

That's it. Now start-up/restart VOEZ on your Switch with LayeredFS, and you should find your song in the songs list.

Tip: Install ftpd on your Switch, and use a FTP client like WinSCP or Filezilla on your computer. With those, you can transfer files to the MicroSD card on your Switch over Wi-Fi, instead of having to turn off the console and eject the card every time you want to add/modify the files.