1 # This file is part of jack_mixer
3 # Copyright (C) 2006 Nedko Arnaudov <nedko@arnaudov.name>
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; version 2 of the License
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
24 log
= logging
.getLogger(__name__
)
28 '''Encapsulates scale linear function edge and coefficients for scale = a * dB + b formula'''
29 def __init__(self
, db
, scale
):
32 self
.text
= "%.0f" % math
.fabs(db
)
36 '''Scale abstraction, various scale implementation derive from this class'''
37 def __init__(self
, scale_id
, description
):
39 self
.scale_id
= scale_id
40 self
.description
= description
41 self
.scale
= jack_mixer_c
.Scale()
43 def add_threshold(self
, db
, scale
, is_mark
):
44 self
.scale
.add_threshold(db
, scale
)
46 self
.marks
.append(Mark(db
, scale
))
48 def calculate_coefficients(self
):
49 self
.scale
.calculate_coefficients()
51 def db_to_scale(self
, db
):
52 '''Convert dBFS value to number in range 0.0-1.0 used in GUI'''
53 log
.debug("db_to_scale(%f)", db
)
54 return self
.scale
.db_to_scale(db
)
56 def scale_to_db(self
, scale
):
57 '''Convert number in range 0.0-1.0 used in GUI to dBFS value'''
58 return self
.scale
.scale_to_db(scale
)
60 def add_mark(self
, db
):
61 self
.marks
.append(Mark(db
, -1.0))
66 def scale_marks(self
):
69 i
.scale
= self
.db_to_scale(i
.db
)
72 # IEC 60268-18 Peak programme level meters - Digital audio peak level meter
73 # Adapted from meterbridge, may be wrong, I'm not buying standards, event if they cost $45
74 # If someone has the standard, please either share it with me or fix the code.
76 '''IEC 60268-18 Peak programme level meters - Digital audio peak level meter'''
78 Base
.__init
__(self
, "iec_268",
79 "IEC 60268-18 Peak programme level meters - Digital audio peak level meter")
80 self
.add_threshold(-70.0, 0.0, False)
81 self
.add_threshold(-60.0, 0.05, True)
82 self
.add_threshold(-50.0, 0.075, True)
83 self
.add_threshold(-40.0, 0.15, True)
85 self
.add_threshold(-30.0, 0.3, True)
87 self
.add_threshold(-20.0, 0.5, True)
91 self
.add_threshold(0.0, 1.0, True)
92 self
.calculate_coefficients()
96 class IEC268Minimalistic(Base
):
97 '''IEC 60268-18 Peak programme level meters - Digital audio peak level meter,
100 Base
.__init
__(self
, 'iec_268_minimalistic',
101 'IEC 60268-18 Peak programme level meters - Digital audio peak level meter, fewer marks')
102 self
.add_threshold(-70.0, 0.0, False)
103 self
.add_threshold(-60.0, 0.05, True)
104 self
.add_threshold(-50.0, 0.075, False)
105 self
.add_threshold(-40.0, 0.15, True)
106 self
.add_threshold(-30.0, 0.3, True)
107 self
.add_threshold(-20.0, 0.5, True)
109 self
.add_threshold(0.0, 1.0, True)
110 self
.calculate_coefficients()
114 class Linear70dB(Base
):
115 '''Linear scale with range from -70 to 0 dBFS'''
117 Base
.__init
__(self
, "linear_70dB", "Linear scale with range from -70 to 0 dBFS")
118 self
.add_threshold(-70.0, 0.0, False)
129 self
.add_threshold(0.0, 1.0, True)
130 self
.calculate_coefficients()
134 class Linear30dB(Base
):
135 '''Linear scale with range from -30 to +30 dBFS'''
137 Base
.__init
__(self
, "linear_30dB", "Linear scale with range from -30 to +30 dBFS")
138 self
.add_threshold(-30.0, 0.0, False)
139 self
.add_threshold(+30.0, 1.0, True)
140 self
.calculate_coefficients()
144 def scale_test1(scale
):
145 for i
in range(-97 * 2, 1, 1):
147 print("%5.1f dB maps to %f" % (db
, scale
.db_to_scale(db
)))
150 def scale_test2(scale
):
153 print("%.2f maps to %.1f dB" % (s
, scale
.scale_to_db(s
)))
156 def print_db_to_scale(scale
, db
):
157 print("%-.1f dB maps to %f" % (db
, scale
.db_to_scale(db
)))
160 def scale_test3(scale
):
161 print_db_to_scale(scale
, +77.0)
162 print_db_to_scale(scale
, +7.0)
163 print_db_to_scale(scale
, 0.0)
164 print_db_to_scale(scale
, -107.0)
167 def _test(*args
, **kwargs
):
174 if __name__
== '__main__':