diff --git a/include/Application.h b/include/Application.h
new file mode 100644
index 0000000..b3a0622
--- /dev/null
+++ b/include/Application.h
@@ -0,0 +1,14 @@
+#pragma once
+
+#include "common.h"
+
+namespace DawProject
+{
+/* Metadata about the application which saved the DAWPROJECT file. */
+struct Application
+{
+ std::string name; // Name of the application.
+ std::string version; // Version number of the application.
+};
+} // namespace DawProject
+
diff --git a/include/Arrangement.h b/include/Arrangement.h
new file mode 100644
index 0000000..814a308
--- /dev/null
+++ b/include/Arrangement.h
@@ -0,0 +1,33 @@
+#pragma once
+
+#include "common.h"
+#include "Lanes.h"
+#include "Markers.h"
+#include "Points.h"
+
+namespace DawProject
+{
+/* Represents the main Arrangement timeline of a DAW. */
+struct Arrangement
+{
+ /* Automation data for time-signature inside this Arrangement.
+
+ <Arrangement>
+ <TimeSignatureAutomation target="id-of-TimeSignatureParameter" ... >
+ <TimeSignaturePoint time="0" numerator="7", denominator="8"/>
+ <TimeSignaturePoint time="21" numerator="4", denominator="4"/>
+ ...
+ </TimeSignatureAutomation>
+ </Arrangement>
+
*/
+ std::optional timeSignatureAutomation;
+ /* Automation data for tempo inside this Arrangement, which will define the conversion between seconds and beats
+ at the root level. */
+ std::optional tempoAutomation;
+ std::optional markers; // Cue markers inside this arrangement
+ /* The lanes of this arrangement. Generally this would contain another Lanes timeline for (and scoped to) each
+ track which would then contain all Note, Audio, and Automation timelines. */
+ std::optional lanes;
+};
+} // namespace DawProject
+
diff --git a/include/AuPlugin.h b/include/AuPlugin.h
new file mode 100644
index 0000000..471e52d
--- /dev/null
+++ b/include/AuPlugin.h
@@ -0,0 +1,13 @@
+#pragma once
+
+#include "common.h"
+#include "Plugin.h"
+
+namespace DawProject
+{
+struct AuPlugin
+ : public Plugin
+{
+};
+} // namespace DawProject
+
diff --git a/include/Audio.h b/include/Audio.h
new file mode 100644
index 0000000..d14eeb6
--- /dev/null
+++ b/include/Audio.h
@@ -0,0 +1,16 @@
+#pragma once
+
+#include "common.h"
+#include "MediaFile.h"
+
+namespace DawProject
+{
+struct Audio
+ : public MediaFile
+{
+ int sampleRate;
+ int channels;
+ std::optional algorithm;
+};
+} // namespace DawProject
+
diff --git a/include/AutomationTarget.h b/include/AutomationTarget.h
new file mode 100644
index 0000000..4831eea
--- /dev/null
+++ b/include/AutomationTarget.h
@@ -0,0 +1,18 @@
+#pragma once
+
+#include "common.h"
+
+namespace DawProject
+{
+struct Parameter;
+
+struct AutomationTarget
+{
+ Parameter* parameter;
+ std::optional expression;
+ std::optional channel;
+ std::optional key;
+ std::optional controller;
+};
+} // namespace DawProject
+
diff --git a/include/BoolParameter.h b/include/BoolParameter.h
new file mode 100644
index 0000000..4f371f2
--- /dev/null
+++ b/include/BoolParameter.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#include "common.h"
+#include "Parameter.h"
+
+namespace DawProject
+{
+/* Represents a parameter which can provide a boolean (true/false) value and be used as an automation target. */
+struct BoolParameter
+ : public Parameter
+{
+ std::optional value; // Boolean value for this parameter.
+};
+} // namespace DawProject
+
diff --git a/include/BoolPoint.h b/include/BoolPoint.h
new file mode 100644
index 0000000..e4f0502
--- /dev/null
+++ b/include/BoolPoint.h
@@ -0,0 +1,14 @@
+#pragma once
+
+#include "common.h"
+#include "Point.h"
+
+namespace DawProject
+{
+struct BoolPoint
+ : public Point
+{
+ bool value;
+};
+} // namespace DawProject
+
diff --git a/include/BuiltinDevice.h b/include/BuiltinDevice.h
new file mode 100644
index 0000000..edf21e4
--- /dev/null
+++ b/include/BuiltinDevice.h
@@ -0,0 +1,13 @@
+#pragma once
+
+#include "common.h"
+#include "Device.h"
+
+namespace DawProject
+{
+struct BuiltinDevice
+ : public Device
+{
+};
+} // namespace DawProject
+
diff --git a/include/Channel.h b/include/Channel.h
new file mode 100644
index 0000000..01d7887
--- /dev/null
+++ b/include/Channel.h
@@ -0,0 +1,29 @@
+#pragma once
+
+#include "common.h"
+#include "Lane.h"
+#include "Send.h"
+#include "BoolParameter.h"
+#include "RealParameter.h"
+#include "Device.h"
+
+namespace DawProject
+{
+/* Represents a mixer channel. It provides the ability to route signals to other channels and can contain
+ Device/Plug-in for processing. */
+struct Channel
+ : public Lane
+{
+ std::optional role; // Role of this channel in the mixer.
+ /* Number of audio-channels of this mixer channel. (1=mono, 2=stereo…) */
+ std::optional audioChannels;
+ std::optional volume; // Channel volume
+ std::optional pan; // Channel pan/balance
+ std::optional mute; // Channel mute
+ std::optional solo; // Channel solo
+ Channel* destination; // Output channel routing
+ std::vector sends; // Send levels & destination
+ std::vector devices; // Devices & plug-ins of this channel
+};
+} // namespace DawProject
+
diff --git a/include/ClapPlugin.h b/include/ClapPlugin.h
new file mode 100644
index 0000000..a8af47e
--- /dev/null
+++ b/include/ClapPlugin.h
@@ -0,0 +1,13 @@
+#pragma once
+
+#include "common.h"
+#include "Plugin.h"
+
+namespace DawProject
+{
+struct ClapPlugin
+ : public Plugin
+{
+};
+} // namespace DawProject
+
diff --git a/include/Clip.h b/include/Clip.h
new file mode 100644
index 0000000..4a4ddd1
--- /dev/null
+++ b/include/Clip.h
@@ -0,0 +1,26 @@
+#pragma once
+
+#include "common.h"
+#include "Nameable.h"
+#include "Timeline.h"
+
+namespace DawProject
+{
+struct Clip
+ : public Nameable
+{
+ double time;
+ std::optional duration;
+ std::optional contentTimeUnit;
+ std::optional playStart;
+ std::optional playStop;
+ std::optional loopStart;
+ std::optional loopEnd;
+ std::optional fadeTimeUnit;
+ std::optional fadeInTime;
+ std::optional fadeOutTime;
+ std::optional content;
+ Timeline* reference;
+};
+} // namespace DawProject
+
diff --git a/include/ClipSlot.h b/include/ClipSlot.h
new file mode 100644
index 0000000..7b606d3
--- /dev/null
+++ b/include/ClipSlot.h
@@ -0,0 +1,16 @@
+#pragma once
+
+#include "common.h"
+#include "Timeline.h"
+#include "Clip.h"
+
+namespace DawProject
+{
+struct ClipSlot
+ : public Timeline
+{
+ std::optional hasStop;
+ std::optional clip;
+};
+} // namespace DawProject
+
diff --git a/include/Clips.h b/include/Clips.h
new file mode 100644
index 0000000..af61b9e
--- /dev/null
+++ b/include/Clips.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#include "common.h"
+#include "Timeline.h"
+#include "Clip.h"
+
+namespace DawProject
+{
+struct Clips
+ : public Timeline
+{
+ std::vector clips;
+};
+} // namespace DawProject
+
diff --git a/include/Compressor.h b/include/Compressor.h
new file mode 100644
index 0000000..83a0e66
--- /dev/null
+++ b/include/Compressor.h
@@ -0,0 +1,22 @@
+#pragma once
+
+#include "common.h"
+#include "BuiltinDevice.h"
+#include "BoolParameter.h"
+#include "RealParameter.h"
+
+namespace DawProject
+{
+struct Compressor
+ : public BuiltinDevice
+{
+ std::optional threshold;
+ std::optional ratio;
+ std::optional attack;
+ std::optional release;
+ std::optional inputGain;
+ std::optional outputGain;
+ std::optional autoMakeup;
+};
+} // namespace DawProject
+
diff --git a/include/Device.h b/include/Device.h
new file mode 100644
index 0000000..5835ef1
--- /dev/null
+++ b/include/Device.h
@@ -0,0 +1,22 @@
+#pragma once
+
+#include "common.h"
+#include "FileReference.h"
+#include "Parameter.h"
+#include "BoolParameter.h"
+
+namespace DawProject
+{
+struct Device
+{
+ std::optional enabled;
+ DeviceRole deviceRole;
+ std::optional loaded;
+ std::string deviceName;
+ std::optional deviceID;
+ std::optional deviceVendor;
+ std::optional state;
+ std::vector automatedParameters;
+};
+} // namespace DawProject
+
diff --git a/include/EnumParameter.h b/include/EnumParameter.h
new file mode 100644
index 0000000..d8cb462
--- /dev/null
+++ b/include/EnumParameter.h
@@ -0,0 +1,18 @@
+#pragma once
+
+#include "common.h"
+#include "Parameter.h"
+
+namespace DawProject
+{
+/* Represents an enumerated parameter which can provide a value and be used as an automation target. */
+struct EnumParameter
+ : public Parameter
+{
+ std::optional value; // Index of the enum value.
+ /* Number of entries in enum value. value will be in the range [0 .. count-1]. */
+ int count;
+ std::vector labels; // Labels of the individual enum values.
+};
+} // namespace DawProject
+
diff --git a/include/EnumPoint.h b/include/EnumPoint.h
new file mode 100644
index 0000000..ae5d028
--- /dev/null
+++ b/include/EnumPoint.h
@@ -0,0 +1,14 @@
+#pragma once
+
+#include "common.h"
+#include "Point.h"
+
+namespace DawProject
+{
+struct EnumPoint
+ : public Point
+{
+ int value;
+};
+} // namespace DawProject
+
diff --git a/include/EqBand.h b/include/EqBand.h
new file mode 100644
index 0000000..8fbed96
--- /dev/null
+++ b/include/EqBand.h
@@ -0,0 +1,19 @@
+#pragma once
+
+#include "common.h"
+#include "BoolParameter.h"
+#include "RealParameter.h"
+
+namespace DawProject
+{
+struct EqBand
+{
+ RealParameter freq;
+ std::optional gain;
+ std::optional Q;
+ std::optional enabled;
+ EqBandType type;
+ std::optional order;
+};
+} // namespace DawProject
+
diff --git a/include/Equalizer.h b/include/Equalizer.h
new file mode 100644
index 0000000..dc06d31
--- /dev/null
+++ b/include/Equalizer.h
@@ -0,0 +1,18 @@
+#pragma once
+
+#include "common.h"
+#include "BuiltinDevice.h"
+#include "RealParameter.h"
+#include "EqBand.h"
+
+namespace DawProject
+{
+struct Equalizer
+ : public BuiltinDevice
+{
+ std::vector bands;
+ std::optional inputGain;
+ std::optional outputGain;
+};
+} // namespace DawProject
+
diff --git a/include/FileReference.h b/include/FileReference.h
new file mode 100644
index 0000000..bafc5c7
--- /dev/null
+++ b/include/FileReference.h
@@ -0,0 +1,19 @@
+#pragma once
+
+#include "common.h"
+
+namespace DawProject
+{
+/* References a file either within a DAWPROJECT container or on disk. */
+struct FileReference
+{
+ /* File path. either
+ path within the container
+ relative to .dawproject file (when external = "true")
+ absolute path (when external = "true" and path starts with a slash or windows drive letter) */
+ std::string path;
+ /* When true, the path is relative to the .dawproject file. Default value is false. */
+ std::optional external;
+};
+} // namespace DawProject
+
diff --git a/include/IntegerParameter.h b/include/IntegerParameter.h
new file mode 100644
index 0000000..7dfca9e
--- /dev/null
+++ b/include/IntegerParameter.h
@@ -0,0 +1,17 @@
+#pragma once
+
+#include "common.h"
+#include "Parameter.h"
+
+namespace DawProject
+{
+/* Represents an enumerated parameter which can provide a value and be used as an automation target. */
+struct IntegerParameter
+ : public Parameter
+{
+ std::optional value; // Integer value for this parameter.
+ std::optional min; // Minimum value this parameter can have (inclusive).
+ std::optional max; // Maximum value this parameter can have (inclusive).
+};
+} // namespace DawProject
+
diff --git a/include/IntegerPoint.h b/include/IntegerPoint.h
new file mode 100644
index 0000000..c061dd4
--- /dev/null
+++ b/include/IntegerPoint.h
@@ -0,0 +1,14 @@
+#pragma once
+
+#include "common.h"
+#include "Point.h"
+
+namespace DawProject
+{
+struct IntegerPoint
+ : public Point
+{
+ int value;
+};
+} // namespace DawProject
+
diff --git a/include/Lane.h b/include/Lane.h
new file mode 100644
index 0000000..c3a7d55
--- /dev/null
+++ b/include/Lane.h
@@ -0,0 +1,11 @@
+#pragma once
+
+#include "common.h"
+
+namespace DawProject
+{
+struct Lane
+{
+};
+} // namespace DawProject
+
diff --git a/include/Lanes.h b/include/Lanes.h
new file mode 100644
index 0000000..68973b8
--- /dev/null
+++ b/include/Lanes.h
@@ -0,0 +1,14 @@
+#pragma once
+
+#include "common.h"
+#include "Timeline.h"
+
+namespace DawProject
+{
+struct Lanes
+ : public Timeline
+{
+ std::vector lanes;
+};
+} // namespace DawProject
+
diff --git a/include/Limiter.h b/include/Limiter.h
new file mode 100644
index 0000000..d159acd
--- /dev/null
+++ b/include/Limiter.h
@@ -0,0 +1,19 @@
+#pragma once
+
+#include "common.h"
+#include "BuiltinDevice.h"
+#include "RealParameter.h"
+
+namespace DawProject
+{
+struct Limiter
+ : public BuiltinDevice
+{
+ std::optional threshold;
+ std::optional inputGain;
+ std::optional outputGain;
+ std::optional attack;
+ std::optional release;
+};
+} // namespace DawProject
+
diff --git a/include/Marker.h b/include/Marker.h
new file mode 100644
index 0000000..d895831
--- /dev/null
+++ b/include/Marker.h
@@ -0,0 +1,14 @@
+#pragma once
+
+#include "common.h"
+#include "Nameable.h"
+
+namespace DawProject
+{
+struct Marker
+ : public Nameable
+{
+ double time;
+};
+} // namespace DawProject
+
diff --git a/include/Markers.h b/include/Markers.h
new file mode 100644
index 0000000..be05a6d
--- /dev/null
+++ b/include/Markers.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#include "common.h"
+#include "Timeline.h"
+#include "Marker.h"
+
+namespace DawProject
+{
+struct Markers
+ : public Timeline
+{
+ std::vector markers;
+};
+} // namespace DawProject
+
diff --git a/include/MediaFile.h b/include/MediaFile.h
new file mode 100644
index 0000000..824b1e9
--- /dev/null
+++ b/include/MediaFile.h
@@ -0,0 +1,16 @@
+#pragma once
+
+#include "common.h"
+#include "Timeline.h"
+#include "FileReference.h"
+
+namespace DawProject
+{
+struct MediaFile
+ : public Timeline
+{
+ FileReference file;
+ double duration;
+};
+} // namespace DawProject
+
diff --git a/include/MetaData.h b/include/MetaData.h
new file mode 100644
index 0000000..0890cd5
--- /dev/null
+++ b/include/MetaData.h
@@ -0,0 +1,25 @@
+#pragma once
+
+#include "common.h"
+
+namespace DawProject
+{
+/* Metadata root element of the DAWPROJECT format. This is stored in the file metadata.xml file inside the container. */
+struct MetaData
+{
+ std::optional title; // Title of the song/project.
+ std::optional artist; // Recording Artist.
+ std::optional album; // Album.
+ std::optional originalArtist; // Original Artist.
+ std::optional composer; // Composer.
+ std::optional songwriter; // Songwriter.
+ std::optional producer; // Producer.
+ std::optional arranger; // Arranger.
+ std::optional year; // Year this project/song was recorded.
+ std::optional genre; // Genre/style
+ std::optional copyright; // Copyright notice.
+ std::optional website; // URL to website related to this project.
+ std::optional comment; // General comment or description.
+};
+} // namespace DawProject
+
diff --git a/include/Nameable.h b/include/Nameable.h
new file mode 100644
index 0000000..c0663cd
--- /dev/null
+++ b/include/Nameable.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#include "common.h"
+
+namespace DawProject
+{
+struct Nameable
+{
+ std::optional name; // Name/label of this object.
+ /* Color of this object in HTML-style format. (#rrggbb) */
+ std::optional color;
+ std::optional comment; // Comment/description of this object.
+};
+} // namespace DawProject
+
diff --git a/include/NoiseGate.h b/include/NoiseGate.h
new file mode 100644
index 0000000..d164b5e
--- /dev/null
+++ b/include/NoiseGate.h
@@ -0,0 +1,19 @@
+#pragma once
+
+#include "common.h"
+#include "BuiltinDevice.h"
+#include "RealParameter.h"
+
+namespace DawProject
+{
+struct NoiseGate
+ : public BuiltinDevice
+{
+ std::optional threshold;
+ std::optional ratio;
+ std::optional attack;
+ std::optional release;
+ std::optional range;
+};
+} // namespace DawProject
+
diff --git a/include/Note.h b/include/Note.h
new file mode 100644
index 0000000..60a6a2d
--- /dev/null
+++ b/include/Note.h
@@ -0,0 +1,19 @@
+#pragma once
+
+#include "common.h"
+#include "Timeline.h"
+
+namespace DawProject
+{
+struct Note
+{
+ double time;
+ double duration;
+ std::optional channel;
+ int key;
+ std::optional velocity;
+ std::optional releaseVelocity;
+ std::optional content;
+};
+} // namespace DawProject
+
diff --git a/include/Notes.h b/include/Notes.h
new file mode 100644
index 0000000..67dfd91
--- /dev/null
+++ b/include/Notes.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#include "common.h"
+#include "Timeline.h"
+#include "Note.h"
+
+namespace DawProject
+{
+struct Notes
+ : public Timeline
+{
+ std::vector notes;
+};
+} // namespace DawProject
+
diff --git a/include/Parameter.h b/include/Parameter.h
new file mode 100644
index 0000000..379c32f
--- /dev/null
+++ b/include/Parameter.h
@@ -0,0 +1,14 @@
+#pragma once
+
+#include "common.h"
+
+namespace DawProject
+{
+/* Represents a parameter which can provide a value and be used as an automation target. */
+struct Parameter
+{
+ /* Parameter ID as used by VST2 (index), VST3(ParamID) */
+ std::optional parameterID;
+};
+} // namespace DawProject
+
diff --git a/include/Plugin.h b/include/Plugin.h
new file mode 100644
index 0000000..1f177aa
--- /dev/null
+++ b/include/Plugin.h
@@ -0,0 +1,14 @@
+#pragma once
+
+#include "common.h"
+#include "Device.h"
+
+namespace DawProject
+{
+struct Plugin
+ : public Device
+{
+ std::optional pluginVersion;
+};
+} // namespace DawProject
+
diff --git a/include/Point.h b/include/Point.h
new file mode 100644
index 0000000..193c61d
--- /dev/null
+++ b/include/Point.h
@@ -0,0 +1,12 @@
+#pragma once
+
+#include "common.h"
+
+namespace DawProject
+{
+struct Point
+{
+ double time;
+};
+} // namespace DawProject
+
diff --git a/include/Points.h b/include/Points.h
new file mode 100644
index 0000000..884b2fc
--- /dev/null
+++ b/include/Points.h
@@ -0,0 +1,18 @@
+#pragma once
+
+#include "common.h"
+#include "Timeline.h"
+#include "AutomationTarget.h"
+#include "Point.h"
+
+namespace DawProject
+{
+struct Points
+ : public Timeline
+{
+ AutomationTarget target;
+ std::vector points;
+ std::optional unit;
+};
+} // namespace DawProject
+
diff --git a/include/Project.h b/include/Project.h
new file mode 100644
index 0000000..ace5723
--- /dev/null
+++ b/include/Project.h
@@ -0,0 +1,26 @@
+#pragma once
+
+#include "common.h"
+#include "Application.h"
+#include "Transport.h"
+#include "Lane.h"
+#include "Arrangement.h"
+#include "Scene.h"
+
+namespace DawProject
+{
+/* The main root element of the DAWPROJECT format. This is stored in the file project.xml file inside the container. */
+struct Project
+{
+ /* Version of DAWPROJECT format this file was saved as. */
+ std::string version;
+ /* Metadata (name/version) about the application that saved this file. */
+ Application application;
+ /* Transport element containing playback parameters such as Tempo and Time-signature. */
+ std::optional transport;
+ std::vector structure; // Track/Channel structure of this file.
+ std::optional arrangement; // The main Arrangement timeline of this file.
+ std::vector scenes; // Clip Launcher scenes of this file.
+};
+} // namespace DawProject
+
diff --git a/include/RealParameter.h b/include/RealParameter.h
new file mode 100644
index 0000000..fcdcf06
--- /dev/null
+++ b/include/RealParameter.h
@@ -0,0 +1,22 @@
+#pragma once
+
+#include "common.h"
+#include "Parameter.h"
+
+namespace DawProject
+{
+/* Represents a real valued (double) parameter which can provide a value and be used as an automation target. */
+struct RealParameter
+ : public Parameter
+{
+ /* Real (double) value for this parameter.
+ When serializing value to text for XML, infinite values are allowed and should be represented as inf and -inf.
*/
+ std::optional value;
+ /* Unit in which value, min and max are defined.
+ Using this rather than normalized value ranges allows transfer of parameter values and automation data.
*/
+ Unit unit;
+ std::optional min; // Minimum value this parameter can have (inclusive).
+ std::optional max; // Maximum value this parameter can have (inclusive).
+};
+} // namespace DawProject
+
diff --git a/include/RealPoint.h b/include/RealPoint.h
new file mode 100644
index 0000000..b75beae
--- /dev/null
+++ b/include/RealPoint.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#include "common.h"
+#include "Point.h"
+
+namespace DawProject
+{
+struct RealPoint
+ : public Point
+{
+ double value;
+ std::optional interpolation;
+};
+} // namespace DawProject
+
diff --git a/include/Scene.h b/include/Scene.h
new file mode 100644
index 0000000..5abd77c
--- /dev/null
+++ b/include/Scene.h
@@ -0,0 +1,27 @@
+#pragma once
+
+#include "common.h"
+#include "Timeline.h"
+
+namespace DawProject
+{
+/* Represents a clip launcher Scene of a DAW. */
+struct Scene
+{
+ /* Content timeline of this scene, will typically be structured like this:
+
+ <Scene>
+ <Lanes>
+ <ClipSlot track="...">
+ <Clip>
+ ...
+ </Clip>
+ </ClipSlot>
+ ...
+ </Lanes>
+ </Scene>
+
*/
+ Timeline content;
+};
+} // namespace DawProject
+
diff --git a/include/Send.h b/include/Send.h
new file mode 100644
index 0000000..272aac5
--- /dev/null
+++ b/include/Send.h
@@ -0,0 +1,19 @@
+#pragma once
+
+#include "common.h"
+#include "RealParameter.h"
+
+namespace DawProject
+{
+struct Channel;
+
+/* A single send of a mixer channel. */
+struct Send
+{
+ RealParameter volume; // Send level.
+ std::optional pan; // Send pan/balance.
+ std::optional type; // Send type.
+ Channel* destination; // Send destination.
+};
+} // namespace DawProject
+
diff --git a/include/TimeSignatureParameter.h b/include/TimeSignatureParameter.h
new file mode 100644
index 0000000..07d76ea
--- /dev/null
+++ b/include/TimeSignatureParameter.h
@@ -0,0 +1,18 @@
+#pragma once
+
+#include "common.h"
+#include "Parameter.h"
+
+namespace DawProject
+{
+/* Represents a (the) time-signature parameter which can provide a value and be used as an automation target. */
+struct TimeSignatureParameter
+ : public Parameter
+{
+ /* Numerator of the time-signature. (3/4 → 3, 4/4 → 4) */
+ int numerator;
+ /* Denominator of the time-signature. (3/4 → 4, 7/8 → 8) */
+ int denominator;
+};
+} // namespace DawProject
+
diff --git a/include/TimeSignaturePoint.h b/include/TimeSignaturePoint.h
new file mode 100644
index 0000000..a25aacd
--- /dev/null
+++ b/include/TimeSignaturePoint.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#include "common.h"
+#include "Point.h"
+
+namespace DawProject
+{
+struct TimeSignaturePoint
+ : public Point
+{
+ int numerator;
+ int denominator;
+};
+} // namespace DawProject
+
diff --git a/include/Timeline.h b/include/Timeline.h
new file mode 100644
index 0000000..7011cfc
--- /dev/null
+++ b/include/Timeline.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#include "common.h"
+
+namespace DawProject
+{
+struct Track;
+
+struct Timeline
+{
+ Track* track;
+ std::optional timeUnit;
+};
+} // namespace DawProject
+
diff --git a/include/Track.h b/include/Track.h
new file mode 100644
index 0000000..a64f0ca
--- /dev/null
+++ b/include/Track.h
@@ -0,0 +1,21 @@
+#pragma once
+
+#include "common.h"
+#include "Lane.h"
+#include "Channel.h"
+
+namespace DawProject
+{
+/* Represents a sequencer track. */
+struct Track
+ : public Lane
+{
+ /* Role of this track in timelines & arranger. Can be multiple (comma-separated). */
+ std::vector contentType;
+ std::optional loaded; // If this track is loaded/active of not.
+ std::optional channel; // Mixer channel used for the output of this track.
+ /* Child tracks, typically used to represent group/folder tracks with contentType="tracks". */
+ std::vector