Analog Modular Controls Csound Grain Synth Jacob Joaquin May 28, 2010 jacobjoaquin@gmail.com csoundblog.com sr = 44100 kr = 441 ksmps = 100 nchnls = 2 0dbfs = 1 # define LoadSample # 1 # # define ModularInput # 2 # # define GrainTrigger # 3 # # define Grain # 4 # # define PrintInfo # 5 # # define WriteFile # 6 # chn_a "foo", 3 chn_a "bar", 3 chn_k "kfoo", 3 chn_k "kbar", 3 chn_a "fileout", 3 opcode objcreate_k, 0, SS Sobject, Smember xin Sname sprintf "%s.%s", Sobject, Smember chn_k Sname, 3 endop opcode objcreate_a, 0, SS Sobject, Smember xin Sname sprintf "%s.%s", Sobject, Smember chn_a Sname, 3 endop opcode objcreate_S, 0, SS Sobject, Smember xin Sname sprintf "%s.%s", Sobject, Smember chn_S Sname, 3 endop opcode objset_i, 0, iSS ival, Sobject, Smember xin Sname sprintf "%s.%s", Sobject, Smember chnset ival, Sname endop opcode objset_k, 0, kSS kval, Sobject, Smember xin Sname sprintf "%s.%s", Sobject, Smember chnset kval, Sname endop opcode objset_a, 0, aSS aval, Sobject, Smember xin Sname sprintf "%s.%s", Sobject, Smember chnset aval, Sname endop opcode objget_i, i, SS Sobject, Smember xin Sname sprintf "%s.%s", Sobject, Smember iout chnget Sname xout iout endop opcode objget_k, k, SS Sobject, Smember xin Sname sprintf "%s.%s", Sobject, Smember kout chnget Sname xout kout endop instr $LoadSample ifn = p4 ; Table number to store sample Sfile strget p5 ; Filename ichannel = p6 ; 0 = mixed mono, 1 = left, 2 = right inbeats = p7 ; Number of beats/quarter notes in the sample isamplerate filesr Sfile ; samplerate of file ilength filelen Sfile ilength = ilength * isamplerate ; length of filein samples itempo = isamplerate / ilength * inbeats * 60 ; tempo of soundfile ; Define object variable structure Sobject sprintf "f%d", ifn ; example: "f500", "f500.filename" ; Create software busses objcreate_k Sobject, "ifn" objcreate_k Sobject, "samplerate" objcreate_k Sobject, "length" objcreate_k Sobject, "tempo" objcreate_k Sobject, "nbeats" ; Set Values objset_i ifn, Sobject, "ifn" objset_i ilength, Sobject, "length" objset_i itempo, Sobject, "tempo" objset_i inbeats, Sobject, "nbeats" ; Load sample into Table isize = 1 repeat: isize = isize * 2 if( isize < ilength ) goto repeat gitemp ftgen ifn, 0, isize, 1, Sfile, 0, 0, ichannel ; Write file information to message window Sinfo1 sprintf "\nObject Number = %d\nFile Name = %s\nLength = %d\n", ifn,\ Sfile, ilength Sinfo2 sprintf "Samplerate = %d\nTempo = %0.4f\nTable size = %d\n\n",\ isamplerate, itempo, isize prints Sinfo1 prints Sinfo2 turnoff endin instr $ModularInput a1, a2 ins k1 downsamp a1 k2 downsamp a2 chnset a1, "foo" chnset a2, "bar" chnset k1, "kfoo" chnset k2, "kbar" endin instr $GrainTrigger a1 chnget "foo" a2 chnget "bar" k1 chnget "kfoo" k2 chnget "kbar" krms rms a1 kout trigger krms, 0.5, 0 ;printk 0.05, krms ;printk 0.05, k2 iamp = 2 if kout > 0.5 then ; event "i", 4, 0, 1, k2 event "i", $Grain, 0, 1, k2 ; event "i", 6, 0, 1, k2 * iamp endif endin instr $Grain ifn = 1 ; Get information about original file Sobject sprintf "f%d", 1 ilength objget_i Sobject, "length" p3 = 0.1 ig = (p4 + 1) / 2 * ilength ; Grain position a3 linseg 0, 0.01, 1, p3 - 0.01, 0 a1 line 0, p3, 1 a2 tablei ig + a1 * 6000, ifn aout = a2 * a3 * 0.5 outs aout, aout chnmix aout, "fileout" endin instr $PrintInfo print p4 turnoff endin instr $WriteFile a1 chnget "fileout" fout "grainfoo.aif", 2, a1 chnclear "fileout" endin # define LoadSample # 1 # # define ModularInput # 2 # # define GrainTrigger # 3 # # define Grain # 4 # # define PrintInfo # 5 # # define WriteFile # 6 # # define DURATION # 120 # i $LoadSample 0 1 1 "./acoustic_guitar.aif" 0 8 i $ModularInput 0 $DURATION i $GrainTrigger 0 $DURATION i $WriteFile 0 $DURATION