Commit 36c41914 authored by Monty Montgomery's avatar Monty Montgomery

Modify reverb routing in the mixdown panels.

In previous versions of Postfish, the stereo reverb output of a
channel reverb had to be explicitly mixed into an output channel using
the direct mixdown blocks or the reverb is inaudible.  You needed to
use the direct mixdown blocks to get reverb even when otherwise only
using the stereo crossplacer to produce a mixdown.

As of now, when using the Crossplacer in a mixdown panel, a channel's
reverb A output will be mixed directly into all active 'output A'
outputs, and the channel's reverb B output likewise mixed directly
into all active 'output B' outputs.  It is mixed according to the
master delay/attenuation sliders on the attenuation panel, but it does
not use the delay/attenuation settings of the crossplacer; this way
the channel can be mixed anywhere into a stereo image and the reverb
will still present the same image of space.



git-svn-id: https://svn.xiph.org/trunk/postfish@8581 0101bb08-14d6-0310-b084-bc0e0c8e3800
parent 4a8fa205
......@@ -131,22 +131,12 @@ Mixdown:
A-B slider then controls how far the input apparently images toward
the A output bank or the B output bank.
The mixdown blocks can also be configured to take as input not only
the input channel, but also each channel's left (A) or right (B)
reverb output. For example, reverb left can be mixed to the left
output, the reverb right mixed to the right channel and the original
input crossplaced somewhere between left or right. The input
placement can be altered on the fly thus apparently moving the
input's location while the impression of space the reverb creates
holds still. For even more realism, adding an additional delay of 10
ms or so to the reverb (sound travels roughly one meter in 3 ms) can
pull the original image closer without losing the impression of
reverberation in a medium-to-large hall. A reverb delay also allows
the use of a faster/tighter reverb time without losing the
the impression of size.
Of course, with eight channels, one can begin imaging/mastering for
more than just stereo...
The direct mixdown blocks allow additional manual control over the
input->output matrix; the direct mixdown blocks run in parallel with
the crossplacer and all may be active simultaneously.
Of course, with eight output channels, one can begin
imaging/mastering for more than just stereo...
>>>> Don't we already have several free apps that do this sort of thing?
......@@ -270,11 +260,13 @@ Mixdown:
Only two things are probably impossible to figure out just from
an afternoon of playing around:
1) Output from a reverb effect in the "channel" panel is sent to a
separate internal stereo bus. The reverb has to be explicitly
mixed into the output on a 'mix' panel. When postfish starts for
the first time, the default setup mixes one side of the reverb
pair back into left or right.
1) When Postfish starts for the first time, all input channels are
mixed into the center of a two channel output. If, for example,
the input is already two stereo channels and the output should be
the same, the proper mixdown configuration is to go to the
mixdown panels for channel 1 and channel 2 and then set input
channel 1 to mix only into output channel 1 and input channel 2
to only output channel 2.
2) Turning "Atten/Mix" off for any channel will mute it completely
in all input effects, not just in the mixdown (this obviously
......
......@@ -349,43 +349,6 @@ time_linkage *mix_read(time_linkage *in,
int placer=ms.curr[i].placer_place;
int placerP=ms.prev[i].placer_place;
float relA=(placer>100 ? placer*.01-1. : 0.);
float relB=(placer<100 ? 1.-placer*.01 : 0.);
float relAP=(placerP>100 ? placerP*.01-1. : 0.);
float relBP=(placerP<100 ? 1.-placerP*.01 : 0.);
float attA=
fromdB((ms.curr[i].master_att +
ms.curr[i].placer_att * relA)*.1);
float attB=
fromdB((ms.curr[i].master_att +
ms.curr[i].placer_att * relB)*.1);
int delA=
rint((ms.curr[i].master_delay +
ms.curr[i].placer_delay * relA)*.00001*input_rate);
int delB=
rint((ms.curr[i].master_delay +
ms.curr[i].placer_delay * relB)*.00001*input_rate);
float attAP=
fromdB((ms.prev[i].master_att +
ms.prev[i].placer_att * relAP)*.1);
float attBP=
fromdB((ms.prev[i].master_att +
ms.prev[i].placer_att * relBP)*.1);
int delAP=
rint((ms.prev[i].master_delay +
ms.prev[i].placer_delay * relAP)*.00001*input_rate);
int delBP=
rint((ms.prev[i].master_delay +
ms.prev[i].placer_delay * relBP)*.00001*input_rate);
/* place mix */
{
int mixedA=0,mixedB=0;
......@@ -401,10 +364,26 @@ time_linkage *mix_read(time_linkage *in,
outactive[j]=1;
if(!mixedA){
float relA=(placer>100 ? placer*.01-1. : 0.);
float relAP=(placerP>100 ? placerP*.01-1. : 0.);
float attA=fromdB((ms.curr[i].master_att + ms.curr[i].placer_att * relA)*.1);
float attAP=fromdB((ms.prev[i].master_att + ms.prev[i].placer_att * relAP)*.1);
int delA=rint((ms.curr[i].master_delay + ms.curr[i].placer_delay * relA)*.00001*input_rate);
int delAP=rint((ms.prev[i].master_delay + ms.prev[i].placer_delay * relAP)*.00001*input_rate);
float attA_r=fromdB(ms.curr[i].master_att*.1);
float attAP_r=fromdB(ms.prev[i].master_att*.1);
int delA_r=rint(ms.curr[i].master_delay*.00001*input_rate);
int delAP_r=rint(ms.prev[i].master_delay*.00001*input_rate);
memset(mixA,0,sizeof(mixA));
mixwork(in->data[i],ms.cacheP[i],ms.cachePP[i],
mixA,attA,delA,0,attAP,delAP,0);
mixwork(inA->data[i],ms.cachePA[i],ms.cachePPA[i],
mixA,attA_r,delA_r,0,attAP_r,delAP_r,0);
mixedA=1;
}
mixadd(mixA,ms.out.data[j],destA,destAP);
}
......@@ -412,9 +391,24 @@ time_linkage *mix_read(time_linkage *in,
outactive[j]=1;
if(!mixedB){
float relB=(placer<100 ? 1.-placer*.01 : 0.);
float relBP=(placerP<100 ? 1.-placerP*.01 : 0.);
float attB=fromdB((ms.curr[i].master_att + ms.curr[i].placer_att * relB)*.1);
float attBP=fromdB((ms.prev[i].master_att + ms.prev[i].placer_att * relBP)*.1);
int delB=rint((ms.curr[i].master_delay + ms.curr[i].placer_delay * relB)*.00001*input_rate);
int delBP= rint((ms.prev[i].master_delay + ms.prev[i].placer_delay * relBP)*.00001*input_rate);
float attB_r=fromdB(ms.curr[i].master_att*.1);
float attBP_r=fromdB(ms.prev[i].master_att*.1);
int delB_r=rint(ms.curr[i].master_delay*.00001*input_rate);
int delBP_r= rint(ms.prev[i].master_delay*.00001*input_rate);
memset(mixB,0,sizeof(mixB));
mixwork(in->data[i],ms.cacheP[i],ms.cachePP[i],
mixB,attB,delB,0,attBP,delBP,0);
mixwork(inB->data[i],ms.cachePB[i],ms.cachePPB[i],
mixB,attB_r,delB_r,0,attBP_r,delBP_r,0);
mixedB=1;
}
mixadd(mixB,ms.out.data[j],destB,destBP);
......
......@@ -351,6 +351,9 @@ static mix_panelsave *mixpanel_create_helper(postfish_mainpanel *mp,
ps->destA[i]=bA;
ps->destB[i]=bB;
}
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ps->destA[0]),1);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ps->destB[1]),1);
gtk_table_attach(GTK_TABLE(table),lA,0,2,6,7,
0,0,0,0);
......@@ -469,11 +472,6 @@ static mix_panelsave *mixpanel_create_helper(postfish_mainpanel *mp,
G_CALLBACK (toggle_callback),
(gpointer)&m->insert_source[i][2]);
if(i==0){
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bM),1);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(bA),1);
}
for(j=0;j<OUTPUT_CHANNELS;j++){
char buffer[80];
GtkWidget *b;
......@@ -485,9 +483,6 @@ static mix_panelsave *mixpanel_create_helper(postfish_mainpanel *mp,
G_CALLBACK (toggle_callback),
(gpointer)&m->insert_dest[i][j]);
if(thisch%2 == j && i == 0)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(b),1);
ps->insert_dest[i][j]=b;
gtk_box_pack_start(GTK_BOX(boxB),b,1,1,0);
......
#define VERSION "$Id$ "
/* DO NOT EDIT: Automated versioning hack [Sun Jan 2 21:30:12 EST 2005] */
/* DO NOT EDIT: Automated versioning hack [Sun Jan 2 22:19:56 EST 2005] */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment