techmania-docs

Documentations of TECHMANIA projects, hosted in a repo so they can be localized.


Project maintained by techmania-team Hosted on GitHub Pages — Theme by mattgraham

Applies to version: 2.3

This page explains the specification of TECHMANIA’s .tech format for tracks.

If you are working on applications to parse, manipulate or convert .tech files, consider doing it in C# so you can include Track.cs and call Track.Serialize and Track.Deserialize, making it unnecessary to read the following.

track.tech

{
	"version": "3",
	"trackMetadata": {
		"guid": <guid>,
		"title": <title>,
		"artist": <artist>,
		"genre": <genre>,
		"additionalCredits": <additional credits>,
		"eyecatchImage": <filename of eyecatch image>,
		"previewTrack": <filename of preview track>,
		"previewStartTime": <preview start time>,
		"previewEndTime": <preview end time>,
		"previewBga", <filename of preview BGA>,
		"autoOrderPatterns": <true or false>
	},
	"patterns": [
		<pattern 1>,
		<pattern 2>,
		<...>,
		<pattern n>
	]
}

Pattern

		{
			"patternMetadata": {
				"guid": <guid>,
				"patternName": <pattern name>,
				"level": <level>,
				"controlScheme": <control scheme>,
				"playableLanes": <playable lanes>,
				"author": <pattern author>,
				"backingTrack": <filename of backing track>,
				"backImage": <filename of background image>,
				"bga": <filename of BGA>,
				"bgaOffset": <BGA offset>,
				"waitForEndOfBga": <wait for end of BGA>,
				"playBgaOnLoop": <play BGA on loop>,
				"firstBeatOffset": <first beat offset>,
				"initBpm": <initial BPM>,
				"bps": <Beats Per Scan>
			},
			"legacyRulesetOverride": {
				"timeWindows": <time windows>,
				"hpDeltaBasic": <HP delta>,
				"hpDeltaChain": <HP delta>,
				"hpDeltaHold": <HP delta>,
				"hpDeltaDrag": <HP delta>,
				"hpDeltaRepeat": <HP delta>,
				"hpDeltaBasicDuringFever": <HP delta>,
				"hpDeltaChainDuringFever": <HP delta>,
				"hpDeltaHoldDuringFever": <HP delta>,
				"hpDeltaDragDuringFever": <HP delta>,
				"hpDeltaRepeatDuringFever": <HP delta>
			},
			"bpmEvents": [
				<BPM event 1>,
				<...>,
				<BPM event n>
			],
			"timeStops": [
				<time stop 1>,
				<...>,
				<time stop n>
			],
			"packedNotes": [
				<note 1>,
				<...>,
				<note n>
			],
			"packedHoldNotes": [
				<hold note 1>,
				<...>,
				<hold note n>
			],
			"packedDragNotes": [
				<drag note 1>,
				<...>,
				<drag note n>
			]
		}

BPM event

				{
					"pulse": <pulse>,
					"bpm": <bpm>
				}

Time stop

				{
					"pulse": <pulse>,
					"duration": <duration>
				},

Note

The packedNotes section covers all note types without a duration: Basic, Chain Head, Chain Node, Repeat Head, and Repeat. Each note is represented as a string in one of the following two formats:

Which format to use depends on whether the note has default values on volume, pan and end-of-scan:

If any of these values are different from default, that note will use the 2nd format. “E” stands for “Extended”.

Other notes:

Hold note

The packedHoldNotes section covers notes of type Hold, Repeat Head Hold and Repeat Hold. Each note is represented as a string in one of the following two formats:

Similar to the previous section, a note will use the 2nd format if its volume, pan or end-of-scan value is different from default.

Other notes:

Drag note

This section covers all drag notes. Each drag note is represented as the following structure:

				{
					"packedNote": <drag note>,
					"packedNodes": [
						<drag node 1>,
						<...>,
						<drag node n>
					]
				}

The packedNote part is a string in one of the two following formats:

curve type is 0 for Bézier, 1 for B-spline, and the default is 0.

Similar to the previous section, a note will use the 2nd format if its volume, pan or curve type value is different from default.

Each drag note must contain at least 2 nodes. Each drag node consists of 1 anchor and 2 control points, and is represented as a string in the following format:

<anchor pulse>|<anchor lane>|<left control point pulse>|<left control point lane>|<right control point pulse>|<right control point lane>

All values are floating point numbers. The anchor’s pulse and lane is relative to the note head; the control points’ pulse and lane are relative to the anchor. Additionally, the first node is always located at the note head, so its pulse and lane are both 0, and its left control point is ignored; the right control point on the last node is also ignored.