def __init__(self, document, attributes=None): Composition.__init__(self, attributes) self._b1 = None self._b2 = None return
# Main theme # Import modules. import os import sys # Import classes from other files. sys.path.insert(0, './src') from Composition import Composition from Voice import Voice # Script below. comp = Composition(2, 110) oboe = comp.buildVoice(69, 'Oboe') guitar = comp.buildVoice(25, 'Guitar') violin = comp.buildVoice(41, 'Violin') horn = comp.buildVoice(61, 'French Horn') cello = comp.buildVoice(43, 'Cello') timpani = comp.buildVoice(48, 'Timpani') lowStringSec = comp.buildVoice(50, 'Low string section') lowStringSec.adjustPitchOffset(-24) tuba = comp.buildVoice( 61, 'Tuba' ) # 61 is actually french horn, because it's the only brass that doesn't sound terrible. tuba.adjustPitchOffset(-24) # Tweak volume, because some voices are really low for some reason. violin.setVolume(80) guitar.setVolume(80)
def __init__(self, document, attributes): Composition.__init__(self, attributes) self._bodies = [] return
import os import sys # Import classes from other files. sys.path.insert(0, './src') from Composition import Composition from Voice import Voice from ScaledNote import ScaledNote SC = ScaledNote # Source common settings. exec(open("./default_settings.py").read()) # Script below. comp = Composition(2, 100) violinSol = comp.buildVoice(41, 'Violin Solo') violinSol.setVolume(70) harp = comp.buildVoice(47, 'Harp') harp.setVolume(100) stringEns = comp.buildVoice(49, 'Strings') cello = comp.buildVoice(43, 'Cello') cello.adjustPitchOffset(-24) fHorn = comp.buildVoice(61, 'French Horn') fHorn.adjustPitchOffset(-12)
import os import sys # Import classes from other files. sys.path.insert(0, './src') from Composition import Composition from Voice import Voice from ScaledNote import ScaledNote SC = ScaledNote # Source common settings. exec(open("./default_settings.py").read()) # Script below. comp = Composition(2, 160) violin1 = comp.buildVoice(41, 'Violin 1') violin2 = comp.buildVoice(41, 'Violin 2') viola = comp.buildVoice(42, 'Viola') viola.adjustPitchOffset(-12) cello = comp.buildVoice(43, 'Cello') cello.adjustPitchOffset(-24) baseKey = 70 comp.setKey(baseKey) #comp.setScale(Voice.NATURAL_MINOR)
def toMonosaccharide(self, mstr, substituents=[]): m = Monosaccharide() MODS = mstr.split('|') MONO = MODS[0].split('-') #set mono number #m.set_num(int(mono_num)) #set ring ring = MONO[-1] ringStart, ringEnd = ring.split(':') m.set_ring_start(int(ringStart)) m.set_ring_end(int(ringEnd)) MONO.remove(ring) #set class superclass = MONO[-1] MONO.remove(superclass) m.set_superclass(superclass) #set anomer anomer = MONO[0] MONO.remove(anomer) m.set_anomer(anomer) #set stem configs = [] stems = [] for st in MONO: configs.append(st[0]) stems.append(st[1:]) m.set_config(configs) m.set_stem(stems) #set mods mod_list = [] mod_position_list = [] for mod in MODS[1:]: num, modi = mod.split(':') mod_position_list.append(int(num)) mod_list.append(modi) m.set_mod_positions(mod_position_list) m.set_mods(mod_list) #set substituents #s_num = int(mono_num) + 1 for s in substituents: #print 'add_substituent in new_monosaccharide > from_str', substituent.name() m.add_substituent(s) #,s_num) #s_num += 1 #set composition composition = {} C = Composition().unit(superclass)['C'] H = Composition().unit(superclass)['H'] N = Composition().unit(superclass)['N'] O = Composition().unit(superclass)['O'] for mod in mod_list: C += Composition().unit(mod)['C'] H += Composition().unit(mod)['H'] N += Composition().unit(mod)['N'] O += Composition().unit(mod)['O'] for substituent_string in substituents: C += Composition().unit(substituent_string)['C'] H += Composition().unit(substituent_string)['H'] N += Composition().unit(substituent_string)['N'] O += Composition().unit(substituent_string)['O'] m.set_composition(C, H, O, N) return m
import os import sys # Import classes from other files. sys.path.insert(0, './src') from Composition import Composition from Voice import Voice from ScaledNote import ScaledNote SC = ScaledNote # Source common settings. exec(open("./default_settings.py").read()) # Script below. comp = Composition(2, 100) strings = comp.buildVoice(50, 'Strings') cello = comp.buildVoice(43, 'Cello') melodyVol = 100 backgroundVol = 60 cello.adjustPitchOffset(-12) baseKey = 58 comp.setKey(baseKey) comp.setScale(Voice.MAJOR) # Functions
import os import sys # Import classes from other files. sys.path.insert(0, './src') from Composition import Composition from Voice import Voice from ScaledNote import ScaledNote SC = ScaledNote # Source common settings. exec(open("./default_settings.py").read()) # Script below. comp = Composition(2, 160) leadGuitar = comp.buildVoice(27, 'Lead Guitar') leadGuitar.adjustPitchOffset(-12) rhythmGuitar = comp.buildVoice(25, 'Rhythm Guitar') rhythmGuitar.adjustPitchOffset(-12) perc = comp.buildPerc() bassGuitar = comp.buildVoice(34, 'Bass Guitar') bassGuitar.adjustPitchOffset(-24) leadVocal = comp.buildVoice(28, 'Lead Vocal') leadVocal.adjustPitchOffset(-12) leadVocal.setVolume(80)
import os import sys # Import classes from other files. sys.path.insert(0, './src') from Composition import Composition from Voice import Voice from ScaledNote import ScaledNote SC = ScaledNote # Source common settings. exec(open("./default_settings.py").read()) # Script below. comp = Composition(2, 110) guitar = comp.buildVoice(25, 'Guitar') flute = comp.buildVoice(74, 'Flute') guitar.adjustPitchOffset(-12) flute.adjustPitchOffset(12) guitar.setVolume(80) comp.setKey(64) strumSp = .03
# portion of "Dancing Mad", a song by Nobuo Uematsu in Final Fantasy VI. The # purpose of the script is to demonstrate changing from a major key to a minor # key easily. # Import modules. import os import sys # Import classes from other files. sys.path.insert(0, './src') from Composition import Composition from Voice import Voice # For constants # Script below. comp = Composition(2, 160) rightHand = comp.buildVoice(1, 'Right Hand') # Right hand of the keyboard. I never built a left hand voice. rightHand.setKey(7+12*4) def staccatoNote(note, isChromatic = False): if isChromatic: rightHand.scaledChromaticNote(note,.5) else: rightHand.scaledNote(note, .5) rightHand.rest(.5) def kefka(): staccatoNote(0)
# This will be the boss battle, though. # Import modules. import os import sys # Import classes from other files. sys.path.insert(0, './src') from Composition import Composition from Voice import Voice from ScaledNote import ScaledNote SC = ScaledNote # Script below. comp = Composition(2, 110) strings = comp.buildVoice(41, 'Strings') # Same as violin, but different part. violin = comp.buildVoice(41, 'String Ens') tuba = comp.buildVoice(59, 'Tuba') timpani = comp.buildVoice(48, 'Timpani') cello = comp.buildVoice(43, 'Cello') # "Metal" variant. #strings = comp.buildVoice(31, 'Distorted Guitar') #violin = comp.buildVoice(26, '"Steel" Acoustic Guitar') #tuba = comp.buildVoice(34, 'Electric Bass') #timpani = comp.buildVoice(117, 'Bass drum') # This is actually a "Taiko drum", whatever that is. #cello = comp.buildVoice(30, 'Overdriven Guitar') violin.setVolume(80)
import os import sys # Import classes from other files. sys.path.insert(0, './src') from Composition import Composition from Voice import Voice from ScaledNote import ScaledNote SC = ScaledNote # Source common settings. exec(open("./default_settings.py").read()) # Script below. comp = Composition(2, 160) leadGuitar = comp.buildVoice(27, 'Lead Guitar') leadGuitar.adjustPitchOffset(-12) rhythmGuitar = comp.buildVoice(25, 'Rhythm Guitar') #rhythmGuitar = comp.buildVoice(1, 'Piano right hand') # Piano version. rhythmGuitar.adjustPitchOffset(-12) perc = comp.buildPerc() bassGuitar = comp.buildVoice(34, 'Bass Guitar') #bassGuitar = comp.buildVoice(1, 'Piano left hand') # Piano version. bassGuitar.adjustPitchOffset(-24) leadVocal = comp.buildVoice(41, 'Lead Vocal')
""" def __init__(self, filePath): """ Constructor of the class """ self.jsonFileName = filePath self.parsedData = self.parseJson() def parseJson(self): """ json parser """ with open(self.jsonFileName) as f_in: return json.load(f_in) def getIp(self): return self.parsedData["MQTT_BROKER"] try: masterConfig = ParseJson("./Config.json") except: traceback.print_exc() sys.exit(1) ipAddress = masterConfig.getIp() print(ipAddress) Composition(ipAddress).start()
from Note import Note from Composition import Composition from CompositionPlayer import CompositionPlayer from MetricManager import MetricManager from GA import GA from Notes import * selectedTrack1 = Composition([C4, G4, A5, A5sh, F4, E5, D4, C4]) # selectedTrack2 = [E, D, C, D, E, E, D, D] # selectedTrack3 = [F, A, D, D, G, E, A, C] alteredComp = GA().runGA(selectedTrack1, 400) CompositionPlayer.play(selectedTrack1) CompositionPlayer.play(alteredComp)
import os import sys # Import classes from other files. sys.path.insert(0, './src') from Composition import Composition from Voice import Voice from ScaledNote import ScaledNote SC = ScaledNote # Source common settings. exec(open("./default_settings.py").read()) # Script below. comp = Composition(2, 80) orgInd = 20 #orgInd = 1 # Piano makes it easier to hear while testing. organHigh = comp.buildVoice(orgInd, 'Organ High') organMid = comp.buildVoice(orgInd, 'Organ Mid') organLow = comp.buildVoice(orgInd, 'Organ Low') organMid.adjustPitchOffset(-12) organLow.adjustPitchOffset(-24) defKey = 68 comp.setKey(defKey) # Functions
import sys # Import classes from other files. sys.path.insert(0, './src') from Composition import Composition from Voice import Voice from ScaledNote import ScaledNote SC = ScaledNote # Source common settings. exec(open("./default_settings.py").read()) # Script below. comp = Composition(2, 160) leadGuitar = comp.buildVoice(27, 'Lead Guitar') leadGuitar.adjustPitchOffset(-12) rhythmGuitar = comp.buildVoice(25, 'Rhythm Guitar') rhythmGuitar.adjustPitchOffset(-12) perc = comp.buildPerc() bassGuitar = comp.buildVoice(34, 'Bass Guitar') bassGuitar.adjustPitchOffset(-24) brass = comp.buildVoice(62, 'Brass Section') brass.setVolume(80)
# Import modules. import os import sys # Import classes from other files. sys.path.insert(0, './src') from Composition import Composition from Voice import Voice # Source common settings. exec(open("./default_settings.py").read()) # Script below. comp = Composition(2, 110) guitar = comp.buildVoice(25, 'Guitar') violin = comp.buildVoice(41, 'Violin') flute = comp.buildVoice(74, 'Flute') perc = comp.buildVoice(116, 'Woodblock') violin.adjustPitchOffset(-12) violin.setVolume(127) comp.setKey(58) # Functions def stacEighth(voice, note): '''Staccato eighth note.'''
def __init__(self, attributes): Composition.__init__(self, attributes) self._body = None return
def __init__(self, root, attributes): Composition.__init__(self, root, attributes) self._body = None return
import os import sys # Import classes from other files. sys.path.insert(0, './src') from Composition import Composition from Voice import Voice from ScaledNote import ScaledNote SC = ScaledNote # Source common settings. exec(open("./default_settings.py").read()) # Script below. comp = Composition(2, 160) leadGuitar = comp.buildVoice(27, 'Lead Guitar') leadGuitar.adjustPitchOffset(-12) rhythmGuitar = comp.buildVoice(25, 'Rhythm Guitar') rhythmGuitar.adjustPitchOffset(-12) perc = comp.buildPerc() bassGuitar = comp.buildVoice(34, 'Bass Guitar') bassGuitar.adjustPitchOffset(-24) bassGuitar.setVolume(127) violin = comp.buildVoice(44, 'Violin') # 44 is actually contrabass, but it sounds softer.
def parseAllSite(self): global lst_compo_ext, lst_compo_dom, lst_carton_dom, lst_changement_dom, lst_changement_ext, lst_carton_ext, lst_butteurs_ext, lst_butteurs_dom, score_mt cpt = 0 # Pour chaque championnat for link in self.loadCsv("C:/Users/ccame/Desktop/Pronostic/championnat_interessant.csv"): print(link) # ON récuperre le code source HTML soup_page_compet = self.connect(link) # Nom de competition et du pays nom_compet = soup_page_compet.find('div', class_='panel-heading livescore_head').find('div', class_='lienCompetition').text # div des resultats resultat_page = soup_page_compet.find('div', class_='objselect') # Liste des journées journees = resultat_page.findAll('option') # Pour chaque journées for journee in journees: #Pour limiter le nombre de match pour les test #if (cpt > 200):break # ON récuperre le code source HTML soup_page_resultat = self.connect(self.url + str(journee['value'])) # Liste des matchs matchs = soup_page_resultat.find('div', class_='panel-body').findAll('tr') # Parcour de la liste de matchs for match in matchs: # On réccupere l'ID du match try: id_match = match['data-matchid'] except: id_match = '' # Colonne du match data_match = match.findAll('td') # Si le match contient des informations if (data_match != []): # Heure du match heure = data_match[0].text # Parcour des span de resultat de match resulat_match_span = data_match[2].findAll('span') # Si le match est terminé if (data_match[1].text[5] == 'T'): # Split du score des deux equipes score = resulat_match_span[2].text.split('-') # Statu du match statut_match = 'termine' # Equipe domicile lst_but_domicile = [resulat_match_span[0].text, score[0].strip()] # equipe exterieur lst_but_exterieur = [resulat_match_span[3].text, score[1].strip()] # Si l'équipe a domicile a plus de buts if (int(score[0].strip()) > int(score[1].strip())): # Alors l'équipe a domicile gagne resultat_dom = 'g' resultat_ext = 'p' # Si l'equipe a l'exterieur a plus de buts elif (int(score[0].strip()) < int(score[1].strip())): # Alors l'equipe a l'exterieur gagne resultat_dom = 'p' resultat_ext = 'g' # Sinon else: # Match nul resultat_dom = 'n' resultat_ext = 'n' else: # Statut du match statut_match = 'a venir' # Données vide pour les résultats lst_but_domicile = [resulat_match_span[0].text, ''] lst_but_exterieur = [resulat_match_span[4].text, ''] # Resultat vide pour l'instant resultat_ext = '' resultat_dom = '' # Ouverture du lien du match soup_page_match = self.connect(self.url + str(data_match[2].find('a')['href'])) # Date du match lst_date = self.jourSemDate(soup_page_match.find('div', class_='col-xs-12 text-center header').find('a').text) # Année de la saison saison = self.calculAnneeSaison(lst_date[1]) #Chargement des infos sur le match (cartons, buts, changements) div_ajax_2 = soup_page_match.find('div', id='ajax-match-detail-2') # Si cette div existe if (div_ajax_2 != None and div_ajax_2.text != ''): #Si le score MT existe if (div_ajax_2.find('table', id='match_evenement_score') != None): # Alors on réccupere le score a la mt div_mt = div_ajax_2.find('table', id='match_evenement_score').find('tr').findAll('td') score_mt = div_mt[1].text.split('-') #Si les evennements du matchs existent if (div_ajax_2.find('table', id='match_evenement') != None): # Liste des evennement du match list_event = div_ajax_2.find('table', id='match_evenement').findAll('tr') #Liste vide des différents évennement lst_butteurs_dom = [] lst_butteurs_ext = [] lst_carton_dom = [] lst_carton_ext = [] lst_changement_dom = [] lst_changement_ext = [] dict_entre_sortie = {'entree': '', 'sortie': '', 'minute': ''} # Pour chaque evenement du match for event in list_event: # SI c'est pas une pub a la con if (len(event.findAll('td', class_='bg-danger promo')) == 0): # Liste des colonnes de l'evennement detail_event_list = event.findAll('td') # Si l'evenement concerne l'équipe 1 if (detail_event_list[0].find('a') != None): # si c'est un but if (detail_event_list[0].find('span')['class'][2] == 'ico_evenement1'): lst_butteurs_dom.append(Butteur(detail_event_list[0].find('a').text,detail_event_list[1].text.replace("'",''),'jeu')) # si c'est un but sur péno elif (detail_event_list[0].find('span')['class'][2] == 'ico_evenement2'): lst_butteurs_dom.append(Butteur(detail_event_list[0].find('a').text,detail_event_list[1].text.replace("'", ''),'penalty')) # si c'est un Ppenlty raté elif (detail_event_list[0].find('span')['class'][2] == 'ico_evenement6'): lst_butteurs_dom.append(Butteur(detail_event_list[0].find('a').text,detail_event_list[1].text.replace("'",''),'penalty_fail')) # si c'est un CSC elif (detail_event_list[0].find('span')['class'][2] == 'ico_evenement7'): lst_butteurs_dom.append(Butteur(detail_event_list[0].find('a').text,detail_event_list[1].text.replace("'",''),'csc')) # Si c'est un carton jaune elif (detail_event_list[0].find('span')['class'][2] == 'ico_evenement4'): lst_carton_dom.append(Carton(detail_event_list[0].find('a').text,detail_event_list[1].text.replace("'", ''),'jaune1')) # si c'est un deuxieme carton jaune elif (detail_event_list[0].find('span')['class'][2] == 'ico_evenement5'): lst_carton_dom.append(Carton(detail_event_list[0].find('a').text,detail_event_list[1].text.replace("'", ''),'jaune2')) # Si c'est un carton rouge elif (detail_event_list[0].find('span')['class'][2] == 'ico_evenement3'): lst_carton_dom.append(Carton(detail_event_list[0].find('a').text,detail_event_list[1].text.replace("'", ''),'rouge')) # Si c'est une sortie de joueur elif (detail_event_list[0].find('span')['class'][2] == 'ico_evenement81'): # Nom du joueur de sortie dict_entre_sortie['sortie'] = detail_event_list[0].find('a').text # si le joueur entree est deja défini if (dict_entre_sortie['entree'] != ''): # Alors on ajoute le dictionnaire à la liste lst_changement_dom.append(Changement(dict_entre_sortie['entree'], dict_entre_sortie['sortie'], detail_event_list[1].text.replace("'",''))) # on réinitialise le dict dict_entre_sortie = {'entree': '', 'sortie': '', 'minute': ''} # si c'est une entrée de joueur elif (detail_event_list[0].find('span')['class'][2] == 'ico_evenement91'): # Nom du joueur entrant dict_entre_sortie['entree'] = detail_event_list[0].find('a').text # si le joueur sortie est deja défini if (dict_entre_sortie['sortie'] != ''): # Alors on ajoute le dictionnaire à la liste lst_changement_dom.append(Changement(dict_entre_sortie['entree'],dict_entre_sortie['sortie'],detail_event_list[1].text.replace("'", ''))) # on réinitialise le dict dict_entre_sortie = {'entree': '', 'sortie': '', 'minute': ''} # si elle concerne l'equipe 2 elif (detail_event_list[2].find('a') != None): # si c'est un but if (detail_event_list[2].find('span')['class'][2] == 'ico_evenement1'): lst_butteurs_ext.append(Butteur(detail_event_list[2].find('a').text,detail_event_list[1].text.replace("'",''),'jeu')) # si c'est un but sur péno elif (detail_event_list[2].find('span')['class'][2] == 'ico_evenement2'): lst_butteurs_ext.append(Butteur(detail_event_list[2].find('a').text,detail_event_list[1].text.replace("'",''),'penalty')) # si c'est un Ppenlty raté elif (detail_event_list[2].find('span')['class'][2] == 'ico_evenement6'): lst_butteurs_ext.append(Butteur(detail_event_list[2].find('a').text,detail_event_list[1].text.replace("'",''),'penalty_fail')) # si c'est un CSC elif (detail_event_list[2].find('span')['class'][2] == 'ico_evenement7'): lst_butteurs_ext.append(Butteur(detail_event_list[2].find('a').text,detail_event_list[1].text.replace("'", ''),'csc')) # Si c'est un carton jaune elif (detail_event_list[2].find('span')['class'][2] == 'ico_evenement4'): lst_carton_ext.append(Carton(detail_event_list[2].find('a').text,detail_event_list[1].text.replace("'", ''),'jaune1')) # si c'est un deuxieme carton jaune elif (detail_event_list[2].find('span')['class'][2] == 'ico_evenement5'): lst_carton_ext.append(Carton(detail_event_list[2].find('a').text,detail_event_list[1].text.replace("'", ''),'jaune2')) # Si c'est un carton rouge elif (detail_event_list[2].find('span')['class'][2] == 'ico_evenement3'): lst_carton_ext.append(Carton(detail_event_list[2].find('a').text,detail_event_list[1].text.replace("'", ''),'rouge')) # Si c'est une sortie de joueur elif (detail_event_list[2].find('span')['class'][2] == 'ico_evenement82'): # Nom du joueur de sortie dict_entre_sortie['sortie'] = detail_event_list[2].find('a').text # si le joueur entree est deja défini if (dict_entre_sortie['entree'] != ''): # Alors on ajoute le dictionnaire à la liste lst_changement_ext.append(Changement(dict_entre_sortie['entree'],dict_entre_sortie['sortie'],detail_event_list[1].text.replace("'", ''))) # on réinitialise le dict dict_entre_sortie = {'entree': '', 'sortie': '', 'minute': ''} # si c'est une entrée de joueur elif (detail_event_list[2].find('span')['class'][2] == 'ico_evenement92'): # Nom du joueur entrant dict_entre_sortie['entree'] = detail_event_list[2].find('a').text # si le joueur sortie est deja défini if (dict_entre_sortie['sortie'] != ''): # Alors on ajoute le dictionnaire à la liste lst_changement_ext.append(Changement(dict_entre_sortie['entree'],dict_entre_sortie['sortie'],detail_event_list[1].text.replace("'", ''))) # on réinitialise le dict dict_entre_sortie = {'entree': '', 'sortie': '', 'minute': ''} else: # On créé des listes vide a ajouter dans la data complete lst_carton_dom = [] lst_carton_ext = [] lst_changement_dom = [] lst_changement_ext = [] lst_butteurs_dom = [] lst_butteurs_ext = [] #Chargement de la compo des équipes div_compo = soup_page_match.find('div', id='ajax-match-detail-3').find('div', class_='panel panel-info MEDpanelcomposition') #Si la compoexiste if (div_compo != None): # Acces aux compos des deux equipes equipes = div_compo.findAll('td') # Tout les noms joueurs_dom = equipes[0].findAll('a') joueurs_ext = equipes[1].findAll('a') # tout les statuts statut_dom = equipes[0].findAll('span') statut_ext = equipes[1].findAll('span') # Liste des données de chaque joueurs lst_compo_dom = [] lst_compo_ext = [] #Compos des joueurs et leur statuts for i in range(len(joueurs_ext)): lst_compo_ext.append(Composition(joueurs_ext[i].text, statut_ext[i]['title'])) for i in range(len(joueurs_dom)):lst_compo_dom.append(Composition(joueurs_dom[i].text, statut_dom[i]['title'])) #Instanciation des équipes domicile et extérieur equipe_dom = Equipe(id_match, lst_date[0],lst_date[1],heure,statut_match,'dom',saison,nom_compet,resultat_dom, lst_but_domicile[0], lst_but_domicile[1] , lst_compo_dom , lst_carton_dom , lst_changement_dom, lst_butteurs_dom , int(score_mt[0].strip())) equipe_ext = Equipe(id_match, lst_date[0],lst_date[1],heure,statut_match,'ext',saison,nom_compet,resultat_ext, lst_but_exterieur[0], lst_but_exterieur[1] , lst_compo_ext, lst_carton_ext , lst_changement_ext , lst_butteurs_ext, int(score_mt[1].strip())) #equipe_dom.afficher() #equipe_ext.afficher() #Ajout de ces équipe a la collection self.collection_equipe.add(equipe_dom.toList()) self.collection_equipe.add(equipe_ext.toList()) cpt +=1
import os import sys # Import classes from other files. sys.path.insert(0, './src') from Composition import Composition from Voice import Voice from ScaledNote import ScaledNote SC = ScaledNote # Source common settings. exec(open("./default_settings.py").read()) # Script below. comp = Composition(2, 60) violin = comp.buildVoice(41, 'Violin') violin2 = comp.buildVoice(41, 'Violin 2') #violin2.setVolume(90) cello = comp.buildVoice(43, 'Cello') cello.adjustPitchOffset(-24) cello.setVolume(90) viola = comp.buildVoice(42, 'Viola') viola.adjustPitchOffset(-12) viola.setVolume(90) baseKey = 64