Skip to content

Commit

Permalink
Changes in Spectrum Screen:
Browse files Browse the repository at this point in the history
+ Changed default to ISO 31 band spectrum analiser frequencies with 40 pixels resolution
+ Changes in audioInput.py. Deprecated bands displaying average of multiple frequencies (now display single frequency measurement)
+ Default fft samples are now tripled (6144) in visualiser.py
+ Changes in Spectrum Line to fit new single frequency change.
+ Changes in Menus.py to fit new single frequency changes
~ Minor Fixes
  • Loading branch information
frank20a committed May 16, 2020
1 parent 57fb276 commit 70c567b
Show file tree
Hide file tree
Showing 17 changed files with 224 additions and 88 deletions.
66 changes: 66 additions & 0 deletions Dialogs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
from tkinter import *
from tkinter.ttk import *


class NewScreenDialog(Toplevel):
def __init__(self, root):
super().__init__(root)
self.minsize(width=250, height=10)
self.title("Select Screen")

self.var = ""

Label(self, text="Select Screen Type").pack(anchor=NW, pady=20, padx=10)
self.combo = Combobox(self, values=['Spectrum', 'SpectrumLine', 'ResponsiveStar', 'ResponsiveBox',
'ResponsiveHelix', 'Video'])
self.combo.pack(padx=10, fill=X)
self.combo.current(0)

b = Button(self, text="OK", command=self.ok, width=35)
b.pack(pady=30, padx=20, anchor=SE)

def ok(self):
self.var = self.combo.get()
if self.var != '':
self.destroy()

def show(self):
try:
self.wm_deiconify()
self.combo.focus_force()
self.wait_window()
return self.var
except Exception as e:
return ""


class Progressbar(Toplevel):
def __init__(self, root):
super().__init__(root)
self.minsize(width=250, height=10)
self.title("Select Screen")

self.var = ""

Label(self, text="Select Screen Type").pack(anchor=NW, pady=20, padx=10)
self.combo = ttk.Combobox(self, values=['Spectrum', 'SpectrumLine', 'ResponsiveStar', 'ResponsiveBox',
'ResponsiveHelix', 'Video'])
self.combo.pack(padx=10, fill=X)
self.combo.current(0)

b = Button(self, text="OK", command=self.ok, width=35)
b.pack(pady=30, padx=20, anchor=SE)

def ok(self):
self.var = self.combo.get()
if self.var != '':
self.destroy()

def show(self):
try:
self.wm_deiconify()
self.combo.focus_force()
self.wait_window()
return self.var
except Exception as e:
return ""
5 changes: 5 additions & 0 deletions customExceptions.py → Exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,8 @@ class LedLayoutEmpty(Exception):
class SaveDirNotSet(Exception):
"""Save button is enables but save dir is not set"""
pass


class ConflictingSizes(Exception):
"""Size of Screen conflicts with size of an attribute"""
pass
8 changes: 3 additions & 5 deletions customMenus.py → Menus.py
Original file line number Diff line number Diff line change
Expand Up @@ -145,15 +145,13 @@ def transmit(self):
self.root.transmitting = False
self.transmitImg = PhotoImage(file="icons/Registry.png")
self.transmitBtn['text'] = "Transmit"
self.transmitBtn['image'] = self.transmitImg
self.transmitBtn.image = self.transmitImg
else:
self.root.transmitting = True
self.transmitImg = PhotoImage(file="icons/Stop.png")
self.transmitBtn['text'] = "Stop"
self.transmitBtn['image'] = self.transmitImg
self.transmitBtn.image = self.transmitImg
self.transmitBtn['text'] = " Stop "

self.transmitBtn['image'] = self.transmitImg
self.transmitBtn.image = self.transmitImg
self.transmitBtn.image = self.transmitImg


Expand Down
15 changes: 5 additions & 10 deletions customWidgets.py → Widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,8 @@ def __init__(self, parent, screen):

self.sensitivityLabel = tk.Label(self, text="Sensitivity")
self.sensitivityLabel.grid(row=0, column=0, sticky=SW)
self.sensitivitySlider = tk.Scale(self, command=self.changeSensitivity, orient=HORIZONTAL, from_=0.001,
to=0.1, resolution=0.001, showvalue=0, length=350,
self.sensitivitySlider = tk.Scale(self, command=self.changeSensitivity, orient=HORIZONTAL, from_=0.002,
to=0.15, resolution=0.001, showvalue=0, length=350,
sliderlength=15)
self.sensitivitySlider.set(self.screen.sens)
self.sensitivitySlider.grid(row=0, column=1, columnspan=3, sticky=W)
Expand Down Expand Up @@ -193,17 +193,12 @@ def __init__(self, parent, screen):
tk.Frame.__init__(self, parent)
self.screen = screen

tk.Label(self, text="Freq 1: ").grid(column=0, row=0, padx=10)
tk.Label(self, text="Frequency: ").grid(column=0, row=0, padx=10)
self.freq1 = tk.Text(self, width=6, height=1)
self.freq1.insert(tk.END, str(self.screen.getFreqRange()[0]))
self.freq1.insert(tk.END, str(self.screen.getFreq()))
self.freq1.grid(column=1, row=0)
tk.Label(self, text="Freq 2: ").grid(column=2, row=0, padx=10)
self.freq2 = tk.Text(self, width=6, height=1)
self.freq2.insert(tk.END, str(self.screen.getFreqRange()[1]))
self.freq2.grid(column=3, row=0)
tk.Button(self, text="Set", command=self.changeFreqs).grid(column=4, row=0, padx=10)
self.freq1.bind("<KeyRelease>", self.changeFreqs())
self.freq2.bind("<KeyRelease>", self.changeFreqs())

def changeFreqs(self):
self.screen.addBand((int(self.freq1.get("1.0", "end-1c")), int(self.freq2.get("1.0", "end-1c"))))
self.screen.addBand(int(self.freq1.get("1.0", "end-1c")))
9 changes: 7 additions & 2 deletions audioInput.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,13 @@ def __init__(self, chunk=4096, Fs=48000, Nfft=256, res=4):
self.stream = self.p.open(format=pyaudio.paInt16, channels=1, rate=self.Fs, input=True, output=False,
frames_per_buffer=self.chunk, input_device_index=2)

def getSpectralBar(self, i1, i2):
return sum(np.abs(self.SIG[i1:i2])) / np.abs((i2 - i1))
# ========= DEPRECATED =========
# def getSpectralBar(self, i1, i2):
# return sum(np.abs(self.SIG[i1:i2])) / np.abs((i2 - i1))
# ==============================

def getSpectralBar(self, i):
return np.abs(self.SIG)[i]

def indexFromFreq(self, F):
return floor(F * self.Nfft / self.Fs)
Expand Down
9 changes: 9 additions & 0 deletions boxes.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@ def addBand(self, freqRange=None):
def getFreqRange(self) -> tuple:
return self.freqRage

def cleanup(self):
print("Closed", self.name)


class ResponsiveStar(ResponsiveBox):
def render(self):
Expand All @@ -68,6 +71,9 @@ def render(self):

return res

def cleanup(self):
print("Closed", self.name)


class ResponsiveHelix(ResponsiveBox):
def render(self):
Expand All @@ -91,3 +97,6 @@ def render(self):
pr = int(n * sin(pi * n / size))

return res

def cleanup(self):
print("Closed", self.name)
2 changes: 0 additions & 2 deletions connections.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@


class Connection:
type = "None"

Expand Down
34 changes: 0 additions & 34 deletions customDialogs.py

This file was deleted.

4 changes: 4 additions & 0 deletions dimension.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,7 @@ def getDiagonal(self):
def setDimension(self, s: tuple):
self.x = s[0]
self.y = s[1]

def __iter__(self):
yield self.x
yield self.y
4 changes: 2 additions & 2 deletions ledScreenLayoutManager.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
from multiprocessing import Queue
import queue

from customMenus import LedMenubar, LedToolbar, LedSidebar
from Menus import LedMenubar, LedToolbar, LedSidebar
from dimension import Dimension
from customExceptions import *
from Exceptions import *
from connections import ConsoleConn

with open('ledScreenLayoutManager.info', 'r', encoding="utf8") as f:
Expand Down
3 changes: 3 additions & 0 deletions screen.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,6 @@ def updateSize(self, size: Dimension = None, pixel: Dimension = None, pxDist: in

def createSettings(self, parent):
raise NotImplementedError()

def cleanup(self):
raise NotImplementedError
2 changes: 1 addition & 1 deletion settingsPanels.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import tkinter as tk
from tkinter import *
import customWidgets as cw
import Widgets as cw


class SpectrumMenu(tk.Frame):
Expand Down
58 changes: 38 additions & 20 deletions spectrum.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,29 @@
from dimension import Dimension
import settingsPanels as sp
from colors import *
from Exceptions import ConflictingSizes


class Spectrum(Screen):
number = 0

def __init__(self, audioDevice: audioInput.AudioInput, size: Dimension = Dimension(14, 20),
pixel: Dimension = Dimension(25, 10), pxDist: int = 5, sens: float = 0.03, topDelay: int = 0):
def __init__(self, audioDevice: audioInput.AudioInput, size: Dimension = Dimension(31, 40), freqs: tuple = (),
pixel: Dimension = Dimension(17, 7), pxDist: int = 5, sens: float = 0.05, topDelay: int = 0):
self.name = self.__class__.__name__ + ' - ' + str(Spectrum.number)
Spectrum.number += 1

# Audio setup
self.audioDevice = audioDevice
self.findex = [0]
freqs = [30, 60, 90, 120, 170, 220, 410, 600, 800, 1000, 1500, 2000, 3750, 4500]
self.findex = self.findex + [self.audioDevice.indexFromFreq(f) for f in freqs]
if not freqs:
freqs = (2, 25, 31.5, 40, 50, 63, 80, 100, 125, 160, 200, 250, 315, 400, 500, 630, 800, 1000, 1250, 1600,
2000, 2500, 3150, 4000, 5000, 6300, 8000, 10000, 12500, 16000, 20000)
if len(freqs) != size.x: raise ConflictingSizes("Number of bars and x-dimension are different")
self.findex = [self.audioDevice.indexFromFreq(f) for f in freqs]

# Screen attributes
self.sens = sens
self.topDelay = topDelay
Screen.__init__(self, size, pixel, pxDist)
super().__init__(size, pixel, pxDist)
self.addBand()
self.calcBars()
self.changePalette("gradientBeat")
Expand All @@ -38,7 +43,7 @@ def __init__(self, audioDevice: audioInput.AudioInput, size: Dimension = Dimensi
# Beat Detection Variables
self.beatDetectSensitivity = 2.2
self.beatDetectThreshold = 12
self.beatDetectionBar = 3
self.beatDetectionBar = 6
self.beatDetect = [0 for i in range(20)]

def createSettings(self, parent) -> tk.Frame:
Expand All @@ -47,9 +52,14 @@ def createSettings(self, parent) -> tk.Frame:

def calcBars(self) -> None:
self.findex.sort()
self.bar = []
for i in range(len(self.findex) - 1):
self.bar.append(self.sens * self.audioDevice.getSpectralBar(self.findex[i], self.findex[i + 1]))

# ========= DEPRECATED =========
# self.bar = []
# for i in range(len(self.findex) - 1):
# self.bar.append(self.sens * self.audioDevice.getSpectralBar(self.findex[i], self.findex[i + 1]))
# ==============================

self.bar = [self.sens * self.audioDevice.getSpectralBar(i) for i in self.findex]

def addBand(self, x=0) -> None:
if x > 0: self.findex.append(self.audioDevice.indexFromFreq(x))
Expand Down Expand Up @@ -180,18 +190,22 @@ def render(self) -> list:

return res

def cleanup(self):
print("Closed", self.name)


class SpectrumLine(Spectrum):
number = 0

def __init__(self, audioDevice: audioInput.AudioInput, freqRange: tuple = (90, 120), size: int = 40,
pixel: Dimension = Dimension(15, 5), pxDist: int = 5, sens: float = 0.03, topDelay: int = 0,
def __init__(self, audioDevice: audioInput.AudioInput, freq: int = 100, size: int = 40,
pixel: Dimension = Dimension(17, 7), pxDist: int = 5, sens: float = 0.05, topDelay: int = 0,
align: int = 0):

self.align = align # Align 0:Bottom, 1:Top, 2:Center
self.freqRage = freqRange
self.freq = freq

Spectrum.__init__(self, audioDevice, Dimension(1, size), pixel, pxDist, sens, topDelay)
super().__init__(audioDevice, freqs=(freq,), size=Dimension(1, size), pixel=pixel, pxDist=pxDist, sens=sens,
topDelay=topDelay)

self.beatDetectionBar = 0

Expand All @@ -210,12 +224,16 @@ def render(self) -> list:

return res

def addBand(self, freqRange=None) -> None:
def addBand(self, freq: int = None) -> None:
if freq is None: return

self.freq = (freq)
print(self.freq)
self.findex = [self.audioDevice.indexFromFreq(self.freq)]
self.tops = [[0, 0] for i in range((len(self.findex) - 1) * 2)]
if freqRange: self.freqRage = freqRange

self.findex = [self.audioDevice.indexFromFreq(self.freqRage[0]),
self.audioDevice.indexFromFreq(self.freqRage[1])]
def getFreq(self) -> int:
return self.freq

def getFreqRange(self) -> tuple:
return self.freqRage
def cleanup(self):
print("Closed", self.name)
Loading

0 comments on commit 70c567b

Please sign in to comment.