Valitse rytmi
This commit is contained in:
parent
4f0af9f193
commit
88a86b3641
3 changed files with 48 additions and 16 deletions
|
@ -45,19 +45,40 @@ def lue_midi(tiedostopolku):
|
||||||
|
|
||||||
return tulos
|
return tulos
|
||||||
|
|
||||||
def kirjoita_midi(tiedostopolku, nuotit, tempo=120):
|
def kirjoita_midi(tiedostopolku, nuotit, tempo=120, rytmi="1/4"):
|
||||||
"""Kirjoittaa halutut nuotit valittuun MIDI-tiedostoon annetulla tempolla"""
|
"""Kirjoittaa halutut nuotit valittuun MIDI-tiedostoon annetulla tempolla"""
|
||||||
midi = mido.MidiFile()
|
midi = mido.MidiFile()
|
||||||
raita = mido.MidiTrack()
|
raita = mido.MidiTrack()
|
||||||
|
|
||||||
|
rytmi = rytmi_taulukoksi(rytmi)
|
||||||
|
iskun_kesto = midi.ticks_per_beat
|
||||||
|
rytmi = [round(x*4*iskun_kesto) for x in rytmi]
|
||||||
|
|
||||||
raita.append(mido.MetaMessage("set_tempo", tempo=mido.bpm2tempo(tempo), time=0))
|
raita.append(mido.MetaMessage("set_tempo", tempo=mido.bpm2tempo(tempo), time=0))
|
||||||
raita.append(mido.MetaMessage("time_signature"))
|
raita.append(mido.MetaMessage("time_signature"))
|
||||||
raita.append(mido.Message("program_change", program=0, time=0))
|
raita.append(mido.Message("program_change", program=0, time=0))
|
||||||
|
|
||||||
|
rytmi_i = 0
|
||||||
|
|
||||||
for nuotti in nuotit:
|
for nuotti in nuotit:
|
||||||
if nuotti:
|
if nuotti:
|
||||||
raita.append(mido.Message("note_on", note=nuotti, velocity=64, time=0))
|
raita.append(mido.Message("note_on", note=nuotti, velocity=64, time=0))
|
||||||
raita.append(mido.Message("note_on", note=nuotti, velocity=0, time=480))
|
raita.append(mido.Message("note_on", note=nuotti, velocity=0, time=rytmi[rytmi_i]))
|
||||||
|
rytmi_i = (rytmi_i + 1) % len(rytmi)
|
||||||
|
|
||||||
midi.tracks.append(raita)
|
midi.tracks.append(raita)
|
||||||
midi.save(tiedostopolku)
|
midi.save(tiedostopolku)
|
||||||
|
|
||||||
|
def rytmi_taulukoksi(rytmi):
|
||||||
|
rytmi = rytmi.split("|")
|
||||||
|
tulos = []
|
||||||
|
for alkio in rytmi:
|
||||||
|
alkio = alkio.split("/")
|
||||||
|
if len(alkio) == 2:
|
||||||
|
tulos.append(int(alkio[0]) / int(alkio[1]))
|
||||||
|
elif len(alkio) == 1:
|
||||||
|
tulos.append(int(alkio[0]))
|
||||||
|
else:
|
||||||
|
continue
|
||||||
|
|
||||||
|
return tulos
|
||||||
|
|
|
@ -95,9 +95,9 @@ class MusiikkiGeneraattori:
|
||||||
|
|
||||||
return len(self._nuotit)
|
return len(self._nuotit)
|
||||||
|
|
||||||
def kirjoita_midi(self, tiedostopolku, tempo=120):
|
def kirjoita_midi(self, tiedostopolku, tempo=120, rytmi="1/4"):
|
||||||
"""Kirjoittaa nuotit MIDI-tiedostoon halutulla tempolla"""
|
"""Kirjoittaa nuotit MIDI-tiedostoon halutulla tempolla ja rytmillä"""
|
||||||
kirjoita_midi(tiedostopolku, self._nuotit, tempo)
|
kirjoita_midi(tiedostopolku, self._nuotit, tempo, rytmi)
|
||||||
|
|
||||||
def _nuotit_midiksi(self, nuotit: str):
|
def _nuotit_midiksi(self, nuotit: str):
|
||||||
"""Muuttaa perinteiset nuottimerkinnät kuten C#4 MIDI-arvoiksi"""
|
"""Muuttaa perinteiset nuottimerkinnät kuten C#4 MIDI-arvoiksi"""
|
||||||
|
|
33
src/ui.py
33
src/ui.py
|
@ -12,8 +12,9 @@ class UI: # pylint: disable=too-few-public-methods, too-many-instance-attributes
|
||||||
self._tulos_polku = "savelma.mid"
|
self._tulos_polku = "savelma.mid"
|
||||||
self._aste = 1
|
self._aste = 1
|
||||||
self._alku = "C4"
|
self._alku = "C4"
|
||||||
self._nuottien_maara = 100
|
self._nuottien_maara = 120
|
||||||
self._tempo = 120
|
self._tempo = 120
|
||||||
|
self._rytmi = "1/4"
|
||||||
|
|
||||||
self._toiminnot = {
|
self._toiminnot = {
|
||||||
"A": ("(A)pu", self._tulosta_apu, 0,
|
"A": ("(A)pu", self._tulosta_apu, 0,
|
||||||
|
@ -24,12 +25,14 @@ class UI: # pylint: disable=too-few-public-methods, too-many-instance-attributes
|
||||||
"Valitse valmiin sävelmän polku"),
|
"Valitse valmiin sävelmän polku"),
|
||||||
"K": ("(K)etjun aste", self._aseta_aste, 1,
|
"K": ("(K)etjun aste", self._aseta_aste, 1,
|
||||||
"Aseta Markovin ketjun aste valittuun kokonaislukuun"),
|
"Aseta Markovin ketjun aste valittuun kokonaislukuun"),
|
||||||
"L": ("a(L)kuosa [merkkijono]", self._aseta_alkuosa, 1,
|
|
||||||
"Aseta alkuosa. Esim. 'C4|D#5|Gb3'"),
|
|
||||||
"N": ("(N)uotteja [luku]", self._aseta_nuottien_maara, 1,
|
"N": ("(N)uotteja [luku]", self._aseta_nuottien_maara, 1,
|
||||||
"Aseta sävelmän nuottien määrä valittuun kokonaislukuun"),
|
"Aseta sävelmän nuottien määrä valittuun kokonaislukuun"),
|
||||||
"T": ("(T)empo [luku]", self._aseta_tempo, 1,
|
"T": ("(T)empo [luku]", self._aseta_tempo, 1,
|
||||||
"Aseta tempo valittuun kokonaislukuun"),
|
"Aseta tempo valittuun kokonaislukuun"),
|
||||||
|
"R": ("(R)ytmi [merkkijono]", self._aseta_rytmi, 1,
|
||||||
|
"Aseta rytmi. Esim. '1/4|1/4|1/2'"),
|
||||||
|
"L": ("a(L)kuosa [merkkijono]", self._aseta_alkuosa, 1,
|
||||||
|
"Aseta alkuosa. Esim. 'C4|D#5|Gb3'"),
|
||||||
"G": ("(G)eneroi sävelmä", self._generoi_savelma, 0,
|
"G": ("(G)eneroi sävelmä", self._generoi_savelma, 0,
|
||||||
"Generoi sävelmä valituilla asetuksilla"),
|
"Generoi sävelmä valituilla asetuksilla"),
|
||||||
"S": ("(S)ulje", self._sulje, 0,
|
"S": ("(S)ulje", self._sulje, 0,
|
||||||
|
@ -93,6 +96,7 @@ class UI: # pylint: disable=too-few-public-methods, too-many-instance-attributes
|
||||||
print(f"Markovin ketjun aste: {self._aste}")
|
print(f"Markovin ketjun aste: {self._aste}")
|
||||||
print(f"Sävelmän pituus nuotteina: {self._nuottien_maara}")
|
print(f"Sävelmän pituus nuotteina: {self._nuottien_maara}")
|
||||||
print(f"Tempo: {self._tempo}")
|
print(f"Tempo: {self._tempo}")
|
||||||
|
print(f"Rytmi: '{self._rytmi}'")
|
||||||
print(f"Alkuosa: '{self._alku}'")
|
print(f"Alkuosa: '{self._alku}'")
|
||||||
|
|
||||||
def _tulosta_apu(self, _):
|
def _tulosta_apu(self, _):
|
||||||
|
@ -118,13 +122,6 @@ class UI: # pylint: disable=too-few-public-methods, too-many-instance-attributes
|
||||||
except ValueError:
|
except ValueError:
|
||||||
self._virheet.append("ANNETTU ASTE EI MUUTETTAVISSA KOKONAISLUVUKSI!")
|
self._virheet.append("ANNETTU ASTE EI MUUTETTAVISSA KOKONAISLUVUKSI!")
|
||||||
|
|
||||||
def _aseta_alkuosa(self, alkuosa):
|
|
||||||
alkuosa = alkuosa[0]
|
|
||||||
if search(r"^([CcDdEeFfGgAaBb][#b]?[0-8]\|)*[CcDdEeFfGgAaBb][#b]?[0-8]$", alkuosa):
|
|
||||||
self._alku = alkuosa
|
|
||||||
else:
|
|
||||||
self._virheet.append("ANNETTU ALKUOSA EI KELPAA!")
|
|
||||||
|
|
||||||
def _aseta_nuottien_maara(self, nuotteja):
|
def _aseta_nuottien_maara(self, nuotteja):
|
||||||
try:
|
try:
|
||||||
nuottien_maara = int(nuotteja[0])
|
nuottien_maara = int(nuotteja[0])
|
||||||
|
@ -143,13 +140,27 @@ class UI: # pylint: disable=too-few-public-methods, too-many-instance-attributes
|
||||||
except ValueError:
|
except ValueError:
|
||||||
self._virheet.append("ANNETTU TEMPO EI KELPAA!")
|
self._virheet.append("ANNETTU TEMPO EI KELPAA!")
|
||||||
|
|
||||||
|
def _aseta_rytmi(self, rytmi):
|
||||||
|
rytmi = rytmi[0]
|
||||||
|
if search(r"^\|?((([1-9]\/[1-9])|[1-9])\|)*(([1-9]/[1-9])|[1-9])\|?$", rytmi):
|
||||||
|
self._rytmi = rytmi
|
||||||
|
else:
|
||||||
|
self._virheet.append("ANNETTU RYTMI EI KELPAA!")
|
||||||
|
|
||||||
|
def _aseta_alkuosa(self, alkuosa):
|
||||||
|
alkuosa = alkuosa[0]
|
||||||
|
if search(r"^\|?([CcDdEeFfGgAaBb][#b]?[0-8]\|)*[CcDdEeFfGgAaBb][#b]?[0-8]\|?$", alkuosa):
|
||||||
|
self._alku = alkuosa
|
||||||
|
else:
|
||||||
|
self._virheet.append("ANNETTU ALKUOSA EI KELPAA!")
|
||||||
|
|
||||||
def _generoi_savelma(self, _):
|
def _generoi_savelma(self, _):
|
||||||
musiikki_generaattori.lue_opetusdata(self._opetusdata_polku)
|
musiikki_generaattori.lue_opetusdata(self._opetusdata_polku)
|
||||||
musiikki_generaattori.valmistele_ketju(self._alku, self._aste)
|
musiikki_generaattori.valmistele_ketju(self._alku, self._aste)
|
||||||
|
|
||||||
generoitu_maara = musiikki_generaattori.generoi_nuotteja(self._nuottien_maara)
|
generoitu_maara = musiikki_generaattori.generoi_nuotteja(self._nuottien_maara)
|
||||||
print(f"Generoitiin {generoitu_maara} nuottia!\n")
|
print(f"Generoitiin {generoitu_maara} nuottia!\n")
|
||||||
musiikki_generaattori.kirjoita_midi(self._tulos_polku, self._tempo)
|
musiikki_generaattori.kirjoita_midi(self._tulos_polku, self._tempo, self._rytmi)
|
||||||
|
|
||||||
def _sulje(self):
|
def _sulje(self):
|
||||||
sys_exit(0)
|
sys_exit(0)
|
||||||
|
|
Reference in a new issue