"
The Jazz mode voicings are better than I am. I mean that as a compliment to the code.
KE
@kenji_osaka
JAZZ GUITARIST
let harmony = Engine.new(Palestrina);fn detect_pitch(buf) -> Note
const MAX_VOICES: usize = 4;
voice_leading.reject_parallels()struct GuitarInput { onset }
engine.harmonize(note, scale)fn detect_pitch( buf: &[f32] ) -> Option<Note>
let voices =
counterpoint::
generate(line, mode);if interval == Fifth
&& motion == Parallel
{ reject() }#[inline(always)] fn onset( frame: &Frame ) -> bool
block_size: 128 sample_rate: 48_000 latency_ms: 7.2
// Palestrina // counterpoint // rules.rs
Read the source, report a bug, propose a feature, or contribute a pull request.
The Jazz mode voicings are better than I am. I mean that as a compliment to the code.
I make my species-counterpoint students check their homework against Palestrina mode. Beats my red pen.
Random-below-no-2nds into a Rhodes plugin hosted in-app. Instant ECM record.
Looked under the hood expecting hacks. Found a voice-leading solver with comments. Read the whole thing on a flight.
We run two guitars into two instances, quantize to different modes. Feels like a third band member.
Parallel-fifths rejection on by default is a value statement. Ship more value statements.
Browser at app.contrapunk.com. macOS DMG from GitHub Releases. Build from source with cargo tauri dev.