Overview
The MusicalTime struct represents time in musical notation using bars (measures), beats, and ticks. This is the standard way to represent time positions in the Lumix DAW, allowing for musical operations that maintain rhythmic relationships.
Namespace
Declaration
public struct MusicalTime
Fields
The number of bars (measures).
The number of beats within the current bar.
The number of ticks within the current beat. The resolution depends on the project’s PPQ (Pulses Per Quarter note) setting.
Constructor
MusicalTime
Creates a new MusicalTime instance.
public MusicalTime(int bars, int beats, int ticks)
Operators
Addition (+)
Adds two MusicalTime values.
public static MusicalTime operator +(MusicalTime a, MusicalTime b)
Example:
var time1 = new MusicalTime(2, 3, 100);
var time2 = new MusicalTime(1, 1, 50);
var result = time1 + time2; // Result: Bars=3, Beats=4, Ticks=150
Subtraction (-)
Subtracts one MusicalTime from another.
public static MusicalTime operator -(MusicalTime a, MusicalTime b)
Example:
var time1 = new MusicalTime(4, 2, 200);
var time2 = new MusicalTime(1, 1, 50);
var result = time1 - time2; // Result: Bars=3, Beats=1, Ticks=150
Multiplication (*)
Multiplies two MusicalTime values component-wise.
public static MusicalTime operator *(MusicalTime a, MusicalTime b)
Example:
var time1 = new MusicalTime(2, 2, 100);
var time2 = new MusicalTime(2, 1, 2);
var result = time1 * time2; // Result: Bars=4, Beats=2, Ticks=200
Division (/)
Divides one MusicalTime by another component-wise.
public static MusicalTime operator /(MusicalTime a, MusicalTime b)
Example:
var time1 = new MusicalTime(4, 4, 200);
var time2 = new MusicalTime(2, 2, 2);
var result = time1 / time2; // Result: Bars=2, Beats=2, Ticks=100
Greater Than (>)
Compares two MusicalTime values.
public static bool operator >(MusicalTime a, MusicalTime b)
Example:
var time1 = new MusicalTime(2, 3, 100);
var time2 = new MusicalTime(2, 2, 400);
bool isGreater = time1 > time2; // true (more beats)
Less Than (<)
Compares two MusicalTime values.
public static bool operator <(MusicalTime a, MusicalTime b)
Greater Than or Equal (>=)
Compares two MusicalTime values.
public static bool operator >=(MusicalTime a, MusicalTime b)
Less Than or Equal (<=)
Compares two MusicalTime values.
public static bool operator <=(MusicalTime a, MusicalTime b)
Equality (==)
Checks if two MusicalTime values are equal.
public static bool operator ==(MusicalTime a, MusicalTime b)
Example:
var time1 = new MusicalTime(1, 2, 100);
var time2 = new MusicalTime(1, 2, 100);
bool areEqual = time1 == time2; // true
Inequality (!=)
Checks if two MusicalTime values are not equal.
public static bool operator !=(MusicalTime a, MusicalTime b)
Methods
Equals
Determines whether the specified object is equal to the current MusicalTime.
public override bool Equals(object obj)
Returns: bool - true if equal, false otherwise
GetHashCode
Returns a hash code for the current MusicalTime.
public override int GetHashCode()
Returns: int - A hash code for the current object
Example Usage
// Creating a musical time representing bar 4, beat 2, tick 240
var time = new MusicalTime(4, 2, 240);
// Accessing components
Console.WriteLine($"{time.Bars}:{time.Beats}:{time.Ticks}"); // Output: "4:2:240"
// Adding time values
var offset = new MusicalTime(0, 2, 0); // Two beats
var newTime = time + offset;
Console.WriteLine($"{newTime.Bars}:{newTime.Beats}:{newTime.Ticks}"); // Output: "4:4:240"
// Comparing times
var time1 = new MusicalTime(1, 1, 0);
var time2 = new MusicalTime(2, 1, 0);
if (time2 > time1)
{
Console.WriteLine("Time 2 is later");
}
// Using in clip timing
var clipStart = new MusicalTime(1, 1, 0);
var clipDuration = new MusicalTime(2, 0, 0); // 2 bars long
var clipEnd = clipStart + clipDuration; // Bar 3, beat 1
Common Time Values
Assuming 4/4 time signature and 480 PPQ:
- One quarter note:
new MusicalTime(0, 1, 0)
- One bar:
new MusicalTime(1, 0, 0)
- Half note:
new MusicalTime(0, 2, 0)
- Eighth note:
new MusicalTime(0, 0, 240)
- Sixteenth note:
new MusicalTime(0, 0, 120)
Notes
The comparison operators perform hierarchical comparison: bars are compared first, then beats, then ticks.
Arithmetic operations do not normalize values. For example, adding beats may result in a Beats value greater than the time signature’s beats per bar. Use conversion utilities to normalize if needed.
See Also
- Clip - Uses MusicalTime for timing
- Track - Contains time selection using MusicalTime
- TrackEngine - Processes clips at specific musical times