omz:forum

    • Register
    • Login
    • Search
    • Recent
    • Popular

    Welcome!

    This is the community forum for my apps Pythonista and Editorial.

    For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.


    Learn Piano Notes With Tempo Setting

    Pythonista
    2
    3
    1099
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • ramvee
      ramvee last edited by ccc

      Hi Friends,
      After a long time, I was writing code in pythonista, to help learn, playing piano notes.
      I am sure this may not be the optimal solutiion. But it works, and I am always ready to
      learn from the experts here. Thank You!

      # to learn playing piano keys from phone display
      # not scaled for ipad
      import ui
      import sound
      import time
      from random import choice
      from scripter import script, start_scripter
      
      td=1 # default time delay 1 sec
      
      # piano keys from A3 to G4# are Available with following names (21 keys)
      piano_klist = [
              "piano:C3", "piano:C3#", 
              "piano:D3", "piano:D3#", "piano:E3", 
              "piano:F3", "piano:F3#", 
              "piano:G3", "piano:G3#", 
              "piano:A3", "piano:A3#", "piano:B3",
              "piano:C4", "piano:C4#", 
              "piano:D4", "piano:D4#", "piano:E4", 
              "piano:F4", "piano:F4#", 
              "piano:G4", "piano:G4#"
              ]
      
      # to load sound effects for minimum latency
      for key_name in piano_klist:
          sound.load_effect(key_name)
      
      def slider_action(sender):
          global td
          # to set slider value reversed, so that
          # bpm can go up sliding towards right
          td = round(((1-sender.value)*1.75)+0.2, 2)
          bpm=int (60/td)
          lb.text= str(bpm) + ' BPM'
          # I put this here hoping it will avoid keyboard popping up
          # and covering the display area
          ui.end_editing()
      
      # very important to update label with name of music note
      @script
      def rnd_note(sender):
          # set to practice for 12 notes at a time
          repeat = 12
          for note in range(repeat):
              key_name = choice(piano_klist)
              time.sleep(td)
              lb1.text = key_name[6:]
              sound.play_effect(key_name)
              yield
          time.sleep(td)
          lb1.text = '♫'
          lb.text = 'Tempo Slider'
      
      w,h = ui.get_screen_size()
      # if in landscape mode
      if w>h:
          w,h=h,w
      gap = 10
      
      v = ui.View(name='Piano Practice', bg_color = 'lightyellow')
      v.frame = (gap,gap,w,h)
      start_scripter(v)
      
      lb = ui.Label(name = 'mylabel')
      lb.frame=(gap*2, 10, w-4*gap, 30)
      lb.background_color='gray'
      lb.text_color = 'yellow'
      lb.font = ('Helvetica', 18)
      lb.text = 'Set Tempo BPM'
      lb.alignment =1
      lb.flex = 'W'
      
      slider = ui.Slider()
      slider.value=0.5
      slider.frame=(gap*2,gap+32,w-4*gap,50)
      slider.background_color='gray'
      slider.flex = 'W'
      slider.action = slider_action
          
      lb1 = ui.Label(name = 'note')
      lb1.frame= (gap*2, gap+100, w-4*gap, h-475)
      lb1.font = ('Helvetica', 150 )
      lb1.text_color = 'yellow'
      lb1.alignment =1
      lb1.background_color = 'gray'
      lb1.text = '♫'
      lb1.flex = 'W'
      
      button = ui.Button(name='start')
      button.frame = (gap*2, 300, w-4*gap, 40)
      button.bg_color='yellow'
      button.border_width=1
      button.title='Start'
      button.font = ('Helvetica', 18)
      button.flex = 'W'
      button.action=rnd_note
      
      v.add_subview(slider)
      v.add_subview(lb)
      v.add_subview(lb1)
      v.add_subview(button)
      
      v.present('sheet')
      
      1 Reply Last reply Reply Quote 0
      • ccc
        ccc last edited by ccc

        keys = "C3 C3# D3 D3# E3 F3 F3# G3 G3# A3 A3# B3 C4 C4# D4 D4# E4 F4 F4# G4 G4#"
        piano_klist = [f"piano:{key}" for key in keys.split()]
        
        1 Reply Last reply Reply Quote 0
        • ramvee
          ramvee last edited by

          Thank You @ccc .

          You're always there :)
          And I'm sure, you can reduce this code by half !

          1 Reply Last reply Reply Quote 0
          • First post
            Last post
          Powered by NodeBB Forums | Contributors