View Single Post
  #13  
Old 18.06.2004, 07:04 AM
dries dries is offline
Newbie
Newbie
 
Join Date: 20.10.2002
Location: austria
Posts: 78
Default

programming a dsp is about the most difficult of progamming anyway - that's not just writing a bit of c++. what they did at access was emulating original hardware sturkture by software modules. tough work in the beginning, but it helps later on creating a kind of sound and new features and functions. you have to know a lot of electronics and dsp and must be a absolut programming genious to create the corresponding lines of asm for the dsp. this kind of stuff: exerpt from:

Digital Plate-Class Reverberation Audio Effect - Griesinger's Model *
* Described by Jon Dattorro in "Effect Design Part 1: Reverberator and *
* Other Filters, " Journal of the Audio Engineering Society," Vol. 45, *
* No. 9, pp. 660-684


change_reverb_settings:
bit set mode1 SRRFH; /* enable background register file */
NOP; /* 1 CYCLE LATENCY FOR WRITING TO MODE1 REGISER!! */

/* if flag2_in jump change_parameter; */

r13 = 6; /* number of presets */
r15 = DM(IRQ1_counter); /* get preset count */
r15 = r15 + 1; /* increment preset */
comp (r15, r13);
if ge r15 = r15 - r15; /* reset to zero */
DM(IRQ1_counter) = r15; /* save preset count */

r10 = pass r15; /* get preset mode */
if eq jump reverb_settings_2; /* check for count == 0 */
r10 = r10 - 1;
if eq jump reverb_settings_3; /* check for count == 1 */
r10 = r10 - 1;
if eq jump reverb_settings_4; /* check for count == 3 */
r10 = r10 - 1;
if eq jump reverb_settings_5; /* check for count == 4 */
r10 = r10 - 1;
if eq jump reverb_settings_6; /* check for count == 5 */

reverb_settings_1: /* count therefore, is == 6 if you are here */
r14 = 0x40000000; DM(decay) = r14;
r14 = 0x7f5c28f6; DM(bandwidth) = r14;
r14 = 0x0010624d; DM(damping) = r14;
r14 = 0x5999999a; DM(decay_diffusion_1) = r14; /* = 0.50, Decorrelates tank signals */
r14 = 0x40000000; DM(decay_diffusion_2) = r14; /* decay diffusion 2 = decay +0.15, floor = 0.25, ceiling - 0.50 */
r14 = 0x60000000; DM(input_diffusion_1) = r14; /* = 0.75, Decorrelates incoming signal */
r14 = 0x50000000; DM(input_diffusion_2) = r14; /* = 0.625, Decorrelates incoming signal */
bit set ustat1 0x3E; /* turn on Flag4 LED */
bit clr ustat1 0x01;
dm(IOSTAT)=ustat1;
jump done;

reverb_settings_2:
r14 = 0x007fffff; DM(decay) = r14;
r14 = 0x60124321; DM(bandwidth) = r14;
r14 = 0x000007ff; DM(damping) = r14;
r14 = 0x00100000; DM(decay_diffusion_1) = r14;
r14 = 0x00100000; DM(decay_diffusion_2) = r14;
r14 = 0x50000000; DM(input_diffusion_1) = r14;
r14 = 0x60000000; DM(input_diffusion_2) = r14;
bit set ustat1 0x3D; /* turn on Flag5 LED */
bit clr ustat1 0x02;
dm(IOSTAT)=ustat1;
jump done;

reverb_settings_3:
r14 = 0x10000000; DM(decay) = r14;
r14 = 0x6f5c28f6; DM(bandwidth) = r14;
r14 = 0x000fffff; DM(damping) = r14;
r14 = 0x01000000; DM(decay_diffusion_1) = r14;
r14 = 0x02000000; DM(decay_diffusion_2) = r14;
r14 = 0x60000000; DM(input_diffusion_1) = r14;
r14 = 0x50000000; DM(input_diffusion_2) = r14;
bit set ustat1 0x3B; /* turn on Flag6 LED */
bit clr ustat1 0x04;
dm(IOSTAT)=ustat1;
jump done;

reverb_settings_4:
r14 = 0x40000000; DM(decay) = r14;
r14 = 0x7f5c28f6; DM(bandwidth) = r14;
r14 = 0x0050624d; DM(damping) = r14;
r14 = 0x70000000; DM(decay_diffusion_1) = r14;
r14 = 0x40000000; DM(decay_diffusion_2) = r14;
r14 = 0x60000000; DM(input_diffusion_1) = r14;
r14 = 0x50000000; DM(input_diffusion_2) = r14;
bit set ustat1 0x37; /* turn on Flag7 LED */
bit clr ustat1 0x08;
dm(IOSTAT)=ustat1;
jump done;

reverb_settings_5:
r14 = 0x57000000; DM(decay) = r14;
r14 = 0x3f5c28f6; DM(bandwidth) = r14;
r14 = 0x0001004d; DM(damping) = r14;
r14 = 0x72222222; DM(decay_diffusion_1) = r14;
r14 = 0x60000000; DM(decay_diffusion_2) = r14;
r14 = 0x60000000; DM(input_diffusion_1) = r14;
r14 = 0x50000000; DM(input_diffusion_2) = r14;
bit set ustat1 0x2F; /* turn on Flag8 LED */
bit clr ustat1 0x10;
dm(IOSTAT)=ustat1;
jump done;

reverb_settings_6:
r14 = 0x50000000; DM(decay) = r14;
r14 = 0x5f5c28f6; DM(bandwidth) = r14;
r14 = 0x0000004d; DM(damping) = r14;
r14 = 0x72222222; DM(decay_diffusion_1) = r14;
r14 = 0x60000000; DM(decay_diffusion_2) = r14;
r14 = 0x60000000; DM(input_diffusion_1) = r14;
r14 = 0x50000000; DM(input_diffusion_2) = r14;
bit set ustat1 0x1F; /* turn on Flag9 LED */
bit clr ustat1 0x20;
dm(IOSTAT)=ustat1;

done:
rti(db);
bit clr mode1 SRRFH; /* switch back to primary register set */
nop; /* 1 cycle latency for switching to occur */


/* ------------------------------------------------------------------------------------ */
/* */
/* IRQ2 Pushbutton Interrupt Service Routine */
/* */
/* This routine allows the user to modify reverb presets on-the-fly to allow for */
/* control of the predelay and left right panning of the reverb response */
/* */
/* Also note, early reflections and later reverberations are panned differently */
/* between left and right channels for all reverb presets. For example, early */
/* reflections may come from the left speaker, while the later reverberations */
/* come from the right speaker. */
/* */
/* yL(n)=0.33*(Gain)*x(n) +0.33*(Gain)*x(rev_result) + 0.33*(Gain)*x(predelay) */
/* yR(n)=0.33*(Gain)*x(n) +0.33*(Gain)*x(rev_result) + 0.33*(Gain)*x(predelay) */
/* ------------------------------------------------------------------------------------ */

modify_reverb_mix:
bit set mode1 SRRFH; /* enable background register file */
NOP; /* 1 CYCLE LATENCY FOR WRITING TO MODE1 REGISER!! */

r13 = 6; /* number of presets */
r15 = DM(IRQ2_counter); /* get preset count */
r15 = r15 + 1; /* increment preset */
comp (r15, r13);
if ge r15 = r15 - r15; /* reset to zero */
DM(IRQ2_counter) = r15; /* save preset count */

r10 = pass r15; /* get preset mode */
if eq jump reverb_mix_2; /* check for count == 0 */
r10 = r10 - 1;
if eq jump reverb_mix_3; /* check for count == 1 */
r10 = r10 - 1;
if eq jump reverb_mix_4; /* check for count == 3 */
r10 = r10 - 1;
if eq jump reverb_mix_5; /* check for count == 4 */
r10 = r10 - 1;
if eq jump reverb_mix_6; /* check for count == 5 */

reverb_mix_1: /* count therefore, is == 6 if you are here */
r14 = 0x7FFFFFFF; DM(DRY_GAIN_LEFT) = r14;
r14 = 0x1FFFFFFF; DM(DRY_GAIN_RIGHT) = r14;
r14 = 0x00000000; DM(PREDEL_GAIN_LEFT) = r14;
r14 = 0x0FFFFFFF; DM(PREDEL_GAIN_RIGHT) = r14;
r14 = 0x57FFFFFF; DM(WET_GAIN_LEFT) = r14;
r14 = 0x7FFFFFFF; DM(WET_GAIN_RIGHT) = r14;
r14 = 200; DM(predelay_time) = r14;
bit clr ustat1 0x3E; /* turn on Flag4 LED */
bit set ustat1 0x01;
dm(IOSTAT)=ustat1;
jump exit;

reverb_mix_2:
r14 = 0x00000000; DM(DRY_GAIN_LEFT) = r14;
r14 = 0x7FFFFFFF; DM(DRY_GAIN_RIGHT) = r14;
r14 = 0x00000000; DM(PREDEL_GAIN_LEFT) = r14;
r14 = 0x00000000; DM(PREDEL_GAIN_RIGHT) = r14;
r14 = 0x7FFFFFFF; DM(WET_GAIN_LEFT) = r14;
r14 = 0x00000000; DM(WET_GAIN_RIGHT) = r14;
r14 = 1000; DM(predelay_time) = r14;
bit clr ustat1 0x3D; /* turn on Flag5 LED */
bit set ustat1 0x02;
dm(IOSTAT)=ustat1;
jump exit;

reverb_mix_3:
r14 = 0x00000000; DM(DRY_GAIN_LEFT) = r14;
r14 = 0x7FFFFFFF; DM(DRY_GAIN_RIGHT) = r14;
r14 = 0x00000000; DM(PREDEL_GAIN_LEFT) = r14;
r14 = 0x00000000; DM(PREDEL_GAIN_RIGHT) = r14;
r14 = 0x7FFFFFFF; DM(WET_GAIN_LEFT) = r14;
r14 = 0x2FFFFFFF; DM(WET_GAIN_RIGHT) = r14;
r14 = 2500; DM(predelay_time) = r14;
bit clr ustat1 0x3B; /* turn on Flag6 LED */
bit set ustat1 0x04;
dm(IOSTAT)=ustat1;
jump exit;

reverb_mix_4:
r14 = 0x7FFFFFFF; DM(DRY_GAIN_LEFT) = r14;
r14 = 0x7FFFFFFF; DM(DRY_GAIN_RIGHT) = r14;
r14 = 0x00000000; DM(PREDEL_GAIN_LEFT) = r14;
r14 = 0x7FFFFFFF; DM(PREDEL_GAIN_RIGHT) = r14;
r14 = 0x7FFFFFFF; DM(WET_GAIN_LEFT) = r14;
r14 = 0x00000000; DM(WET_GAIN_RIGHT) = r14;
r14 = 4000; DM(predelay_time) = r14;
bit clr ustat1 0x37; /* turn on Flag7 LED */
bit set ustat1 0x08;
dm(IOSTAT)=ustat1;
jump exit;

reverb_mix_5:
r14 = 0x00000000; DM(DRY_GAIN_LEFT) = r14;
r14 = 0x00000000; DM(DRY_GAIN_RIGHT) = r14;
r14 = 0x00000000; DM(PREDEL_GAIN_LEFT) = r14;
r14 = 0x00000000; DM(PREDEL_GAIN_RIGHT) = r14;
r14 = 0x7FFFFFFF; DM(WET_GAIN_LEFT) = r14;
r14 = 0x7FFFFFFF; DM(WET_GAIN_RIGHT) = r14;
r14 = 1200; DM(predelay_time) = r14;
bit clr ustat1 0x2F; /* turn on Flag8 LED */
bit set ustat1 0x10;
dm(IOSTAT)=ustat1;
jump exit;

reverb_mix_6:
r14 = 0x7FFFFFFF; DM(DRY_GAIN_LEFT) = r14;
r14 = 0x3FFFFFFF; DM(DRY_GAIN_RIGHT) = r14;
r14 = 0x00000000; DM(PREDEL_GAIN_LEFT) = r14;
r14 = 0x7FFFFFFF; DM(PREDEL_GAIN_RIGHT) = r14;
r14 = 0x7FFFFFFF; DM(WET_GAIN_LEFT) = r14;
r14 = 0x7FFFFFFF; DM(WET_GAIN_RIGHT) = r14;
r14 = 1200; DM(predelay_time) = r14;
bit clr ustat1 0x1F; /* turn on Flag9 LED */
bit set ustat1 0x20;
dm(IOSTAT)=ustat1;

exit:
rti(db);
bit clr mode1 SRRFH; /* switch back to primary register set */
nop; /* 1 cycle latency for switching to occur */

still want to program a dsp?

good luck.
Reply With Quote