Sophie

Sophie

distrib > Mageia > 4 > x86_64 > by-pkgid > 08c3341bf744f643a186f7f70e7fdc57 > files > 55

python-qwt-5.2.0-6.mga4.x86_64.rpm

#!/usr/bin/env python

# The Python version of Qwt-5.0.0/examples/radio


import sys
from PyQt4 import Qt
import PyQt4.Qwt5 as Qwt
from math import *


#-- tunerfrm.cpp --#

class TuningThermo(Qt.QWidget):

    def __init__(self, *args):
        Qt.QWidget.__init__(self, *args)

        self.thermo = Qwt.QwtThermo(self)
        self.thermo.setOrientation(Qt.Qt.Horizontal, Qwt.QwtThermo.NoScale)
        self.thermo.setRange(0.0, 1.0)
        self.thermo.setFillColor(Qt.Qt.green)

        label = Qt.QLabel("Tuning", self)
        label.setAlignment(Qt.Qt.AlignCenter)

        layout = Qt.QVBoxLayout(self)
        layout.setMargin(0)
        layout.addWidget(self.thermo)
        layout.addWidget(label)

        self.setFixedWidth(3*label.sizeHint().width())

    # __init__()

    def setValue(self, value):
        self.thermo.setValue(value)

    # setValue()

# class TuningThermo

        
class TunerFrame(Qt.QFrame):

    def __init__(self, *args):
        Qt.QFrame.__init__(self, *args)

        self.frequencySlider = Qwt.QwtSlider(
            self, Qt.Qt.Horizontal, Qwt.QwtSlider.TopScale)
        self.frequencySlider.setScaleMaxMinor(5)
        self.frequencySlider.setScaleMaxMajor(12)
        self.frequencySlider.setThumbLength(80)
        self.frequencySlider.setBorderWidth(1)
        self.frequencySlider.setRange(87.5, 108, 0.01, 10)

        self.tuningThermo = TuningThermo(self)

        self.frequencyWheel = Qwt.QwtWheel(self)
        self.frequencyWheel.setMass(0.5)
        self.frequencyWheel.setRange(87.5, 108, 0.01)
        self.frequencyWheel.setTotalAngle(3600.0)

        self.connect(self.frequencyWheel,
                     Qt.SIGNAL("valueChanged(double)"),
                     self.adjustFreq)
        self.connect(self.frequencySlider,
                     Qt.SIGNAL("valueChanged(double)"),
                     self.adjustFreq)

        mainLayout = Qt.QVBoxLayout(self)
        mainLayout.setMargin(10)
        mainLayout.setSpacing(5)
        mainLayout.addWidget(self.frequencySlider)

        hLayout = Qt.QHBoxLayout()
        hLayout.setMargin(0)
        hLayout.addWidget(self.tuningThermo, 0)
        hLayout.addStretch(5)
        hLayout.addWidget(self.frequencyWheel, 2)

        mainLayout.addLayout(hLayout)

    # __init__()

    def adjustFreq(self, f):
        factor = 13.0 / (108 - 87.5)
        x = (f - 87.5)  * factor
        field = (sin(x) * cos(4.0 * x))**2
        self.tuningThermo.setValue(field)  
        if self.frequencySlider.value() != f:
            self.frequencySlider.setValue(f)
        if self.frequencyWheel.value() != f:
            self.frequencyWheel.setValue(f)
        self.emit(Qt.SIGNAL("fieldChanged(double)"), field)	

    # adjustFreq()

    def setFreq(self, f):
        self.frequencyWheel.setValue(f)

    # setFreq()

# class TunerFrame


#-- ampfrm.cpp --#

class Knob(Qt.QWidget):

    def __init__(self, title, min, max, parent):
        Qt.QWidget.__init__(self, parent)

        self.knob = Qwt.QwtKnob(self)
        self.knob.setRange(min, max, 0, 1)
        self.knob.setScaleMaxMajor(10)

        self.knob.setKnobWidth(50)

        self.label = Qt.QLabel(title, self)
        self.label.setAlignment(Qt.Qt.AlignTop | Qt.Qt.AlignHCenter)

        self.setSizePolicy(Qt.QSizePolicy.MinimumExpanding,
                           Qt.QSizePolicy.MinimumExpanding)

    # __init__()

    def sizeHint(self):
        sz1 = self.knob.sizeHint()
        sz2 = self.label.sizeHint()

        w = max(sz1.width(), sz2.width())
        h = sz1.height() + sz2.height()

        off = self.knob.scaleDraw().extent(Qt.QPen(), self.knob.font())
        off -= 10 # spacing

        return Qt.QSize(w, h - off)

    # sizeHint()

    def value(self):
        return self.knob.value()

    # value()


    def resizeEvent(self, event):
        sz = event.size()

        h = self.label.sizeHint().height()

        self.label.setGeometry(0, sz.height() - h, sz.width(), h)

        h = self.knob.sizeHint().height()
        off = self.knob.scaleDraw().extent(Qt.QPen(), self.knob.font())
        off -= 10 # spacing

        self.knob.setGeometry(0, self.label.pos().y() - h + off, sz.width(), h)

    # resizeEvent()

# class Knob


class Thermo(Qt.QWidget):

    def __init__(self, title, parent):
        Qt.QWidget.__init__(self, parent)

        self.thermo = Qwt.QwtThermo(self)
        self.thermo.setPipeWidth(6)
        self.thermo.setRange(-40, 10)
        self.thermo.setFillColor(Qt.Qt.green)
        self.thermo.setAlarmColor(Qt.Qt.red)
        self.thermo.setAlarmLevel(0.0)
        self.thermo.setAlarmEnabled(True)

        label = Qt.QLabel(title, self)
        label.setAlignment(Qt.Qt.AlignTop | Qt.Qt.AlignLeft)

        layout = Qt.QVBoxLayout(self)
        layout.setMargin(0)
        layout.setSpacing(0)
        layout.addWidget(self.thermo, 10)
        layout.addWidget(label)

    # __init__()

    def setValue(self, value):
        self.thermo.setValue(value)

    # setValue()

# class Thermo


class AmplifierFrame(Qt.QFrame):

    def __init__(self, *args):
        Qt.QFrame.__init__(self, *args)

        self.phs = 0.0
        self.master = 0.0

        self.volumeKnob = Knob('Volume', 0.0, 10.0, self)
        self.balanceKnob = Knob('Balance', -10.0, 10.0, self)
        self.trebleKnob = Knob('Treble', -10.0, 10.0, self)
        self.bassKnob = Knob('Bass', -10.0, 10.0, self)

        self.leftThermo = Thermo('Left [dB]', self)
        self.rightThermo = Thermo('Right [dB]', self)

        layout = Qt.QHBoxLayout(self)
        layout.setSpacing(0)
        layout.setMargin(10)
        layout.addWidget(self.volumeKnob)
        layout.addWidget(self.balanceKnob)
        layout.addWidget(self.trebleKnob)
        layout.addWidget(self.bassKnob)
        layout.addSpacing(20)
        layout.addStretch(10)
        layout.addWidget(self.leftThermo)
        layout.addSpacing(10)
        layout.addWidget(self.rightThermo)

        self.startTimer(50)

    # __init__()

    def timerEvent(self, event):
        sig_bass = (1.0 + 0.1*self.bassKnob.value()) * sin(13.0*self.phs)
        sig_mid_l = sin(17.0*self.phs)
        sig_mid_r = cos(17.5*self.phs)
        sig_trbl_l = 0.5*(1.0+0.1*self.trebleKnob.value()) * sin(35.0*self.phs)
        sig_trbl_r = 0.5*(1.0+0.1*self.trebleKnob.value()) * sin(34.0*self.phs)
        sig_l = 0.05*self.master*self.volumeKnob.value() * \
                (sig_bass+sig_mid_l+sig_trbl_l)**2
        sig_r = 0.05*self.master*self.volumeKnob.value() * \
                (sig_bass+sig_mid_r+sig_trbl_r)**2
    
        balance = 0.1 * self.balanceKnob.value() 
        if balance > 0: 
            sig_l *= (1.0 - balance)
        else:
            sig_r *= (1.0 + balance)

        if sig_l > 0.01:
            sig_l = 20.0 * log10(sig_l)
        else:
            sig_l = -40.0

        if sig_r > 0.01:
            sig_r = 20.0 * log10(sig_r)
        else:
            sig_r = - 40.0
        self.leftThermo.setValue(sig_l)
        self.rightThermo.setValue(sig_r)

        self.phs += pi / 100
        if self.phs > pi:
            self.phs = 0

    # timerEvent()
    
    def setMaster(self, value):
        self.master = value

    # setMaster()

# class AmplifierFrame


#-- radio.cpp --#

class RadioDemo(Qt.QWidget):

    def __init__(self, *args):
        Qt.QWidget.__init__(self, *args)

        tunerFrame = TunerFrame(self)
        tunerFrame.setFrameStyle(Qt.QFrame.Panel | Qt.QFrame.Raised)

        amplifierFrame = AmplifierFrame(self)
        amplifierFrame.setFrameStyle(Qt.QFrame.Panel | Qt.QFrame.Raised)

        layout = Qt.QVBoxLayout(self)
        layout.setMargin(0)
        layout.setSpacing(0)
        layout.addWidget(tunerFrame)
        layout.addWidget(amplifierFrame)
    
        self.connect(tunerFrame,
                     Qt.SIGNAL("fieldChanged(double)"),
                     amplifierFrame.setMaster)

        tunerFrame.setFreq(90.0)

    # __init__()

# class RadioDemo


def make():
    demo = RadioDemo()
    demo.show()
    return demo

# make()

def main(args):
    app = Qt.QApplication(args)
    demo = make()
    sys.exit(app.exec_())

# main()


# Admire!
if __name__ == '__main__':
    main(sys.argv)

# Local Variables: ***
# mode: python ***
# End: ***