-- Delay-related components for OAK. #INCLUDE "oak.inc" #USE "basic" --{{{ PROC delay.line -- FIXME Rework this VAL INT max.delay IS 100000: PROC delay.line (CHAN SIGNAL in?, VAL INT length, CHAN SIGNAL out!) CHAN REAL32 in.t, out.t: PAR to.single (in?, in.t!) INITIAL [max.delay]REAL32 buf IS [i = 0 FOR max.delay | 0.0]: INITIAL INT pos IS 0: WHILE TRUE REAL32 s: SEQ -- done in parallel to avoid deadlocking echo PAR in.t ? s out.t ! buf[pos] buf[pos] := s pos := (pos + 1) \ length from.single (out.t?, out!) : --}}} --{{{ PROC reverb --* Not a very good reverb -- this is just a single slapback echo. PROC reverb (CHAN SIGNAL in?, out!, VAL INT length, VAL REAL32 feedback) CHAN SIGNAL a, b, c: PAR da (in?, [a!, b!]) delay.line (b?, length, c!) mixer ([a?, c?], [1.0 - feedback, feedback], out!) : --}}} --{{{ PROC echo PROC echo (CHAN SIGNAL in?, out!, VAL INT length, VAL REAL32 feedback) CHAN SIGNAL a, b, c: PAR mixer ([in?, a?], [1.0 - feedback, feedback], b!) da (b?, [out!, c!]) delay.line (c?, length, a!) : --}}}