The Thirty Dollar Save File - t1stm/ThirtyDollarTools GitHub Wiki
Starting off
You have created something on the Thirty Dollar Website and want to save it. You head to the bottom of the page and click on the Save or Save As buttons, and get a text file containing the save. Out of curiosity you open it with Notepad or any other kind of text editor and see this.
!speed@177|!speed@4@x|!volume@100|!divider
|_pause=4|!divider
|!bg@#ef3325,1|!target@2|!divider
|adofaikick|!combine|hammer|!combine|adofaicymbal|!combine|ride2|!combine|๐ธ@1|!combine|mariopaint_flower@1|!combine|mariopaint_luigi@-19%22.5|!combine|mariopaint_luigi@-16%22.5|mariopaint_flower@0|mariopaint_flower@1|!cut|mariopaint_flower@3|mariopaint_flower@1|_pause=2|_pause|!jump@2|!divider
|adofaikick|!combine|hammer|!combine|adofaicymbal|!combine|ride2|!combine|๐ธ@1|!combine|mariopaint_flower@13|!combine|mariopaint_luigi@-17%22.5|!combine|mariopaint_luigi@-14%22.5|_pause|mariopaint_flower@11|_pause|mariopaint_flower@8|_pause|mariopaint_flower@5|_pause|mariopaint_flower@1|_pause|hammer|!combine|๐ธ@-1|_pause|hammer|!combine|๐ธ@-2|!combine|mariopaint_luigi@-17%22.5|!combine|mariopaint_luigi@-14%22.5|!combine|mariopaint_flower@1|_pause|!speed@2@x|hammer|!combine|๐ธ@-3|mariopaint_flower@3|mariopaint_flower@4|mariopaint_flower@5|[email protected]@x|!divider
Explanation
The "code" you just saw is a snippet of my first serious TDW cover without any custom formatting. This wiki page will explain everything that the Thirty Dollar Website can read, and play. I'll use this snippet to explain everything down below, so if you ever wonder what something came from, it's from the snippet above.
Types of Events
In the Thirty Dollar Website there are two types of "events" which it can process. The website defines them as:
- Sound
- Action
These events also have special values after them that change their behavior. In the Thirty Dollar Website Save Format, all events are separated with the pipe: | symbol.
Additional values.
Almost every sound / action in the Thirty Dollar Website has unique values that are saved alongside it. The event and the value are separated with the @ character: sound@1. Some events also have a second @ character to further specify the scaling method they use. The Thirty Dollar Website only supports addition @3@+ / @-3@+ and multiplication @3@x.
I'll now explain in detail the two types of events and their parameters.
The Sound Event
As its name suggests, this event plays a sound on the Thirty Dollar Website. The Thirty Dollar Website uses a JSON file to store the information about the sounds it has. The file can be found here: Thirty Dollar Website Sounds JSON. Any change in this JSON file will be immediately reflected in the website, when its cache expires. I'll now show an edited snippet of the JSON file from 28th April 2024:
[
{ "id": "_pause", "img": "empty", "name": "Silence", "source": "", "tags": ["note", "percussion"] },
{ "id": "boom", "name": "Vine Boom", "source": "", "tags": ["percussion"] },
{ "id": "bruh", "name": "Bruh Sound Effect #2", "source": "" },
{ "id": "bong", "name": "Bong", "source": "Taco Bell", "tags": ["note"] },
{ "id": "skeleton", "emoji": "๐", "name": "Skeleton", "source": "Minecraft" },
{ "id": "clap", "emoji": "๐", "name": "Reverb Clap", "source": "Rhythm Doctor", "tags": ["percussion"] },
{ "id": "dog", "emoji": "๐ถ", "name": "what the dog doin", "source": "TonyBakerComedy" },
{ "id": "cave", "emoji": "๐ฝ", "name": "Cave Noise", "source": "Minecraft" },
{ "id": "dodgeball", "name": "Dodgeball", "source": "", "tags": ["percussion"] },
{ "id": "whipcrack", "name": "Whip Crack", "source": "", "tags": ["percussion"] },
{ "id": "boowomp", "name": "Boowomp", "source": "SpongeBob SquarePants" },
{ "id": "taiko_don", "name": "Don", "source": "Taiko no Tatsujin", "tags": ["percussion"] },
{ "id": "taiko_ka", "name": "Ka", "source": "Taiko no Tatsujin", "tags": ["percussion"] },
{ "id": "puyo", "name": "Puyo", "source": "Puyo Puyo", "tags": ["note"] },
{ "id": "robtopphone", "name": "Xylophone", "source": "", "tags": ["note"] },
{ "id": "waterphone", "emoji": "๐ป", "name": "Waterphone", "source": "Hell's Kitchen" },
{ "id": "slapbass", "emoji": "๐ธ", "name": "Slap Bass", "source": "", "tags": ["note"] },
{ "id": "dimrainsynth", "name": "Synth", "source": "", "tags": ["note"] },
{ "id": "hoenn", "name": "Hoenn Trumpet", "source": "Pokรฉmon", "tags": ["note"] },
{ "id": "zunpet", "emoji": "๐บ", "name": "ZUNpet", "source": "Touhou", "tags": ["note"] },
]
In the JSON file you can see two fields, which are important for the save format. The "id" and "emoji". In the save format, sounds with emojis are stored using their designated emoji: |๐ธ|. You can also notice that some sounds don't have an emoji representing them. In that case they are stored in the save file with their id: |mariopaint_flower|
Sound Values
The @ value
In the sequence snippet I showed you at the start, you can see many sounds like this one: |๐ธ@-1|
For all sounds the @ value represents the pitch up/down. The pitch up / down percent is calculated with this formula: (value / 12)^2.
The % value
Following the @ value you can also see some sounds like this one too: |mariopaint_luigi@-14%22.5|
The % value here represents the sound's individual volume. When played, the sounds takes in the global volume and multiplies it by its (individual volume / 100). final_volume = global_volume * (individual_volume / 100)
The = value
A sound can also have = as a value which looks like this: |_pause=4|. When this value is set, the sound is played as many times as specified.
The ^ value / Pan Modifier
Added in the 8 Aug 2025 update to the TDW beta, this modifier pans the audio of the sample for the left and right channels. It uses the ^ "caret" symbol.
Values
It accepts values from -100 (100% left - 0% right) to 100 (100% right - 0% left), and by default it's set to 0 (equal audio on both channels) on all events. Here's an example on how to use it.
Usage
boom@1%150^1| # a boom pitched 1 semitone up, with a volume of 150% playing only on the right channel |
boom@1%150^-1| # a boom pitched 1 semitone up, with a volume of 150% playing only on the left channel |
boom@-1%120^0.8| # a boom pitched 1 semitone down, with a volume of 120% mostly audible on the right channel, but can be still heard from the left channel|
boom@-1%120^-0.8| # a boom pitched 1 semitone down, with a volume of 120% mostly audible on the left channel, but can be still heard from the right channel|
Behavior
A sound event always takes up one beat unless if it's followed by a |!combine| action. When a |!combine| action is used the sound doesn't increment the placement timer and the next sound is played at the same time. Here's an example where all sounds play at the same time:
|๐ธ@1|!combine|mariopaint_flower@1|!combine|mariopaint_luigi@-19%22.5|
The Action Event
These events affect playback in other ways. Some actions only affect the playback visually, and will be in another category.
The Combine Action
It's saved like this: |!combine|. By itself it doesn't do anything and multiple uses of it, won't make a difference. It makes a sound that has |!combine| after it to not change the placement timer.
The Stop Action
It's saved like this: |!stop@4| / |[email protected]| / |!stop@n|. When called, it makes it so that the next sound is played after n beats.
It should be noted that if the sound before the stop action isn't with a combine tag, it will still add 1 beat to the timing.
The Loop Once Action
It's saved like this: |!loop|. It goes to the last seen Loop Target Action |!looptarget|, on the same beat as it's called. This action ignores all values passed to it.
The Loop Many Action
It's saved like this: |!loopmany@3|. Same as the loop once action, but repeats that multiple times. In this case it repeats three times.
The Go To Target / Jump To Action
It's saved like this: |!jump@3|. It jumps to a given jump target |!target@3|, on the same beat.
The Cut Action
It's saved like this: |!cut| |!cut@boom|. Stops all currently playing sounds. It also optionally accepts a sound as its value to only cut that sound in the sequence.
The Transpose Action
It's saved like this: |!transpose@1| |!transpose@2@+| |!transpose@3@x|. Changes the pitch of all next sounds by a value with an optional scaling method.
The Set Tempo / Set BPM Action
It's saved like this: |!speed@330| |!speed@50@+| |!speed@2@x| |!speed@3@/|. Changes the BPM (Beats Per Minute) calculation for the next sound. Accepts an optional scaling method.
The Set Volume Action
It's saved like this: |!volume@90| |!volume@50@+| |[email protected]@x|. Immediately changes the global volume for all next sounds.
The Start Position Action
It's saved like this: |!startpos|. Sets the starting position of the sequence to its current position.
Visual Actions
The Flash Action
It's saved like this: |!flash|. It briefly flashes the screen white. It doesn't read any values.
The Background Action
It's saved like this: |!bg@#abacad,1|. Changes the background color after a given time. The format is the color you want to change to in hex, separated by a comma and then the time in seconds the change will take to complete.
The Pulse Action
It's saved like this: |!pulse@1,1| |!pulse@x,y|. Quickly zooms in and out the screen for x times, with y frequency in beats.
The Divider Action
It's saved like this: |!divider or |!divider | when there are events after the divider. All events after it are placed on a new line.