The Csound Blog By Jacob Joaquin http://csound.noisepages.com/ jacobjoaquin@gmail.com sr = 44100 kr = 4410 ksmps = 10 nchnls = 1 0dbfs = 1.0 ; Instruments # define RecordType # 1 # # define RecordField # 2 # # define Record # 3 # # define RecordSet # 4 # # define Synth # 5 # opcode RecordType, i, i ; Creates a new RecordType, stored as an f-table ; ifn - Function number of record type ifn xin ; RecordType data alignment offsets: ; 0 - number of fields in record ; 1 - does nothing ifn2 ftgen ifn, 0, -2, -2, 0, 0 ; Create table, all points set to 0 ; Return function number of generated RecordType xout ifn2 prints "RecordType: %d\n", ifn2 endop opcode RecordField, 0, iS ; Appends a field to a RecordType ; irecord_type - Function number of a RecordType ; Sfield_name - Name of the field irecord_type, Sfield_name xin ; Offset for "number of registered fields" ioffset_n_fields = 0 ; Increment the number of fields of RecordType in_fields tab_i ioffset_n_fields, irecord_type in_fields = in_fields + 1 tabw_i in_fields, ioffset_n_fields, irecord_type ; Create chn name string for storing the offset of the RecordField ; chn name format: RECORDTYPE__recordType__nameOfField__ Sd = "__" ; delimiter Sname sprintf "RECORDTYPE%s%d%s%s", Sd, irecord_type, Sd, Sfield_name ; Create RecordField offset chn_k Sname, 3 chnset in_fields, Sname ; Set the offset Sprint strcat "RecordField: ", Sname Sprint strcat Sprint, "\n" prints Sprint endop opcode Record, i, ii ; Creates a new Record from RecordType ; irecord - function number of Record to create ; irecord_type - function number of a RecordType irecord, irecord_type xin ; Record data alignment: ; 0 - record type ; 1+ - field data ; Create Record ifields tab_i 0, irecord_type ; Number of fields irecord2 ftgen irecord, 0, -1 * (ifields + 1), 10, 0 ; Create zeroed table tabw_i irecord_type, 0, irecord ; Embed RecordType ; Return function number of generated Record xout irecord2 prints "Record: %d %d\n", irecord, irecord_type endop opcode RecordSet, 0, iSi ; Sets the value of a field in a Record ; irecord - Function number of record ; Sfiend_name - Name of record field irecord, Sfield_name, ivalue xin irecord_type tab_i 0, irecord ; Create internal chn name string that stores the offset ; chn name format: RECORDTYPE__recordType__nameOfField__ Sd = "__" ; delimiter Sname sprintf "RECORDTYPE%s%d%s%s", Sd, irecord_type, Sd, Sfield_name ; Get field offset ioffset chnget Sname ; Write value to field tabw_i ivalue, ioffset, irecord Sinput sprintf "RecordSet: %f %s %d\n", irecord, Sfield_name, ivalue prints Sinput endop opcode RecordGet, i, Si ; Gets the value of a field from a record ; Sfield_name - Name of record field ; irecord - Function number of a record Sfield_name, irecord xin ; Get RecordType from the record irecord_type tab_i 0, irecord ; Create internal chn name string that stores the offset ; chn name format: RECORDTYPE__recordType__nameOfField__ Sd = "__" ; delimiter Sname sprintf "RECORDTYPE%s%d%s%s", Sd, irecord_type, Sd, Sfield_name ; Get field offset ioffset chnget Sname ; Get the value from the record ivalue tab_i ioffset, irecord ; Return the value xout ivalue endop instr $RecordType irecord_table_fn = p4 itemp RecordType irecord_table_fn turnoff endin instr $RecordField irecord_table_fn = p4 Sfield strget p5 RecordField irecord_table_fn, Sfield turnoff endin instr $Record irecord_fn = p4 irecord_table_fn = p5 imy_record Record irecord_fn, irecord_table_fn turnoff endin instr $RecordSet irecord_fn = p4 Sfield strget p5 ivalue = p6 RecordSet irecord_fn, Sfield, ivalue turnoff endin instr $Synth irecord = p4 ; Record function number iamp RecordGet "amp", irecord ; Get amplitude from record ifreq RecordGet "freq", irecord ; Get frequency from record iftable RecordGet "ftable", irecord ; Get ftable from record a1 oscil iamp, ifreq, iftable, -1 out a1 endin ; Instruments # define RecordType # 1 # # define RecordField # 2 # # define Record # 3 # # define RecordSet # 4 # # define Synth # 5 # ; Single cycle waves f 1 0 8192 10 1 f 2 0 8192 10 1 0.5 f 3 0 8192 10 1 0.1 0.2 ; Create a record type i $RecordType 0 1 100 ; Record type stored at fn 100 i $RecordField 0 1 100 "amp" ; Append field "amp" i $RecordField 0 1 100 "freq" ; Append field "freq" i $RecordField 0 1 100 "ftable" ; Append field "ftable" ; Create a record and store values i $Record 0 1 200 100 ; Instantiate record 200 from type 100 i $RecordSet 0 1 200 "amp" 0.5 ; Set field "amp" i $RecordSet 0 1 200 "freq" 440 ; Set field "freq" i $RecordSet 0 1 200 "ftable" 1 ; Set field "ftable" ; Create a record and store values i $Record 0 1 201 100 ; Instantiate record 201 from type 100 i $RecordSet 0 1 201 "amp" 0.25 ; Set field "amp" i $RecordSet 0 1 201 "freq" 330 ;Set field "freq" i $RecordSet 0 1 201 "ftable" 2 ; Set field "ftable" ; Create a record and store values i $Record 0 1 202 100 ; Instantiate record 202 from type 100 i $RecordSet 0 1 202 "amp" 0.125 ; Set field "amp" i $RecordSet 0 1 202 "freq" 880 ;Set field "freq" i $RecordSet 0 1 202 "ftable" 3 ; Set field "ftable" i $Synth 0 1 200 ; Feed synth record 200 i $Synth 1 1 201 ; Feed synth record 201 i $Synth 2 1 202 ; Feed synth record 202 e 3