Advertisement
alekssamos

beep_synthesizer_v2.py

Dec 31st, 2023
1,485
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.02 KB | None | 0 0
  1. import wx
  2. from winsound import Beep
  3.  
  4. class MyFrame(wx.Frame):
  5.     # Создаём список нот, который понадобится во время работы с кнопками
  6.     notes_list = ['C', 'Cs', 'D', 'Ds', 'E', 'F', 'Fs', 'G', 'Gs', 'A', 'As', 'B']
  7.     # создаём список, где будут кнопки
  8.     buttons_list = []
  9.     # Список частот малой октавы для подстановки в методы
  10.     KO_frequencies_list = [131, 138, 148, 155, 165, 174, 185, 196, 207, 220, 233, 247]
  11.     # Создаём список кодов 12 клавиш малой октавы
  12.     KO_codes_list = [85, 73, 79, 80, 74, 75, 76, 59, 77, 44, 46, 47]
  13.     # чтобы каждый раз при срабатывании события не вычислять
  14.     # и не тратить время
  15.     # делаем это заранее
  16.     codes_and_frequencies = dict(zip(KO_codes_list, KO_frequencies_list))
  17.     notes_and_frequencies = dict(zip(notes_list, KO_frequencies_list))
  18.     def __init__(self, parent, title=''):
  19.         super().__init__(parent, title=title)
  20.         self.panel = wx.Panel(self, wx.ID_ANY)
  21.         self.sizer_1 = wx.BoxSizer(wx.HORIZONTAL)
  22.         self.sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
  23.         self.panel.SetSizer(self.sizer_2)
  24.         # создаём кнопки
  25.         for note in self.notes_list:
  26.             self.buttons_list.append(wx.Button(
  27.                 self.panel,
  28.                 wx.ID_ANY,
  29.                 note
  30.             ))
  31.             self.buttons_list[-1].SetName(note)
  32.             self.sizer_2.Add(self.buttons_list[-1])
  33.             self.buttons_list[-1].Bind(wx.EVT_BUTTON, self.OnPlayK)
  34.         self.Layout()
  35.  
  36.         # Привязываем обработчики событий нажатия клавиш малой октавы
  37.         for elem in [self, self.panel]+self.buttons_list:
  38.             elem.Bind(wx.EVT_KEY_DOWN, self.OnKeyDownK)
  39.     # ***
  40.     # Создаём метод
  41.     def OnPlayK(self, event):
  42.         event.Skip()
  43.         note = event.GetEventObject().GetName()
  44.         if note not in self.notes_and_frequencies:
  45.             print("Нота {} ещё не добавлена".format(note))
  46.             return
  47.         Beep(self.notes_and_frequencies[note], 300)
  48.     # ***
  49.     # Создаём метод обработки клавиш
  50.     def OnKeyDownK(self, event):
  51.         event.Skip()
  52.         key = event.GetKeyCode()
  53.         if key not in self.codes_and_frequencies:
  54.             print("Клавиша с кодом №{} ещё не добавлена".format(key))
  55.             return False
  56.         Beep(self.codes_and_frequencies[key], 300)
  57.  
  58. class MyApp(wx.App):
  59.     def OnInit(self):
  60.         self.frame = MyFrame(None, 'Синтезатор "Двойная дюжина"')
  61.         self.frame.Centre()
  62.         self.SetTopWindow(self.frame)
  63.         self.frame.Show()
  64.         self.frame.panel.SetFocus()
  65.         return True
  66.  
  67. if __name__ == "__main__":  app = MyApp();  app.MainLoop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement