Skip to content

GENfarey

Fills a table with the Farey Sequence Fn of the integer n.

Plugin gen in fareygen.

A Farey Sequence Fn of order n is a list of fractions in their lowest terms between 0 and 1 and in ascending order. Their denominators do not exceed n. This means a fraction a/b belongs to Fn if 0 ≤ a ≤ b ≤ n. The numerator and denominator of each fraction are always coprime. 0 and 1 are included in Fn as the fractions 0/1 and 1/1. For example F5 = {0/1, 1/5, 1/4, 1/3, 2/5, 1/2, 3/5, 2/3, 3/4, 4/5, 1/1} Some properties of the Farey Sequence:

  • If a/b and c/d are two successive terms of Fn, then bc - ad = 1.
  • If a/b, c/d, e/f are three successive terms of Fn, then: c/d = (a+e) / (b+f). In this case c/d is called the mediant fraction between a/b and e/f.
  • If n > 1, then no two successive terms ofFn have the same denominator.

The length of any Farey Sequence Fn is determined by |Fn| = 1 + SUM over n (phi(m)) where phi(m) is Euler's totient function, which gives the number of integers ≤ m that are coprime to m.

Some values for the length of Fn given n:

n F
1 2
2 3
3 5
4 7
5 11
6 13
7 19
8 23
9 29
10 33
11 43
12 47
13 59
14 65
15 73
16 81
17 97
18 103
19 121
20 129

Syntax

f # time size "farey" fareynum mode

Initialization

size -- number of points in the table. Must be a power of 2 or power-of-2 plus 1 (see f statement).

fareynum -- the integer n for generating Farey Sequence Fn

mode -- integer to trigger a specific output to be written into the table:

  1. outputs floating point numbers representing the elements of Fn.
  2. outputs delta values of successive elements of Fn, useful for generating note durations for example.
  3. outputs only the denominators of the integer ratios, useful for indexing other tables or instruments for example.
  4. same as mode 2 but with normalised output.
  5. same as mode 0 but with 1 added to each number, useful for generating tables for tuning opcodes, for example cps2pch.

Examples

f1 0 -23 "farey" 8 0

Generates generates Farey Sequence F8. The table contains all 23 elements of F8 as floating point numbers.

f1 0 -18 "farey" 7 1

This generates Farey Sequence F7. The table contains 18 delta values of F7, i.e. the difference between ri+1 - ri, where r is the ith element of Fn.

f1 0 -43 "farey" 11 2

This generates Farey Sequence F11. The table contains the denominators of all 43 fractions in F11.

f1 0 -43 "farey" 11 3

This generates Farey Sequence F11. The table contains the denominators of all 43 fractions in F11, each of those divided by 11, i.e. normalised.

f1 0 -18 "farey" 7 4

This generates Farey Sequence F7. The table contains all fractions of F7, same as mode 0, but this time '1' is added to each table element.

A simple example of the GENfarey routine.
<CsoundSynthesizer>
<CsOptions>
</CsOptions>
<CsInstruments>

sr=44100
ksmps=10
nchnls=1

instr 4
      kndx init 0 ; read out elements of F_8 one by one and print to file
      if (kndx < 23) then    
         kelem tab kndx, 1
         fprintks "farey8table.txt", "%2.6f\\n", kelem
         kndx = kndx+1
      endif
endin
</CsInstruments>
<CsScore>
; initialise integer for Farey Sequence F_8
f1 0 -23 "farey" 8 0
      ; if mode=0 then the table stores all elements of the Farey Sequence
      ; as fractions in the range [0,1]
i4      0     1
e
</CsScore>
</CsoundSynthesizer>

Here is a complete example of the GENfarey routine. It uses the files genfarey-2.csd.

Another example of the GENfarey routine.
<CsoundSynthesizer>
<CsOptions>
; Select audio/midi flags here according to platform
-odac     ;;;realtime audio out
;-iadc    ;;;uncomment -iadc for RT audio input as well 
; For Non-realtime ouput leave only the line below:
; -o genfarey.wav -W ;;; for file output any platform
</CsOptions>
<CsInstruments>
sr = 44100
ksmps = 32
nchnls = 2
0dbfs  = 1

; GENfarey creates table gidelta. 
; The table contains the delta values of Farey Sequence 7 (p5=7).
; They are used as Inter Onset Intervals (IOIs) or event durations.
; If p6 is set to 1 for IOI output then the length of the table (p3=-18) is -(|F_7| - 1)
; Remember that a negative sign is for non-power-of-2 table lengths.
; The negative sign in front of the GEN number prevents post-normalisation of its values.

gidelta ftgen 0,0,-18,"farey",7,1

; Use GENfarey with p6 set to 2 to generate the denominators of fractions of F_7 
; this is used in this example as factors to create a series of pitches:
gimult ftgen 0,0,-18,"farey",7,2

;-------- loop and trigger instrument 901 using a Farey Sequence polyrhythm
          instr 1
kindx init 0
kindx2 init 0
ktrigger init 0
ktime_unit init p6
kstart init p4
kloop init p5
kinitndx init 0
kfn_times init gidelta
knote init 60
kbasenote init p8
ifundam init p7
ktrigger seqtime ktime_unit, kstart, kloop, kinitndx, kfn_times
  if (ktrigger > 0 ) then
     kpitch = cpspch(ifundam)
     kmult tab kindx2, gimult
     kpitch = kpitch * kmult
     knote = kbasenote + kmult
     event "i", 901,   0,   .4, .10, kpitch, kpitch * .9, 0.4,  5,   .75, .8,  1.0, .15, .0,  .125, .125, .25, .5,  1.0, .0, .0,  .0,  .0,  .125, .25, .25, .25, knote
     kindx = kindx + 1
     kindx = kindx % kloop
     kindx2 = kindx2 + 1
     kindx2 = kindx2 % kloop
  endif
endin

;------ basic 2 Operators FM algorithm ----------------
        instr 901
inotedur        =               p3
imaxamp         =               p4 ;ampdb(p4)
icarrfreq       =               p5
imodfreq        =               p6
ilowndx         =               p7
indxdiff        =               p8-p7
knote           =               p27
aampenv         linseg  p9, p14*p3, p10, p15*p3, p11, p16*p3, p12, p17*p3, p13 
adevenv         linseg  p18, p23*p3, p19, p24*p3, p20, p25*p3, p21, p26*p3, p22
amodosc         oscili  (ilowndx+indxdiff*adevenv)*imodfreq, imodfreq, 10 
acarosc         oscili  imaxamp*aampenv, icarrfreq+amodosc, 10 
                outs            acarosc, acarosc  
endin
</CsInstruments>
<CsScore>
f10 0 4096 10 1 ;sine wave                      
; p4 kstart  := index offset into the Farey Sequence
; p5 kloop   := end index into Farey Seq.
; p6 timefac := time in seconds for one loop to complete
; p7 fundam  := fundamental of the FM instrument
; p8 basenote:= root pitch of the midi voice output
; note that pitch structures of the midi file output are not equivalent to the
; ones used for the FM real-time synthesis.

;       start           dur             kstart  kloop   timefac fundam. basenote
i1      0.0             44              0       18      2       6.05    60
i1      4               30              0       18      3       7.05    72
i1      34              12              9       18      3       7.05    72
i1      10              12              0       18      1.5     8       84
i1      22              12              0       9       1.5     8       84
i1      15              16              0       18      1       5       48
i1      22              20              5       17      1.7     4       36

i1      46              20              3       11      2.5     7.04    71
i1      51              20              5       13      2.5     7.06    72

i1      73.5            1.5             11      18      1.5     5.05    48
i1      75              1               12      18      1       6.03    58      
e
</CsScore>
</CsoundSynthesizer>

These are the diagrams of the waveforms of the GENfarey routines, as used in the example:

gidelta ftgen 100,0,-18,"farey",7,1 - delta values of Farey Sequence 7
gidelta ftgen 100,0,-18,"farey",7,1 - delta values of Farey Sequence 7
gimult ftgen 101,0,-18,"farey",7,2 - generate the denominators of fractions of F_7
gimult ftgen 101,0,-18,"farey",7,2 - generate the denominators of fractions of F_7

See Also

Models and Emulations

Credits

Author: Georg Boenn
University of Glamorgan
2010

New in Csound version 5.13