3 # This file is part of jack_mixer
5 # Copyright (C) 2006 Nedko Arnaudov <nedko@arnaudov.name>
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; version 2 of the License
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
24 '''Encapsulates scale linear function edge and coefficients for scale = a * dB + b formula'''
25 def __init__(self
, db
, scale
):
28 self
.text
= "%.0f" % math
.fabs(db
)
30 def calculate_coefficients(self
, prev
):
31 self
.a
= (prev
.scale
- self
.scale
) / (prev
.db
- self
.db
)
32 self
.b
= self
.scale
- self
.a
* self
.db
33 #print "%.0f dB - %.0f dB: scale = %f * dB + %f" % (prev.db, self.db, self.a, self.b)
35 def db_to_scale(self
, db
):
36 return self
.a
* db
+ self
.b
38 def scale_to_db(self
, scale
):
39 return (scale
- self
.b
) / self
.a
42 '''Scale abstraction, various scale implementation derive from this class'''
43 def __init__(self
, scale_id
, description
):
46 self
.db_max
= fpconst
.NegInf
47 self
.scale_id
= scale_id
48 self
.description
= description
50 def add_threshold(self
, db
, scale
, mark
):
51 thr
= threshold(db
, scale
)
52 self
.scale
.append(thr
)
54 self
.marks
.append(thr
)
56 def add_mark(self
, db
):
57 mark
= threshold(db
, -1.0)
58 self
.marks
.append(mark
)
62 def calculate_coefficients(self
):
66 i
.calculate_coefficients(prev
)
72 def scale_marks(self
):
75 i
.scale
= self
.db_to_scale(i
.db
)
77 def db_to_scale(self
, db
):
78 '''Convert dBFS value to number in range 0.0-1.0 used in GUI'''
82 #print "Match at %f dB treshold" % i.db
85 return i
.db_to_scale(db
)
89 def scale_to_db(self
, scale
):
90 '''Convert number in range 0.0-1.0 used in GUI to dBFS value'''
95 return fpconst
.NegInf
;
96 return i
.scale_to_db(scale
)
100 # IEC 60268-18 Peak programme level meters - Digital audio peak level meter
101 # Adapted from meterpridge, may be wrong, I'm not buying standards, event if they cost $45
102 # If someone has the standart, please eighter share it with me or fix the code.
104 '''IEC 60268-18 Peak programme level meters - Digital audio peak level meter'''
106 base
.__init
__(self
, "iec_268", "IEC 60268-18 Peak programme level meters - Digital audio peak level meter")
107 self
.add_threshold(-70.0, 0.0, False)
108 self
.add_threshold(-60.0, 0.05, True)
109 self
.add_threshold(-50.0, 0.075, True)
110 self
.add_threshold(-40.0, 0.15, True)
112 self
.add_threshold(-30.0, 0.3, True)
114 self
.add_threshold(-20.0, 0.5, True)
118 self
.add_threshold(0.0, 1.0, True)
119 self
.calculate_coefficients()
122 class linear_70dB(base
):
123 '''Linear scale with range from -70 to 0 dBFS'''
125 base
.__init
__(self
, "linear_70dB", "Linear scale with range from -70 to 0 dBFS")
126 self
.add_threshold(-70.0, 0.0, False)
137 self
.add_threshold(0.0, 1.0, True)
138 self
.calculate_coefficients()
141 class linear_30dB(base
):
142 '''Linear scale with range from -30 to +30 dBFS'''
144 base
.__init
__(self
, "linear_30dB", "Linear scale with range from -30 to +30 dBFS")
145 self
.add_threshold(-30.0, 0.0, False)
146 self
.add_threshold(+30.0, 1.0, True)
147 self
.calculate_coefficients()
150 def scale_test1(scale
):
151 for i
in range(-97 * 2, 1, 1):
153 print "%5.1f dB maps to %f" % (db
, scale
.db_to_scale(db
))
155 def scale_test2(scale
):
158 print "%.2f maps to %.1f dB" % (s
, scale
.scale_to_db(s
))
160 def print_db_to_scale(db
):
161 print "%-.1f dB maps to %f" % (db
, scale
.db_to_scale(db
))
163 def scale_test3(scale
):
164 print_db_to_scale(+77.0)
165 print_db_to_scale(+7.0)
166 print_db_to_scale(0.0)
167 print_db_to_scale(-107.0)
169 #scale = linear_30dB()