Skip to main content

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

Lumix

Declaration

public struct MusicalTime

Fields

Bars
int
required
The number of bars (measures).
public int Bars
Beats
int
required
The number of beats within the current bar.
public int Beats
Ticks
int
required
The number of ticks within the current beat. The resolution depends on the project’s PPQ (Pulses Per Quarter note) setting.
public int Ticks

Constructor

MusicalTime

Creates a new MusicalTime instance.
public MusicalTime(int bars, int beats, int ticks)
bars
int
required
The number of bars.
beats
int
required
The number of beats.
ticks
int
required
The number of 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)
obj
object
required
The object to compare.
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

Build docs developers (and LLMs) love