The Alternative Csound Reference Manual
Previous |  | Next

# harmon

harmon -- Analyze an audio input and generate harmonizing voices in synchrony.

## Description

Analyze an audio input and generate harmonizing voices in synchrony.

## Syntax

ar harmon asig, kestfrq, kmaxvar, kgenfreq1, kgenfreq2, imode, iminfrq, iprd

## Initialization

imode -- interpreting mode for the generating frequency inputs kgenfreq1, kgenfreq2. 0: input values are ratios with respect to the audio signal analyzed frequency. 1: input values are the actual requested frequencies in Hz.

iminfrq -- the lowest expected frequency (in Hz) of the audio input. This parameter determines how much of the input is saved for the running analysis, and sets a lower bound on the internal pitch tracker.

iprd -- period of analysis (in seconds). Since the internal pitch analysis can be time-consuming, the input is typically analyzed only each 20 to 50 milliseconds.

## Performance

kestfrq -- estimated frequency of the input.

kmaxvar -- the maximum variance.

kgenfreq1 -- the first generated frequency.

kgenfreq2 -- the second generated frequency.

This unit is a harmonizer, able to provide up to two additional voices with the same amplitude and spectrum as the input. The input analysis is assisted by two things: an input estimated frequency kestfrq (in Hz), and a fractional maximum variance kmaxvar about that estimate which serves to limit the size of the search. Once the real input frequency is determined, the most recent pulse shape is used to generate the other voices at their requested frequencies.

The three frequency inputs can be derived in various ways from a score file or MIDI source. The first is the expected pitch, with a variance parameter allowing for inflections or inaccuracies; if the expected pitch is zero the harmonizer will be silent. The second and third pitches control the output frequencies; if either is zero the harmonizer will output only the non-zero request; if both are zero the harmonizer will be silent. When the requested frequency is higher than the input, the process requires additional computation due to overlapped output pulses. This is currently limited for efficiency reasons, with the result that only one voice can be higher than the input at any one time.

This unit is useful for supplying a background chorus effect on demand, or for correcting the pitch of a faulty input vocal. There is essentially no delay between input and output. Output includes only the generated parts, and does not include the input.

## Examples

Here is an example of the harmon opcode. It uses the files harmon.orc and harmon.sco.

Example 1. Example of the harmon opcode.

    /* harmon.orc */
    ; Initialize the global variables.
    sr = 44100
    kr = 4410
    ksmps = 10
    nchnls = 1

    ; Instrument #1.
    instr 1
      ; The frequency of the base note.
      inote = 440

      ; Generate the base note.
      avco vco 20000, inote, 1

      kestfrq = inote
      kmaxvar = 200

      ; Calculate frequencies 3 semitones above and
      ; below the base note.
      kgenfreq1 = inote * semitone(3)
      kgenfreq2 = inote * semitone(-3)

      imode = 1
      iminfrq = inote - 200
      iprd = 0.1

      ; Generate the harmony notes.
      a1 harmon avco, kestfrq, kmaxvar, kgenfreq1, kgenfreq2, \
                imode, iminfrq, iprd

      out a1
    endin
    /* harmon.orc */

    /* harmon.sco */
    ; Table #1, a sine wave.
    f 1 0 16384 10 1

    ; Play Instrument #1 for two seconds.
    i 1 0 2
    e
    /* harmon.sco */

## Credits

Author: Barry L. Vercoe
M.I.T., Cambridge, Mass
1997

Example written by Kevin Conder.

Previous | Home | Next
guiro | Up | hilbert