use crate::composition::TrackBuilder;
use crate::instruments::drums::DrumType;
use crate::theory::core::ChordPattern;
pub struct TransformBuilder<'a> {
inner: TrackBuilder<'a>,
}
impl<'a> TransformBuilder<'a> {
fn into_inner(self) -> TrackBuilder<'a> {
self.inner
}
pub fn shift(mut self, semitones: i32) -> Self {
self.inner = self.inner.shift(semitones);
self
}
pub fn humanize(mut self, timing_variance: f32, velocity_variance: f32) -> Self {
self.inner = self.inner.humanize(timing_variance, velocity_variance);
self
}
pub fn rotate(mut self, positions: i32) -> Self {
self.inner = self.inner.rotate(positions);
self
}
pub fn retrograde(mut self) -> Self {
self.inner = self.inner.retrograde();
self
}
pub fn shuffle(mut self) -> Self {
self.inner = self.inner.shuffle();
self
}
pub fn thin(mut self, keep_probability: f32) -> Self {
self.inner = self.inner.thin(keep_probability);
self
}
pub fn stack(mut self, semitones: i32, count: usize) -> Self {
self.inner = self.inner.stack(semitones, count);
self
}
pub fn mutate(mut self, max_semitones: i32) -> Self {
self.inner = self.inner.mutate(max_semitones);
self
}
pub fn stretch(mut self, factor: f32) -> Self {
self.inner = self.inner.stretch(factor);
self
}
pub fn compress(mut self, target_duration: f32) -> Self {
self.inner = self.inner.compress(target_duration);
self
}
pub fn quantize(mut self, grid: f32) -> Self {
self.inner = self.inner.quantize(grid);
self
}
pub fn palindrome(mut self) -> Self {
self.inner = self.inner.palindrome();
self
}
pub fn stutter(mut self, probability: f32, repeats: usize) -> Self {
self.inner = self.inner.stutter(probability, repeats);
self
}
pub fn stutter_every(mut self, nth: usize, repeats: usize) -> Self {
self.inner = self.inner.stutter_every(nth, repeats);
self
}
pub fn granularize(mut self, divisions: usize) -> Self {
self.inner = self.inner.granularize(divisions);
self
}
pub fn magnetize(mut self, scale_notes: &[f32]) -> Self {
self.inner = self.inner.magnetize(scale_notes);
self
}
pub fn gravity(mut self, center_pitch: f32, strength: f32) -> Self {
self.inner = self.inner.gravity(center_pitch, strength);
self
}
pub fn ripple(mut self, intensity: f32) -> Self {
self.inner = self.inner.ripple(intensity);
self
}
pub fn reverse(mut self) -> Self {
self.inner = self.inner.reverse();
self
}
pub fn invert(mut self, axis_freq: f32) -> Self {
self.inner = self.inner.invert(axis_freq);
self
}
pub fn invert_constrained(mut self, axis_freq: f32, min_freq: f32, max_freq: f32) -> Self {
self.inner = self.inner.invert_constrained(axis_freq, min_freq, max_freq);
self
}
pub fn sieve_inclusive(mut self, min_freq: f32, max_freq: f32) -> Self {
self.inner = self.inner.sieve_inclusive(min_freq, max_freq);
self
}
pub fn sieve_exclusive(mut self, min_freq: f32, max_freq: f32) -> Self {
self.inner = self.inner.sieve_exclusive(min_freq, max_freq);
self
}
pub fn group(mut self, duration: f32) -> Self {
self.inner = self.inner.group(duration);
self
}
pub fn duplicate(mut self) -> Self {
self.inner = self.inner.duplicate();
self
}
pub fn repeat(mut self, times: usize) -> Self {
self.inner = self.inner.repeat(times);
self
}
pub fn harmonize(mut self, notes: &[f32], semitones: i32, note_duration: f32) -> Self {
self.inner = self.inner.harmonize(notes, semitones, note_duration);
self
}
pub fn every_n(mut self, n: usize, drum: DrumType) -> Self {
self.inner = self.inner.every_n(n, drum);
self
}
pub fn range_dilation(mut self, factor: f32) -> Self {
self.inner = self.inner.range_dilation(factor);
self
}
pub fn shape_contour(mut self, factor: f32) -> Self {
self.inner = self.inner.shape_contour(factor);
self
}
pub fn echo(mut self, delay: f32, repeats: usize, decay: f32) -> Self {
self.inner = self.inner.echo(delay, repeats, decay);
self
}
}
pub struct GeneratorBuilder<'a> {
inner: TrackBuilder<'a>,
}
impl<'a> GeneratorBuilder<'a> {
fn into_inner(self) -> TrackBuilder<'a> {
self.inner
}
pub fn chord(mut self, root: f32, pattern: &ChordPattern, duration: f32) -> Self {
self.inner = self.inner.chord(root, pattern, duration);
self
}
pub fn chord_inverted(mut self, root: f32, pattern: &ChordPattern, inversion: usize, duration: f32) -> Self {
self.inner = self.inner.chord_inverted(root, pattern, inversion, duration);
self
}
pub fn chord_voice_lead(mut self, root: f32, pattern: &ChordPattern, duration: f32) -> Self {
self.inner = self.inner.chord_voice_lead(root, pattern, duration);
self
}
pub fn chord_over_bass(mut self, root: f32, pattern: &ChordPattern, bass: f32, duration: f32) -> Self {
self.inner = self.inner.chord_over_bass(root, pattern, bass, duration);
self
}
pub fn chords(mut self, chord_sequence: &[&[f32]], chord_duration: f32) -> Self {
self.inner = self.inner.chords(chord_sequence, chord_duration);
self
}
pub fn chords_from(mut self, chord_vecs: &[Vec<f32>], chord_duration: f32) -> Self {
self.inner = self.inner.chords_from(chord_vecs, chord_duration);
self
}
pub fn scale(mut self, scale: &[f32], note_duration: f32) -> Self {
self.inner = self.inner.scale(scale, note_duration);
self
}
pub fn scale_reverse(mut self, scale: &[f32], note_duration: f32) -> Self {
self.inner = self.inner.scale_reverse(scale, note_duration);
self
}
pub fn scale_updown(mut self, scale: &[f32], note_duration: f32) -> Self {
self.inner = self.inner.scale_updown(scale, note_duration);
self
}
pub fn scale_downup(mut self, scale: &[f32], note_duration: f32) -> Self {
self.inner = self.inner.scale_downup(scale, note_duration);
self
}
pub fn arpeggiate(mut self, chord: &[f32], note_duration: f32) -> Self {
self.inner = self.inner.arpeggiate(chord, note_duration);
self
}
pub fn arpeggiate_reverse(mut self, chord: &[f32], note_duration: f32) -> Self {
self.inner = self.inner.arpeggiate_reverse(chord, note_duration);
self
}
pub fn arpeggiate_updown(mut self, chord: &[f32], note_duration: f32) -> Self {
self.inner = self.inner.arpeggiate_updown(chord, note_duration);
self
}
pub fn arpeggiate_downup(mut self, chord: &[f32], note_duration: f32) -> Self {
self.inner = self.inner.arpeggiate_downup(chord, note_duration);
self
}
pub fn alberti_bass(mut self, chord: &[f32], note_duration: f32) -> Self {
self.inner = self.inner.alberti_bass(chord, note_duration);
self
}
pub fn waltz_bass(mut self, root: f32, chord: &[f32], beat_duration: f32) -> Self {
self.inner = self.inner.waltz_bass(root, chord, beat_duration);
self
}
pub fn broken_chord(mut self, chord: &[f32], pattern_type: u8, note_duration: f32) -> Self {
self.inner = self.inner.broken_chord(chord, pattern_type, note_duration);
self
}
pub fn walking_bass(mut self, bass_line: &[f32], note_duration: f32) -> Self {
self.inner = self.inner.walking_bass(bass_line, note_duration);
self
}
pub fn tremolo_strings(mut self, notes: &[f32], total_duration: f32, note_speed: f32) -> Self {
self.inner = self.inner.tremolo_strings(notes, total_duration, note_speed);
self
}
pub fn ostinato(mut self, pattern: &[f32], note_duration: f32, repeats: usize) -> Self {
self.inner = self.inner.ostinato(pattern, note_duration, repeats);
self
}
pub fn trill(mut self, note1: f32, note2: f32, count: usize, note_duration: f32) -> Self {
self.inner = self.inner.trill(note1, note2, count, note_duration);
self
}
pub fn cascade(mut self, notes: &[f32], note_duration: f32, stagger: f32) -> Self {
self.inner = self.inner.cascade(notes, note_duration, stagger);
self
}
pub fn tremolo_note(mut self, note: f32, count: usize, note_duration: f32) -> Self {
self.inner = self.inner.tremolo_note(note, count, note_duration);
self
}
pub fn strum(mut self, chord: &[f32], note_duration: f32, stagger: f32) -> Self {
self.inner = self.inner.strum(chord, note_duration, stagger);
self
}
pub fn mordent(mut self, main_note: f32, duration: f32) -> Self {
self.inner = self.inner.mordent(main_note, duration);
self
}
pub fn inverted_mordent(mut self, main_note: f32, duration: f32) -> Self {
self.inner = self.inner.inverted_mordent(main_note, duration);
self
}
pub fn turn(mut self, main_note: f32, duration: f32) -> Self {
self.inner = self.inner.turn(main_note, duration);
self
}
pub fn inverted_turn(mut self, main_note: f32, duration: f32) -> Self {
self.inner = self.inner.inverted_turn(main_note, duration);
self
}
pub fn tuplet(mut self, notes: &[f32], count: usize, total_duration: f32) -> Self {
self.inner = self.inner.tuplet(notes, count, total_duration);
self
}
pub fn triplet(mut self, notes: &[f32], total_duration: f32) -> Self {
self.inner = self.inner.triplet(notes, total_duration);
self
}
pub fn quintuplet(mut self, notes: &[f32], total_duration: f32) -> Self {
self.inner = self.inner.quintuplet(notes, total_duration);
self
}
pub fn sextuplet(mut self, notes: &[f32], total_duration: f32) -> Self {
self.inner = self.inner.sextuplet(notes, total_duration);
self
}
pub fn septuplet(mut self, notes: &[f32], total_duration: f32) -> Self {
self.inner = self.inner.septuplet(notes, total_duration);
self
}
pub fn octaves(mut self, notes: &[f32], octave_offset: i32, note_duration: f32) -> Self {
self.inner = self.inner.octaves(notes, octave_offset, note_duration);
self
}
pub fn pedal(mut self, pedal_note: f32, melody_notes: &[f32], note_duration: f32) -> Self {
self.inner = self.inner.pedal(pedal_note, melody_notes, note_duration);
self
}
pub fn sequence_from(mut self, sequence: &[u32], notes: &[f32], note_duration: f32) -> Self {
self.inner = self.inner.sequence_from(sequence, notes, note_duration);
self
}
pub fn slide(mut self, from: f32, to: f32, duration: f32) -> Self {
self.inner = self.inner.slide(from, to, duration);
self
}
pub fn wholes(mut self, notes: &[f32]) -> Self {
self.inner = self.inner.wholes(notes);
self
}
pub fn halves(mut self, notes: &[f32]) -> Self {
self.inner = self.inner.halves(notes);
self
}
pub fn quarters(mut self, notes: &[f32]) -> Self {
self.inner = self.inner.quarters(notes);
self
}
pub fn eighths(mut self, notes: &[f32]) -> Self {
self.inner = self.inner.eighths(notes);
self
}
pub fn sixteenths(mut self, notes: &[f32]) -> Self {
self.inner = self.inner.sixteenths(notes);
self
}
pub fn orbit(mut self, center: f32, radius_semitones: f32, steps_per_rotation: usize, step_duration: f32, rotations: f32, clockwise: bool) -> Self {
self.inner = self.inner.orbit(center, radius_semitones, steps_per_rotation, step_duration, rotations, clockwise);
self
}
pub fn bounce(mut self, start: f32, stop: f32, ratio: f32, bounces: usize, steps_per_segment: usize, step_duration: f32) -> Self {
self.inner = self.inner.bounce(start, stop, ratio, bounces, steps_per_segment, step_duration);
self
}
pub fn scatter(mut self, min: f32, max: f32, count: usize, duration: f32) -> Self {
self.inner = self.inner.scatter(min, max, count, duration);
self
}
pub fn stream(mut self, freq: f32, count: usize, duration: f32) -> Self {
self.inner = self.inner.stream(freq, count, duration);
self
}
pub fn random_notes(mut self, notes: &[f32], count: usize, duration: f32) -> Self {
self.inner = self.inner.random_notes(notes, count, duration);
self
}
pub fn sprinkle(mut self, min: f32, max: f32, count: usize, duration: f32) -> Self {
self.inner = self.inner.sprinkle(min, max, count, duration);
self
}
}
impl<'a> TrackBuilder<'a> {
pub fn generator<F>(self, f: F) -> Self
where
F: FnOnce(GeneratorBuilder<'a>) -> GeneratorBuilder<'a>,
{
let builder = GeneratorBuilder { inner: self };
let result = f(builder);
result.into_inner()
}
}
impl<'a> TrackBuilder<'a> {
pub fn transform<F>(self, f: F) -> Self
where
F: FnOnce(TransformBuilder<'a>) -> TransformBuilder<'a>,
{
let builder = TransformBuilder { inner: self };
let result = f(builder);
result.into_inner()
}
}