MidiCompilerContext.java

package com.github.dakusui.symfonion.core;

import com.github.dakusui.symfonion.utils.Fraction;
import com.github.dakusui.symfonion.song.Groove;
import com.github.dakusui.symfonion.song.Pattern;
import com.github.dakusui.symfonion.song.Stroke;

import javax.sound.midi.Track;

public record MidiCompilerContext(Track track, int channel, Pattern.Parameters params, Fraction relativeStrokePositionInBar,
                                  long barPositionInTicks, Groove groove) {
  
  // this.position = position;
  // this.grooveAccent = grooveAccent;
  // this.strokeLengthInTicks = strokeLengthInTicks;
  
  public long getStrokeLengthInTicks(Stroke stroke) {
    return convertRelativePositionInStrokeToAbsolutePosition(stroke.length());
  }
  
  public long convertRelativePositionInStrokeToAbsolutePosition(Fraction relativePositionInStroke) {
    Groove.Unit unit = resolveRelativePositionInStroke(relativePositionInStroke);
    long relativePositionInBarInTicks = unit.pos();
    return barPositionInTicks() + relativePositionInBarInTicks;
  }
  
  public int getGrooveAccent(Fraction relPosInStroke) {
    Groove.Unit unit = resolveRelativePositionInStroke(relPosInStroke);
    return unit.accent();
  }
  
  private Groove.Unit resolveRelativePositionInStroke(
      Fraction relativePositionInStroke) {
    return this.groove().resolve(
        Fraction.add(
            this.relativeStrokePositionInBar(),
            relativePositionInStroke
        )
    );
  }
}