def perform_interactive(configfile='default_setup.ini'): """ Run Codeklavier in interactive mode. :param string configfile: Path to the configuration file (default: default_setup.ini) """ codeK = Setup() count = 1 while True: codeK.print_welcome(28) print('Type the number of the prototype you want to use,'\ '\n \'rec\' to start machine learning data recording'\ '\n \'test\' for a miditest,\n or \'exit\' to quit.') print('') print('The available prototypes are:') for p in PROTOTYPES: count = count + 1 print(' ', count, '.' + p) print('') pi = input('Type your choice? ') if (pi.lower() == 'exit'): sys.exit(0) if (pi.lower() == 'test'): miditest(configfile=configfile) if (pi.lower() == 'rec'): rec(configfile=configfile) try: perform(configfile=configfile, prototype=pi) except ValueError: print('That is not an available prototype. Try again or \'exit\'')
def main(configfile='../default_setup.ini'): """ Start hello world! :param int configfile: use this configuration file. Defaults to 'default_setup.ini'. """ #Read config and settings config = configparser.ConfigParser() config.read(configfile, encoding='utf8') try: myPort = config['midi'].getint('port') device_id = config['midi'].getint('noteon_id') except KeyError: raise LookupError('Missing key information in the config file.') if (myPort == None or device_id == None): raise LookupError('Missing key information in the config file.') codeK = Setup() tutorial = Instructions() codeK.open_port(myPort) codeK.open_port_out(myPort) # Use your favourite mapping of the keys mapping = Mapping_HelloWorld_NKK() # class to handle the midi input and map it to characters #TODO: this is ugly! Move this to the CodeKlavier module class HelloWorld(object): def __init__(self, port): self.port = port def __call__(self, event, data=None): message, deltatime = event # print(message) if message[2] > 0: #only noteOn if (message[0] == device_id): mapping.mapping(message[1]) # forwarding only note on messages to tutorial terminal for NKK: codeK.send_message([message[0], message[1], message[2]]) if (message[0] == 176): #hardcoded pedal id (not pretty) mapping.stopSC(message[1]) codeK.set_callback(HelloWorld(myPort)) # Loop to program to keep listening for midi input try: # timer = time.time() while True: if tutorial.mode(): break time.sleep(0.01) except KeyboardInterrupt: print('') finally: # print("Bye-Bye :(") codeK.end()
def rec(configfile='default_setup.ini'): """ Run a basic miditest to see how the CodeKlavier is receiving your midi. :param string configfile: Path to the configuration file (default: default_setup.ini) """ #Read config and settings config = configparser.ConfigParser() config.read(configfile, encoding='utf8') try: myPort = config['midi'].getint('port') device_id = config['midi'].getint('device_id') except KeyError: raise LookupError('Missing key information in the config file.') if (myPort == None or device_id == None): raise LookupError('Missing key information in the config file.') codeK = Setup() codeK.open_port(myPort) print('your device id is: ', device_id, '\n') print("CodeKlavier is RECORDING. Press Control-C to exit.") timestamp = time.strftime("%y-%m-%d") ck_deltatime = 0 per_note = 0 recfile = open('ml_data/_', 'w') headers = 'source_id,midi_note,velocity,ck_deltatime,dif_deltatime' recfile.write(headers + '\n') try: while True: msg = codeK.get_message() if msg: message, deltatime = msg ck_deltatime += deltatime per_note += deltatime if message[0] != 254: if message[0] == device_id: #note-off hardcoded per_note = 0 dif = delta_difference(per_note) midimsg = list(map(str, message)) data_line = ','.join(midimsg) + ',' + str( ck_deltatime) + ',' + str(dif) + '\n' clean_line = re.sub(r"\[?\]?", '', data_line) recfile.write(clean_line) print(clean_line) #time.sleep(0.01) except KeyboardInterrupt: print('saving recording...') finally: recfile.close() title = input( 'Dear CK user, please type a comprehensive title for the recording and press ENTER:' ) usertitle = title + '_' + timestamp + '.csv' os.rename("ml_data/_", "ml_data/" + usertitle) print("recording saved with title: ", usertitle) codeK.end()
def main(configfile='default_setup.ini'): """ Start hello world! :param int configfile: use this configuration file. Defaults to 'default_setup.ini'. """ #Read config and settings config = configparser.ConfigParser() config.read(configfile, encoding='utf8') try: myPort = config['midi'].getint('port') device_id = config['midi'].getint('noteon_id') except KeyError: raise LookupError('Missing key information in the config file.') if (myPort == None or device_id == None): raise LookupError('Missing key information in the config file.') codeK = Setup() codeK.print_welcome(27) codeK.open_port(myPort) # Use your favourite mapping of the keys mapping = Mapping_HelloWorld() print("\nCodeKlavier is ready and ON.") print("You are performing: HELLO WORLD") print("\nPress Control-C to exit.") codeK.set_callback(HelloWorld(myPort, mapping, device_id)) # Loop to program to keep listening for midi input try: while True: time.sleep(0.01) except KeyboardInterrupt: print('') finally: print("Bye-Bye :(") codeK.end()
def main(text_id=1, configfile='default_setup.ini'): """ Start the Text Printer/ Typer :param string text_id: the text to load. :param string configfile: use this configuration file. Defaults to 'default_setup.ini'. """ #Read config and settings config = configparser.ConfigParser() config.read(configfile, encoding='utf8') try: myPort = config['midi'].getint('port') device_id = config['midi'].getint('device_id') pedal_id = config['midi'].getint('pedal_id') except KeyError: raise LookupError('Missing key information in the config file.') if (myPort == None or device_id == None): raise LookupError('Missing key information in the config file.') codeK = Setup() codeK.print_welcome(27) codeK.open_port(myPort) print("\nCodeKlavier is ready and ON.") print("You are performing: Fixed Text Typer") print("\nPress Control-C to exit.") #codeK.set_callback(TextPrint(myPort, device_id, pedal_id)) text = TextPrint(myPort, device_id, pedal_id, text_id) # Loop to program to keep listening for midi input try: while True: msg = codeK.get_message() if msg: text.printText(msg) time.sleep(0.01) except KeyboardInterrupt: print('') finally: print("Bye-Bye :(") codeK.end()
def main(): """Main function as example. """ codeK = Setup() # Start the CodeKlavier codeK = Setup() myPort = codeK.perform_setup() codeK.open_port(myPort) device_id = codeK.get_device_id() print('your device id is: ', device_id, '\n') run(codeK)
def createConfig(configfile='my_settings.ini'): """Create a basic configfile TODO!!: avoid that the created configfile overwrites the existing file (if present)! :param string configfile: path and name of the configfile """ codeK = Setup() codeK.show_ports() myPort = codeK.get_port_from_user() codeK.open_port(myPort) device_id = codeK.get_device_id() config = configparser.ConfigParser() config.add_section('midi') config['midi']['port'] = str(myPort) config['midi']['device_id'] = str(device_id) with open(configfile, 'w') as f: config.write(f)
def miditest(configfile='default_setup.ini'): """ Run a basic miditest to see how the CodeKlavier is receiving your midi. :param string configfile: Path to the configuration file (default: default_setup.ini) """ #Read config and settings config = configparser.ConfigParser() config.read(configfile, encoding='utf8') try: myPort = config['midi'].getint('port') device_id = config['midi'].getint('noteon_id') except KeyError: raise LookupError('Missing key information in the config file.') if (myPort == None or device_id == None): raise LookupError('Missing key information in the config file.') codeK = Setup() codeK.open_port(myPort) print('your device id is: ', device_id, '\n') print("CodeKlavier is ON. Press Control-C to exit.") try: while True: msg = codeK.get_message() if msg: message, deltatime = msg print('deltatime: ', deltatime, 'msg: ', message) time.sleep(0.01) except KeyboardInterrupt: print('') finally: print("Bye-Bye :(") codeK.end()
def ck_loop(prototype='hello world'): """ the main loop thread for the Codeklavier to listen to incoming midi messages :param string prototype: The name of the prototype to process """ global mapping, parameters, conditionalsRange, conditionals, \ param_interval, threads_are_perpetual, range_trigger, \ notecounter, hello_world_on, noteCounter, motippets_is_listening, \ ck_deltatime, ck_deltatime_mem codeK_thread = Setup() codeK_thread.open_port(myPort) print('port', myPort) #go to the end of the codespace screen mapping.goDown() if prototype == 'hello world': try: while hello_world_on: msg = codeK_thread.get_message() if msg: message, deltatime = msg if message[0] != 254 and message[0] != 208: if message[2] > 0: #only noteOn if (message[0] == device_id): notecounter += 1 if message[1] == 107: print('toggle prototype -> Motippets') codeK_thread.close_port() #mapping = Mapping_Motippets() hello_world_on = False motippets_is_listening = True #notecounter = 0 threads['toggle_m'] = Thread( target=ck_loop, name='ck loop thread', args=('motippets', )) threads['toggle_m'].start() mapping.mapping(message[1]) time.sleep(0.01) except KeyboardInterrupt: print('') finally: #print('hybrid thread stopped') codeK_thread.end() elif prototype == 'motippets': # reset deltatimes ck_deltatime = 0 ck_deltatime_mem = [] try: while motippets_is_listening: msg = codeK_thread.get_message() if msg: message, deltatime = msg ck_deltatime += deltatime if message[0] == device_id: if message[2] > 0 and message[0] == device_id: notecounter += 1 ck_deltatime_mem.append(ck_deltatime) if len(ck_deltatime_mem) > 2: ck_deltatime = 0 ck_deltatime_mem = ck_deltatime_mem[-2:] ck_deltatime_mem[0] = 0 if len(ck_deltatime_mem) == 2: ck_deltadif = ck_deltatime_mem[ 1] - ck_deltatime_mem[0] else: ck_deltadif = 0 if message[1] == 107: print('toggle prototype -> Hello World') codeK_thread.close_port() #mapping = Mapping_HelloWorld() motippets_is_listening = False hello_world_on = True #notecounter = 0 threads['toggle_h'] = Thread( target=ck_loop, name='ck loop thread', args=('hello world', )) threads['toggle_h'].start() ##motifs: mainMem.parse_midi(msg, 'full', ck_deltadif) memLow.parse_midi(msg, 'low', ck_deltadif) memMid.parse_midi(msg, 'mid', ck_deltadif) memHi.parse_midi(msg, 'hi', ck_deltadif) motif1_played = memMid._motif1_counter motif2_played = mainMem._motif2_counter minimotif1_low_mapped = memLow._unmapCounter1 minimotif2_low_mapped = memLow._unmapCounter2 minimotif3_low_mapped = memLow._unmapCounter3 minimotif1_mid_mapped = memMid._unmapCounter1 minimotif2_mid_mapped = memMid._unmapCounter2 minimotif3_mid_mapped = memMid._unmapCounter3_m minimotif1_hi_mapped = memHi._unmapCounter1 minimotif2_hi_mapped = memHi._unmapCounter2 ##tremolos: if motif1_played > 0 or motif2_played > 0: if minimotif1_low_mapped > 0: tremoloLow.parse_midi( msg, 'tremoloLow', ck_deltadif, 1) elif minimotif2_low_mapped > 0: tremoloLow.parse_midi( msg, 'tremoloLow', ck_deltadif, 2) elif minimotif3_low_mapped > 0: tremoloLow.parse_midi( msg, 'tremoloLow', ck_deltadif, 3) if minimotif1_mid_mapped > 0: tremoloMid.parse_midi( msg, 'tremoloMid', ck_deltadif, 1) elif minimotif2_mid_mapped > 0: tremoloMid.parse_midi( msg, 'tremoloMid', ck_deltadif, 2) elif minimotif3_mid_mapped > 0: tremoloMid.parse_midi( msg, 'tremoloMid', ck_deltadif, 3) if minimotif1_hi_mapped > 0: tremoloHi.parse_midi( msg, 'tremoloHi', ck_deltadif, 1) elif minimotif2_hi_mapped > 0: tremoloHi.parse_midi( msg, 'tremoloHi', ck_deltadif, 2) ##conditionals conditional_value = conditionals[1].parse_midi( msg, 'conditional 1', ck_deltadif) conditional2_value = conditionals[2].parse_midi( msg, 'conditional 2', ck_deltadif) conditional3_value = conditionals[3].parse_midi( msg, 'conditional 3', ck_deltadif) if isinstance(conditional_value, int) and conditional_value > 0: conditional_params = parameters.parse_midi( msg, 'params', ck_deltadif) #set the parameter for the timer: if isinstance(conditional_params, int) and conditional_params > 0: if conditional_value != 4: threads['set_param'] = Thread( target=set_parameters, name='set timer value', args=(conditional_params, 'amount')) threads['set_param'].start() elif conditional_value == 4: #gong bomb threads['set_param'] = Thread( target=set_parameters, name='set countdown value', args=(conditional_params, 'gomb')) threads['set_param'].start() if param_interval > 0: #if conditional_value != 4: notecounter = 0 # reset the counter threads[conditional_value] = Thread( target=noteCounter, name='conditional note counter thread', args=(param_interval, 100, conditional_value, True)) threads[conditional_value].start() #elif conditional_value == 4: #start the countdown #gomb = Thread(target=gong_bomb, name='gomb', args=(param_interval, True)) #gomb.start() if isinstance(conditional2_value, int) and conditional2_value > 0: conditionalsRange._conditionalStatus = conditional2_value conditional_params = parameters.parse_midi( msg, 'params', ck_deltadif) # set range parameter: if isinstance(conditional_params, int) and conditional_params > 0: if conditional_value != 4: threads['set_param'] = Thread( target=set_parameters, name='set timer value', args=(conditional_params, 'range')) threads['set_param'].start() elif conditional_value == 4: #gong bomb threads['set_param'] = Thread( target=set_parameters, name='set countdown value', args=(conditional_params, 'gomb')) threads['set_param'].start() if param_interval > 0: threads[conditional2_value] = Thread( target=rangeCounter, name='conditional range thread', args=('random', 'more than', 2, conditional2_value, param_interval)) threads[conditional2_value].start() if isinstance(conditional3_value, int) and conditional3_value > 0: conditionalsRange._conditionalStatus = conditional3_value conditional_params = parameters.parse_midi( msg, 'params', ck_deltadif) # set range parameter: if isinstance(conditional_params, int) and conditional_params > 0: if conditional_value != 4: threads['set_param'] = Thread( target=set_parameters, name='set timer value', args=(conditional_params, 'range')) threads['set_param'].start() elif conditional_value == 4: #gong bomb threads['set_param'] = Thread( target=set_parameters, name='set countdown value', args=(conditional_params, 'gomb')) threads['set_param'].start() if param_interval > 0: threads[conditional3_value] = Thread( target=rangeCounter, name='conditional range thread', args=('random', 'less than', 3, conditional3_value, param_interval)) threads[conditional3_value].start() #range parser if range_trigger == 1: conditionalsRange.parse_midi( msg, 'conditional_range') time.sleep(0.01) #check except KeyboardInterrupt: print('') finally: #print('hybrid thread stopped') codeK_thread.end()
def main(): """Start the Hybrid prototype :param string configfile: The configurationfile to use. Defaults to default_setup.ini """ global mapping, parameters, conditionalsRange, conditionals, \ param_interval, threads_are_perpetual, range_trigger, \ notecounter, hello_world_on, noteCounter, ck_deltatime, \ ck_deltatime_mem, codeK, mainMem, memLow, memMid, memHi, \ tremoloHi, tremoloLow, tremoloMid codeK = Setup() codeK.print_welcome(27) codeK.open_port(myPort) codeK.print_lines(20, 1) print("Prototype loaded: Hybrid 0.3") print("CodeKlavier is ready and LISTENING.") codeK.print_lines(20, 1) print("\nPress Control-C to exit.\n") # default mapping mapping = Mapping_Motippets(False) # main memory (i.e. listen to the whole register) mainMem = Motippets(mapping, device_id) # midi listening per register memLow = Motippets(mapping, device_id) memMid = Motippets(mapping, device_id) memHi = Motippets(mapping, device_id) #midi listening for tremolos tremoloHi = Motippets(mapping, device_id) tremoloMid = Motippets(mapping, device_id) tremoloLow = Motippets(mapping, device_id) #midi listening for conditionals conditionals = { 1: Motippets(mapping, device_id), 2: Motippets(mapping, device_id), 3: Motippets(mapping, device_id) } conditionalsRange = Motippets(mapping, device_id) parameters = Motippets(mapping, device_id) try: while keep_main_alive: while motippets_is_listening: msg = codeK.get_message() if msg: message, deltatime = msg ck_deltatime += deltatime if message[0] != 254: #note offs: #if (message[0] == noteoff_id or message[2] == 0): #ck_deltatime = 0 if message[0] == device_id: if message[2] > 0 and message[0] == device_id: notecounter += 1 ck_deltatime_mem.append(ck_deltatime) #print('deltatimes before: ', ck_deltatime_mem) if len(ck_deltatime_mem) > 2: ck_deltatime = 0 ck_deltatime_mem = ck_deltatime_mem[-2:] ck_deltatime_mem[0] = 0 if len(ck_deltatime_mem) == 2: ck_deltadif = ck_deltatime_mem[ 1] - ck_deltatime_mem[0] else: ck_deltadif = 0 if message[1] == 107: print('toggle prototype -> Hello World') codeK.close_port() #mapping = Mapping_HelloWorld() hello_world_on = True #notecounter = 0 threads['toggle_h'] = Thread( target=ck_loop, name='ck loop thread', args=('hello world', )) threads['toggle_h'].start() ##motifs: mainMem.parse_midi(msg, 'full', ck_deltadif) memLow.parse_midi(msg, 'low', ck_deltadif) memMid.parse_midi(msg, 'mid', ck_deltadif) memHi.parse_midi(msg, 'hi', ck_deltadif) motif1_played = memMid._motif1_counter motif2_played = mainMem._motif2_counter minimotif1_low_mapped = memLow._unmapCounter1 minimotif2_low_mapped = memLow._unmapCounter2 minimotif3_low_mapped = memLow._unmapCounter3 minimotif1_mid_mapped = memMid._unmapCounter1 minimotif2_mid_mapped = memMid._unmapCounter2 minimotif3_mid_mapped = memMid._unmapCounter3_m minimotif1_hi_mapped = memHi._unmapCounter1 minimotif2_hi_mapped = memHi._unmapCounter2 ##tremolos: if motif1_played > 0 or motif2_played > 0: if minimotif1_low_mapped > 0: tremoloLow.parse_midi( msg, 'tremoloLow', ck_deltadif, 1) elif minimotif2_low_mapped > 0: tremoloLow.parse_midi( msg, 'tremoloLow', ck_deltadif, 2) elif minimotif3_low_mapped > 0: tremoloLow.parse_midi( msg, 'tremoloLow', ck_deltadif, 3) if minimotif1_mid_mapped > 0: tremoloMid.parse_midi( msg, 'tremoloMid', ck_deltadif, 1) elif minimotif2_mid_mapped > 0: tremoloMid.parse_midi( msg, 'tremoloMid', ck_deltadif, 2) elif minimotif3_mid_mapped > 0: tremoloMid.parse_midi( msg, 'tremoloMid', ck_deltadif, 3) if minimotif1_hi_mapped > 0: tremoloHi.parse_midi( msg, 'tremoloHi', ck_deltadif, 1) elif minimotif2_hi_mapped > 0: tremoloHi.parse_midi( msg, 'tremoloHi', ck_deltadif, 2) ##conditionals conditional_value = conditionals[1].parse_midi( msg, 'conditional 1', ck_deltadif) conditional2_value = conditionals[ 2].parse_midi(msg, 'conditional 2', ck_deltadif) conditional3_value = conditionals[ 3].parse_midi(msg, 'conditional 3', ck_deltadif) if isinstance(conditional_value, int) and conditional_value > 0: conditional_params = parameters.parse_midi( msg, 'params', ck_deltadif) #set the parameter for the timer: if isinstance( conditional_params, int) and conditional_params > 0: if conditional_value != 4: threads['set_param'] = Thread( target=set_parameters, name='set timer value', args=(conditional_params, 'amount')) threads['set_param'].start() elif conditional_value == 4: #gong bomb threads['set_param'] = Thread( target=set_parameters, name='set countdown value', args=(conditional_params, 'gomb')) threads['set_param'].start() if param_interval > 0: #if conditional_value != 4: notecounter = 0 # reset the counter threads[conditional_value] = Thread( target=noteCounter, name= 'conditional note counter thread', args=(param_interval, 100, conditional_value, True)) threads[conditional_value].start() #elif conditional_value == 4: #start the countdown #gomb = Thread(target=gong_bomb, name='gomb', args=(param_interval, True)) #gomb.start() if isinstance(conditional2_value, int) and conditional2_value > 0: conditionalsRange._conditionalStatus = conditional2_value conditional_params = parameters.parse_midi( msg, 'params', ck_deltadif) # set range parameter: if isinstance( conditional_params, int) and conditional_params > 0: if conditional_value != 4: threads['set_param'] = Thread( target=set_parameters, name='set timer value', args=(conditional_params, 'range')) threads['set_param'].start() elif conditional_value == 4: #gong bomb threads['set_param'] = Thread( target=set_parameters, name='set countdown value', args=(conditional_params, 'gomb')) threads['set_param'].start() if param_interval > 0: threads[conditional2_value] = Thread( target=rangeCounter, name='conditional range thread', args=('random', 'more than', 2, conditional2_value, param_interval)) threads[conditional2_value].start() if isinstance(conditional3_value, int) and conditional3_value > 0: conditionalsRange._conditionalStatus = conditional3_value conditional_params = parameters.parse_midi( msg, 'params', ck_deltadif) # set range parameter: if isinstance( conditional_params, int) and conditional_params > 0: if conditional_value != 4: threads['set_param'] = Thread( target=set_parameters, name='set timer value', args=(conditional_params, 'range')) threads['set_param'].start() elif conditional_value == 4: #gong bomb threads['set_param'] = Thread( target=set_parameters, name='set countdown value', args=(conditional_params, 'gomb')) threads['set_param'].start() if param_interval > 0: threads[conditional3_value] = Thread( target=rangeCounter, name='conditional range thread', args=('random', 'less than', 3, conditional3_value, param_interval)) threads[conditional3_value].start() #range parser if range_trigger == 1: conditionalsRange.parse_midi( msg, 'conditional_range') time.sleep(0.01) #check except KeyboardInterrupt: print('') finally: codeK.end()
def main(): """Start the Hybrid prototype :param string configfile: The configurationfile to use. Defaults to default_setup.ini """ global mapping, parameters, conditionalsRange, conditionals, \ param_interval, threads_are_perpetual, range_trigger, \ notecounter, hello_world_on, noteCounter, ck_deltatime, \ ck_deltatime_mem, codeK, mainMem, memLow, memMid, memHi, \ tremoloHi, tremoloLow, tremoloMid, motippets_is_listening codeK = Setup() codeK.print_welcome(27) #codeK.open_port(myPort) codeK.print_lines(20, 1) print("Prototype loaded: Presenter 0.4") print("CodeKlavier is ready and LISTENING.") codeK.print_lines(20, 1) print("\nPress Control-C to exit.\n") # default mapping mapping = Mapping_Motippets(False, 'snippets Presenter') # main memory (i.e. listen to the whole register) mainMem = Motippets(mapping, device_id) # midi listening per register memLow = Motippets(mapping, device_id) memMid = Motippets(mapping, device_id) memHi = Motippets(mapping, device_id) #midi listening for tremolos tremoloHi = Motippets(mapping, device_id) tremoloMid = Motippets(mapping, device_id) tremoloLow = Motippets(mapping, device_id) #midi listening for conditionals conditionals = { 1: Motippets(mapping, device_id), 2: Motippets(mapping, device_id), 3: Motippets(mapping, device_id) } conditionalsRange = Motippets(mapping, device_id) parameters = Motippets(mapping, device_id) try: notecounter = 0 if hello_world_on is True: threads['toggle_h'] = Thread(target=ck_loop, name='ck loop thread', args=('hello world', )) threads['toggle_h'].start() if motippets_is_listening is True: threads['toggle_m'] = Thread(target=ck_loop, name='ck loop thread', args=('motippets', )) threads['toggle_m'].start() while hybrid_running: time.sleep(0.1) #main loop except KeyboardInterrupt: print('') finally: codeK.end()
def main(configfile='../default_setup.ini'): # Start the CodeKlavier #Read config and settings config = configparser.ConfigParser() config.read(configfile, encoding='utf8') try: myPort = config['midi'].getint('port') device_id = config['midi'].getint('noteon_id') except KeyError: raise LookupError('Missing key information in the config file.') if (myPort == None or device_id == None): raise LookupError('Missing key information in the config file.') codeK = Setup() tutorial = Instructions() codeK.open_port(myPort) codeK.open_port_out(myPort) # Use your favourite mapping of the keys mapping = Mapping_HelloWorld_NKK() # class to handle the midi input and map it to characters #TODO: this is ugly! Move this to the CodeKlavier module class HelloWorld(object): def __init__(self, port): self.port = port def __call__(self, event, data=None): message, deltatime = event # print(message) if message[2] > 0: #only noteOn if (message[0] == device_id): mapping.mapping(message[1]) codeK.set_callback(HelloWorld(myPort)) tutorial.do_tutorial() codeK.send_message([0x90, 108, 127]) #send enter to codespace tutorial.level_four() # Loop to program to keep listening for midi input try: timer = time.time() while True: time.sleep(0.01) except KeyboardInterrupt: print('') finally: # print("Bye-Bye :(") codeK.end()
def main(configfile='default_setup.ini'): """ start the CKalculator """ global ckalculator_listens, ck_deltatime_mem config = configparser.ConfigParser(delimiters=(':'), comment_prefixes=('#')) config.read(configfile, encoding='utf8') # TODO: optimize... try: myPort = config['midi'].getint('port') noteon_id = config['midi'].getint('noteon_id') noteoff_id = config['midi'].getint('noteoff_id') pedal_id = config['midi'].getint('pedal_id') pedal_sostenuto = config['midi'].getint('pedal_midi_sostenuto') staccato = config['articulation'].getfloat('staccato') sostenuto = config['articulation'].getfloat('sostenuto') chord = config['articulation'].getfloat('chord') except KeyError: raise LookupError( 'Missing midi and articulation information in the config file.') if (myPort == None or noteon_id == None): raise LookupError( 'Missing port and device id information in the config file.') codeK = Setup() codeK.print_welcome(27) codeK.open_port(myPort) codeK.print_lines(20, 1) print("Prototype loaded: Ckalculator 0.1") print("CodeKlavier is ready and LISTENING.") codeK.print_lines(20, 1) print("\nPress Control-C to exit.\n") cKalc = Ckalculator(noteon_id, noteoff_id, pedal_id) per_note = 0 ck_deltatime = 0 articulation = { 'chord': chord, 'staccato': staccato, 'sostenuto': sostenuto } try: while ckalculator_listens: msg = codeK.get_message() if msg: message, deltatime = msg per_note += deltatime ck_deltatime += deltatime #print(message) if message[0] != 254: #note offs: if (message[0] == noteoff_id or (message[0] == noteon_id and message[2] == 0)): midinote = message[1] print(ck_note_dur) note_duration = ck_deltatime - ck_note_dur.pop( midinote) cKalc.parse_midi(msg, 'full', ck_deltatime_per_note=note_duration, ck_deltatime=ck_deltatime, articulaton=articulation) if message[0] == pedal_id and message[1] == pedal_sostenuto: per_note = 0 cKalc.parse_midi(msg, 'full', ck_deltatime_per_note=0, ck_deltatime=0, articulaton=articulation) if message[0] == noteon_id: #per_note = 0 ck_note_dur[message[1]] = ck_deltatime if message[2] > 0: dif = delta_difference(ck_deltatime) cKalc.parse_midi(msg, 'full', ck_deltatime_per_note=per_note, ck_deltatime=dif, articulaton=articulation) time.sleep(0.01) except KeyboardInterrupt: print('') finally: codeK.end()
def main(configfile='default_setup.ini'): """Start motippets! :param string configfile: The configurationfile to use. Defaults to default_setup.ini """ global mapping, parameters, conditionalsRange, conditionals, param_interval, threads_are_perpetual, range_trigger, notecounter #Read config and settings config = configparser.ConfigParser(delimiters=(':'), comment_prefixes=('#')) config.read(configfile, encoding='utf8') try: myPort = config['midi'].getint('port') device_id = config['midi'].getint('device_id') except KeyError: raise LookupError('Missing key information in the config file.') if (myPort == None or device_id == None): raise LookupError('Missing key information in the config file.') codeK = Setup() codeK.print_welcome(27) codeK.open_port(myPort) # Use your favourite mapping of the keys mapping = Mapping_Motippets() print("\nCodeKlavier is ready and ON.") print("You are performing: Motippets") print("\nPress Control-C to exit.") # activesense compensation ck_deltatime_mem = [] ck_deltatime = 0 ck_deltadif = 0 # main memory (i.e. listen to the whole register) mainMem = Motippets(mapping, device_id) # midi listening per register memLow = Motippets(mapping, device_id) memMid = Motippets(mapping, device_id) memHi = Motippets(mapping, device_id) #midi listening for tremolos tremoloHi = Motippets(mapping, device_id) tremoloMid = Motippets(mapping, device_id) tremoloLow = Motippets(mapping, device_id) #midi listening for conditionals conditionals = {1: Motippets(mapping, device_id), 2: Motippets(mapping, device_id), 3: Motippets(mapping, device_id)} conditionalsRange = Motippets(mapping, device_id) parameters = Motippets(mapping, device_id) #multiprocessing vars threads = {} notecounter = 0 range_trigger = 0 param_interval = 0 threads_are_perpetual = True # MAIN Loop to keep listening for midi input #TODO: split this up in smaller functions, so it becomes easier to understand what is going on try: while threads_are_perpetual: msg = codeK.get_message() if msg: message, deltatime = msg ck_deltatime += deltatime if message[0] != 254: if message[0] == device_id: if message[2] > 0 and message[0] == device_id: notecounter += 1 ck_deltatime_mem.append(ck_deltatime) #print('deltatimes before: ', ck_deltatime_mem) if len(ck_deltatime_mem) > 2: ck_deltatime = 0 ck_deltatime_mem = ck_deltatime_mem[-2:] ck_deltatime_mem[0] = 0 if len(ck_deltatime_mem) == 2: ck_deltadif = ck_deltatime_mem[1] - ck_deltatime_mem[0] else: ck_deltadif = 0 ##motifs: mainMem.parse_midi(msg, 'full',ck_deltadif) memLow.parse_midi(msg, 'low',ck_deltadif) memMid.parse_midi(msg, 'mid',ck_deltadif) memHi.parse_midi(msg, 'hi',ck_deltadif) motif1_played = memMid._motif1_counter motif2_played = mainMem._motif2_counter minimotif1_low_mapped = memLow._unmapCounter1 minimotif2_low_mapped = memLow._unmapCounter2 minimotif3_low_mapped = memLow._unmapCounter3 minimotif1_mid_mapped = memMid._unmapCounter1 minimotif2_mid_mapped = memMid._unmapCounter2 minimotif1_hi_mapped = memHi._unmapCounter1 minimotif2_hi_mapped = memHi._unmapCounter2 ##tremolos: if motif1_played > 0 or motif2_played > 0: if minimotif1_low_mapped > 0: tremoloLow.parse_midi(msg, 'tremoloLow', ck_deltadif, 1) elif minimotif2_low_mapped > 0: tremoloLow.parse_midi(msg, 'tremoloLow', ck_deltadif, 2) elif minimotif3_low_mapped > 0: tremoloLow.parse_midi(msg, 'tremoloLow', ck_deltadif, 3) if minimotif1_mid_mapped > 0: tremoloMid.parse_midi(msg, 'tremoloMid', ck_deltadif, 1) elif minimotif2_mid_mapped > 0: tremoloMid.parse_midi(msg, 'tremoloMid', ck_deltadif, 2) if minimotif1_hi_mapped > 0: tremoloHi.parse_midi(msg, 'tremoloHi', ck_deltadif, 1) elif minimotif2_hi_mapped > 0: tremoloHi.parse_midi(msg, 'tremoloHi', ck_deltadif, 2) ##conditionals conditional_value = conditionals[1].parse_midi(msg, 'conditional 1', ck_deltadif) conditional2_value = conditionals[2].parse_midi(msg, 'conditional 2', ck_deltadif) conditional3_value = conditionals[3].parse_midi(msg, 'conditional 3', ck_deltadif) if isinstance(conditional_value, int) and conditional_value > 0: conditional_params = parameters.parse_midi(msg, 'params', ck_deltadif) #set the parameter for the timer: if isinstance(conditional_params, int) and conditional_params > 0: if conditional_value != 4: threads['set_param'] = Thread(target=set_parameters, name='set timer value', args=(conditional_params, 'amount')) threads['set_param'].start() elif conditional_value == 4: #gong bomb threads['set_param'] = Thread(target=set_parameters, name='set countdown value', args=(conditional_params, 'gomb')) threads['set_param'].start() if param_interval > 0: #if conditional_value != 4: notecounter = 0 # reset the counter threads[conditional_value] = Thread(target=noteCounter, name='conditional note counter thread', args=(param_interval, 100, conditional_value, True)) threads[conditional_value].start() #elif conditional_value == 4: #start the countdown #gomb = Thread(target=gong_bomb, name='gomb', args=(param_interval, True)) #gomb.start() if isinstance(conditional2_value, int) and conditional2_value > 0: conditionalsRange._conditionalStatus = conditional2_value conditional_params = parameters.parse_midi(msg, 'params',ck_deltadif) # set range parameter: if isinstance(conditional_params, int) and conditional_params > 0: if conditional_value != 4: threads['set_param'] = Thread(target=set_parameters, name='set timer value', args=(conditional_params, 'range')) threads['set_param'].start() elif conditional_value == 4: #gong bomb threads['set_param'] = Thread(target=set_parameters, name='set countdown value', args=(conditional_params, 'gomb')) threads['set_param'].start() if param_interval > 0: threads[conditional2_value] = Thread(target=rangeCounter, name='conditional range thread', args=('random', 'more than', 2, conditional2_value, param_interval)) threads[conditional2_value].start() if isinstance(conditional3_value, int) and conditional3_value > 0: conditionalsRange._conditionalStatus = conditional3_value conditional_params = parameters.parse_midi(msg, 'params',ck_deltadif) # set range parameter: if isinstance(conditional_params, int) and conditional_params > 0: if conditional_value != 4: threads['set_param'] = Thread(target=set_parameters, name='set timer value', args=(conditional_params, 'range')) threads['set_param'].start() elif conditional_value == 4: #gong bomb threads['set_param'] = Thread(target=set_parameters, name='set countdown value', args=(conditional_params, 'gomb')) threads['set_param'].start() if param_interval > 0: threads[conditional3_value] = Thread(target=rangeCounter, name='conditional range thread', args=('random', 'less than', 3, conditional3_value, param_interval)) threads[conditional3_value].start() #range parser if range_trigger == 1: conditionalsRange.parse_midi(msg, 'conditional_range') time.sleep(0.01) #check except KeyboardInterrupt: print('') finally: codeK.end()
import time import random from threading import Thread, Event import sys import os import inspect # CodeKlavier modules from CK_Setup import Setup, BColors from Mapping import Mapping_Motippets from motippets_classes import Motippets # Start the CodeKlavier codeK = Setup() myPort = codeK.perform_setup() codeK.open_port(myPort) device_id = codeK.get_device_id() print('your device id is: ', device_id, '\n') # Use your favourite mapping of the keys mapping = Mapping_Motippets() print("\nCodeKlavier is ready and ON.") print("You are performing: Motippets") print("\nPress Control-C to exit.") # main memory (i.e. listen to the whole register) mainMem = Motippets(mapping, device_id)
def record(self, framesize=10): """ Run a basic miditest to see how the CodeKlavier is receiving your midi. :param string configfile: Path to the configuration file (default: default_setup.ini) """ timestamp = time.strftime("%y-%m-%d") ck_deltatime = 0 per_note = 0 recfile = open('ml_data/_', 'w') headers = '' #Read config and settings config = configparser.ConfigParser() config.read(self._configfile, encoding='utf8') try: myPort = config['midi'].getint('port') note_on = config['midi'].getint('noteon_id') note_off = config['midi'].getint('noteoff_id') except KeyError: raise LookupError('Missing key information in the config file.') if (myPort == None or note_on == None): raise LookupError('Missing key information in the config file.') codeK = Setup() codeK.open_port(myPort) print('your note on id is: ', note_on, '\n') print("CodeKlavier is RECORDING. Press Control-C to save and exit.") for i in range(0, framesize): if framesize == 1: index = '' else: index = str(i) headers += 'midi_note' + index + ',velocity' + index + ',duration' + index + ',label' + index recfile.write(headers + '\n') data_line = '' deltatime_mem = {} ostinato_length = 9 note_counter = 1 try: while True: msg = codeK.get_message() if msg: message, deltatime = msg ck_deltatime += deltatime per_note += deltatime if message[0] != 254: if message[0] == note_on: deltatime_mem[message[1]] = ck_deltatime velocity = message[2] if message[0] == note_off: if note_counter > 9: note_counter = 1 per_note = 0 dif = self.delta_difference(per_note) #midimsg = list(map(str, message)) #full msg not needed midinote = message[1] label = note_counter / ostinato_length #label = 0 note_duration = ck_deltatime - deltatime_mem.pop( midinote) data_line += str(midinote) + ',' + str( velocity) + ',' + str( note_duration) + ',' + str(label) data_line += '\n' clean_line = re.sub(r"\[?\]?", '', data_line) print(clean_line) recfile.write(clean_line) data_line = '' note_counter += 1 time.sleep(0.01) except KeyboardInterrupt: print('saving recording...') finally: recfile.close() title = input( 'Dear CK user, please type a comprehensive title for the recording and press ENTER:' ) usertitle = title + '_' + timestamp + '.csv' os.rename("ml_data/_", "ml_data/" + usertitle) print("recording saved with title: ", usertitle) codeK.end()