zynaddsubfx

ZynAddSubFX open source synthesizer
Log | Files | Refs | Submodules | LICENSE

commit 7dbe0468c285731e145d1f23ff48ea53d1791fc5
parent 1ee6675936181b58db8473eea1d9771611bac0b6
Author: paulnasca <paulnasca>
Date:   Mon, 28 Feb 2005 22:30:29 +0000

*** empty log message ***

Diffstat:
MChangeLog | 3+++
Msrc/Misc/Master.C | 9+++++++++
Msrc/Misc/Master.h | 2+-
Msrc/UI/MasterUI.fl | 60+++++++++++++++++++++++++++++++++++++++++++++++++++++-------
4 files changed, 66 insertions(+), 8 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -768,6 +768,9 @@ 26 Feb 2005 - Corectata eroarea la windows si la OSS care facea ca pitch bend sa nu fie mapat corect (trebuie verificat) 27 Feb 2005 - Se afiseaza corect valoarea lui detune in centi 28 Feb 2005 - Corectata o mica eroare care facea ca sa nu se afiseze intotdeauna corect detune-ul la ADvoice + - Afisajul VU-meter la Master nu mai prezinta variatii mari in timp scurt + - Adaugata afisajul RMS la VU-meter + diff --git a/src/Misc/Master.C b/src/Misc/Master.C @@ -380,6 +380,15 @@ void Master::AudioOut(REALTYPE *outl,REALTYPE *outr){ if ((vuoutpeakl>1.0)||(vuoutpeakr>1.0)) vuclipped=1; if (vumaxoutpeakl<vuoutpeakl) vumaxoutpeakl=vuoutpeakl; if (vumaxoutpeakr<vuoutpeakr) vumaxoutpeakr=vuoutpeakr; + + //RMS Peak computation (for vumeters) + vurmspeakl=1e-12;vurmspeakr=1e-12; + for (i=0;i<SOUND_BUFFER_SIZE;i++) { + vurmspeakl+=outl[i]*outl[i]; + vurmspeakr+=outr[i]*outr[i]; + }; + vurmspeakl=sqrt(vurmspeakl/SOUND_BUFFER_SIZE); + vurmspeakr=sqrt(vurmspeakr/SOUND_BUFFER_SIZE); //Part Peak computation (for Part vumeters or fake part vumeters) for (npart=0;npart<NUM_MIDI_PARTS;npart++){ diff --git a/src/Misc/Master.h b/src/Misc/Master.h @@ -112,7 +112,7 @@ class Master{ //peaks for VU-meter void vuresetpeaks(); - REALTYPE vuoutpeakl,vuoutpeakr,vumaxoutpeakl,vumaxoutpeakr; + REALTYPE vuoutpeakl,vuoutpeakr,vumaxoutpeakl,vumaxoutpeakr,vurmspeakl,vurmspeakr; int vuclipped; //peaks for part VU-meters diff --git a/src/UI/MasterUI.fl b/src/UI/MasterUI.fl @@ -60,7 +60,7 @@ decl {\#include "../Misc/Util.h"} {public decl {\#include "../globals.h"} {public } -class VUMeter {: {public Fl_Box} +class VUMeter {open : {public Fl_Box} } { Function {VUMeter(int x,int y, int w, int h, const char *label=0):Fl_Box(x,y,w,h,label)} {} { code {master=NULL; @@ -70,15 +70,23 @@ npart=-1;} {} code {//the "part_" parameters sets the part (if it is >=0), else it sets the master master=master_; label(NULL); -npart=part_;} {} +npart=part_; +olddbl=0.0; +olddbr=0.0; +oldrmsdbl=0.0; +oldrmsdbr=0.0;} {} } - Function {draw_master()} {} { + Function {draw_master()} {open + } { code {\#define MIN_DB (-48) + int ox=x(); int oy=y(); int lx=w(); int ly=h(); pthread_mutex_lock(&master->mutex); REALTYPE dbl=rap2dB(master->vuoutpeakl); REALTYPE dbr=rap2dB(master->vuoutpeakr); +REALTYPE rmsdbl=rap2dB(master->vurmspeakl); +REALTYPE rmsdbr=rap2dB(master->vurmspeakr); REALTYPE maxdbl=rap2dB(master->vumaxoutpeakl); REALTYPE maxdbr=rap2dB(master->vumaxoutpeakr); int clipped=master->vuclipped; @@ -92,6 +100,12 @@ dbr=(MIN_DB-dbr)/MIN_DB; if (dbr<0.0) dbr=0.0; else if (dbr>1.0) dbr=1.0; +dbl=dbl*0.4+olddbl*0.6; +dbr=dbr*0.4+olddbr*0.6; + +olddbl=dbl; +olddbr=dbr; + \#define VULENX (lx-35) \#define VULENY (ly/2-3) @@ -100,9 +114,38 @@ dbl*=VULENX;dbr*=VULENX; int idbl=(int) dbl; int idbr=(int) dbr; +//compute RMS - start +rmsdbl=(MIN_DB-rmsdbl)/MIN_DB; +if (rmsdbl<0.0) rmsdbl=0.0; + else if (rmsdbl>1.0) rmsdbl=1.0; + +rmsdbr=(MIN_DB-rmsdbr)/MIN_DB; +if (rmsdbr<0.0) rmsdbr=0.0; + else if (rmsdbr>1.0) rmsdbr=1.0; + +rmsdbl=rmsdbl*0.4+oldrmsdbl*0.6; +rmsdbr=rmsdbr*0.4+oldrmsdbr*0.6; + +oldrmsdbl=rmsdbl; +oldrmsdbr=rmsdbr; + + +rmsdbl*=VULENX;rmsdbr*=VULENX; + +int irmsdbl=(int) rmsdbl; +int irmsdbr=(int) rmsdbr; +//compute RMS - end + + + //draw the vu-meter lines -fl_rectf(ox,oy,idbr,VULENY,0,200,255); -fl_rectf(ox,oy+ly/2,idbl,VULENY,0,200,255); +//db +fl_rectf(ox,oy,idbr,VULENY,80,255,170); +fl_rectf(ox,oy+ly/2,idbl,VULENY,80,255,170); +//rms +fl_rectf(ox,oy,irmsdbr,VULENY,0,200,255); +fl_rectf(ox,oy+ly/2,irmsdbl,VULENY,0,200,255); +//black fl_rectf(ox+idbr,oy,VULENX-idbr,VULENY,0,0,0); fl_rectf(ox+idbl,oy+ly/2,VULENX-idbl,VULENY,0,0,0); @@ -130,7 +173,8 @@ if ((maxdbl>MIN_DB-20)){ if ((maxdbr>MIN_DB-20)){ snprintf((char *)&tmpstr,10,"%ddB",(int)maxdbl); fl_draw(tmpstr,ox+VULENX+1,oy+ly/2+1,lx-VULENX-1,VULENY,FL_ALIGN_RIGHT,NULL,0); -};} {} +};} {selected + } } Function {draw_part()} {} { code {\#define MIN_DB (-48) @@ -207,6 +251,8 @@ return(1);} {} } decl {Master *master;} {} decl {int npart;} {} + decl {float olddbl,olddbr;} {} + decl {float oldrmsdbl,oldrmsdbr;} {} } class SysEffSend {: {public WidgetPDial} @@ -378,7 +424,7 @@ if (fl_ask("Exit and leave the unsaved data?")) *exitprogram=1; \#endif} xywh {353 127 390 465} type Double hide } { - Fl_Menu_Bar mastermenu {selected + Fl_Menu_Bar mastermenu { xywh {-5 0 690 25} } { submenu {} {