Odborné články Gymnaziální vzdělávání Python v hudbě: podmínky podruhé
Odborný článek

Python v hudbě: podmínky podruhé

10. 3. 2026
Gymnaziální vzdělávání
Autor
Pavel Konrád

Anotace

Pomocí programovacího jazyka Python prozkoumáme možnosti, jak přenášet a kódovat informace, které budeme demonstrovat na hudebních analogiích. V páté aktivitě ze série Python v hudbě si ukážeme další možnosti podmínek a rozšíříme náš předchozí skript. Pomocí podmínek ho také zkrátíme a zjednodušíme. Tato metoda vypočítá interval mezi dvěma zadanými tóny na základě předem definované stupnice a intervalového systému.
  • Typ materiálu: cvičení 
  • Škola: gymnázium
  • Ročník: kvarta
  • Metody: cvičení
  • Vzdělávací obor: informatika
  • Tematický okruh: algoritmizace a programování
  • Očekávané výstupy:Analyzuje problém, rozdělí problém na menší části, rozhodne, které je vhodné řešit algoritmicky, své rozhodnutí zdůvodní; sestaví a zapíše algoritmy pro řešení problému.
  • Časová dotace:
    • Výuka: 45 minut
    • Příprava: 30 minut
  • Pomůcky, hardware a software
    • Učitel: dataprojektor, výpočetní zařízení (PC, notebook, tablet)
    • Žák: výpočetní zařízení (PC, notebook, tablet)

Zdroje:

  • https://www.w3schools.com/python

Potřebné vstupní znalosti a dovednosti

Oborové

  • Základní orientace v programovacím jazyku Python
  • Znalost proměnných a datových typů

Digitální dovednosti

  • Pokročilé ovládání počítače
  • Schopnost postupovat podle návodu
  • Orientace v základní terminologii algoritmizace a programování

Vzdělávací cíle:

  • naučit se větvit algoritmus podle logických tvrzení

Přínos využití digitálnícg technologií

Logické operátory a pravdivostní hodnoty jsou základní operace, které můžeme použít při práci s daty. Díky skládání algoritmu nemusíme vypisovat stále se opakující informace, které tak necháváme generovat program automaticky. 

Metodická poznámka

Tato aktivita navazuje na sérii Python v hudbě 04 – Určení intervalu podle podmínek. V této aktivitě studenti vylepšují již funkční algoritmus, přičemž předpokládají různé scénáře, jakými se program může ubírat. Pomocí if a else tak rozhodují, jak bude program v různých scénářích postupovat. Díky if-else náš celý skript zjednodušíme a zkrátíme a tak se přiblížíme zase víc k přehlednému a logickému kódu.

Výklad

Program je především naprogramován tak, aby reagoval na uživatelské vstupy. Ty můžou mít různou podobu. V našem předchozím skriptu jsme pracovali s funkcí input(), do které mohl uživatel zadat nějaké hodnoty, které se uložily do proměnné x.

Jenže co když uživatel nepochopí, že má do pole input zadávat pouze tóny pro evropskou hudbu, a bude chtít určit např. interval mezi tóny a s, které nemáme nadefinované v proměnné scale?

Jestliže dovolíme uživateli s programem interagovat, měli bychom také zajistit, aby každý vstup byl nějakým způsobem ošetřený pro případ, že uživatel zadá hodnoty, se kterými program nepočítá. Existuje několik zavedených metod, jak ošetřovat vstupy, a jeden z nejjednodušších je ošetřit je podmínkou. Normálně se používají v Pythonu tzv. „výjimky“. Na ty bychom ovšem museli umět tvořit funkce, které v této sérii probereme později. Proto to v tuto chvíli zjednodušíme, ale princip zachováme. Použijeme totiž již známé if a dnes k němu přidáme i else.

Každá podmínka v programování má totiž i druhou část. Program musí vědět, že pokud se v programu děje „něco“, tak se podle toho „něčeho“ program zachová. Programu ale také musíme říct, co má dělat, když se to „něco“ nestane. K tomu slouží právě ta druhá část podmínky: else. Pojďme si to ukázat na pseudokódu.

If (hudebnik = bubenik)

Noty = false

Else:

noty = true

Kód nám říká, že když se objeví v proměnné hudebnik hodnota bubeníka, program bude vědět, že noty se nestanou skutečností. V každém jiném případě, kdy hudebníka bude představovat kdokoliv jiný, budou noty potřeba. Můžeme přidat ještě rozšiřující podmínku, kterou již známe z minula: elif. Může se totiž objevit ještě nějaká jiná skutečnost, která by mohla nastat.

If (hudebnik = bubenik)

Noty = false

Elif (hudebnik = violista)

Program end

Else:

noty = true

Ve skutečnosti takových situací může nastat nespočet. Taková zkouška muzikantů může mít mnoho dalších nevyzpytatelných proměnných.

If (hudebnik = bubenik)

           Noty = false

           Rytmus = true

Elif (hudebnik = zpevak)

     Noty = false

     Rytmus = false

     Zkouska = zpozdeni

Elif (hudebnik = basak)

     Noty = true

     Rytmus = true

     Komunikace = false  

Elif (hudebnik = kytarista)

     Problem = true

Elif (hudebnik = violista)

     Program end

     Else:

noty = true

Pomocí podmínek if, elif a else můžeme program rozvětvit do několika možných situací. Pojďme tedy zkusit ošetřit první vstup uživatele, kde zajistíme, že v případě, že do vstupu zadáme něco, co tam nepatří, program začne „nadávat“ a upozorní nás, že takové vstupy zadávat nelze. Nejdříve si pojďme nakopírovat začátek kódu z minula.

Uživatel teď může vložit nějakou hodnotu do proměnné x a y. Pojďme si ukázat, jak bychom mohli uživatele upozornit na to, že takovou interakci, kterou se právě rozhodl použít, jsme nepředpokládali.

Všimněme si, že jsme přidali do podmínky logický operátor not in. Python je v tomto ohledu velmi přívětivý a spoustu věcí nám takto ulehčuje. Logický operátor not in porovná hodnoty v proměnné scale s proměnnou x a vrátí True, pakliže ji najde. Podmínka se tedy vyhodnotí buď jako True, nebo False a podle toho pokračuje program dále. Rovnou přidáme podmínku, která bude takto hlídat i druhý vstup uživatele, a také přidáme kus kódu, takže v případě, že program najde shodu, rovnou vstupy převede na čísla, abychom mohli s proměnnými dále pracovat. Celý kód tedy zatím vypadá nějak takto:

Kód má stále spoustu závažných trhlin a nedostatků. Interakce je zde velmi omezená a v reálném nasazení by takováto validace nestačila. Jelikož kód nám slouží pouze jako demonstrace a my víme, jak s tímto naším programem máme interagovat, můžeme se posunout na další část programu a zkusit zase o něco zpříjemnit celkovou interakci.

Minule jsme vytvořili i výpočet, který nám sdělí, jaká je vzdálenost mezi dvěma tóny. Pojďme si ho připomenout a znovu si ho nakopírujeme do našeho současného řešení. V tomto řešení se ale nachází jeden závažný nedostatek. V případě, že zadáme první tón, který je v proměnné scale výše než druhý tón neboli má větší hodnotu, program začne vracet špatné hodnoty. Pojďme tedy vytvořit podmínku, že v případě, že bude první tón větší než ten druhý, program výpočet obrátí:

Máme tedy základně ošetřené vstupy uživatele, máme výpočet pro vzdálenost dvou tónů směrem nahoru i dolů. Jediné, co nám zbývá, je nějakým způsobem všechny výpočty zobrazit a přeložit do naší řeči. Možná vás již napadlo, že bychom nemuseli pracně vypisovat opět všechno větvení spjaté s tím, jaké číslo je jaký interval. Existuje jednodušší řešení, kterým si výrazně zkrátíme náš kód.

Když už zjistíme, o kolik tónů jsou od sebe jednotlivé tóny vzdálené, mohli bychom pak jednoduše toto číslo použít jako hledací index v nově vytvořené proměnné, která bude obsahovat na jednotlivých indexech jména intervalů. Abychom je nemuseli vypisovat, zde je seznam intervalů.

Pojďme tedy zkusit utvořit kus našeho kódu a poskládat jednotlivá řešení do sebe.

Zadání

  1. Nejdříve získáme vstup od uživatele: Použijeme funkci input() k získání dvou tónů od uživatele.
  2. Kontrola vstupu: Zkontrolujeme, zda zadané tóny jsou součástí předem definované stupnice. Pokud ano, uložíme pozici tónu pomocí metody index.
  3. Proměnná scale obsahuje seznam se jmény not, které se používají v západní hudbě. Každý prvek seznamu je řetězcem, který odpovídá jednomu z tónů západní stupnice. Například první prvek seznamu c odpovídá notě C.
  4. Proměnná intervals obsahuje seznam se jmény hudebních intervalů. Každý prvek seznamu je řetězcem, který popisuje vzdálenost mezi dvěma tóny v západní hudbě. Například první prvek seznamu Prima označuje vzdálenost mezi dvěma stejnými notami (např. C a C).
  5. Poté následuje blok kódu s podmínkami. Pokud je vstupní hodnota x nebo y rovna něčemu, co není v seznamu scale, program vypíše chybovou zprávu a skončí. V opačném případě program pokračuje dál a zjišťuje se pozice tónů v seznamu scale. Pokud jsou oba tóny platné, program vypočte vzdálenost mezi nimi a vypíše odpovídající interval ze seznamu intervals. Pokud je výpočet menší než 0, znamená to, že první tón je ve skutečnosti níže než druhý tón, takže program vypočítá interval směrem dolů.
  6. Konečný výstup by měl tedy být:

print(intervals[vypocet], " směrem dolů.")

Nebo:

print(intervals[vypocet], " směrem nahoru.")

Pokud bychom chtěli tento program rozšířit, mohli bychom například přidat další možnosti chyb, třeba pokud uživatel zadá neplatnou kombinaci tónů nebo více než dva tóny. Také bychom mohli přidat možnost zobrazit uživateli seznam platných tónů, aby si mohl vybrat z nabídky.

Řešení:

Úloha 1: Zadejte dva tóny a program vypočte vzdálenost mezi nimi a vypíše odpovídající hudební interval. Program kontroluje, zda jsou zadané tóny platné, a v případě neplatného vstupu vypíše chybovou zprávu.

Zkušenosti s použitím materiálu

V praxi se ukázalo, že tento materiál je vynikajícím samostatným cvičením. Studenti, kteří jsou napřed, zkouší vymyslet svá invenční řešení a vylepšují tak předešlé skripty. Se studenty, kteří plně nechápou podmínky, je to skvělá příležitost k opakování předešlé látky a jejímu upevnění v novém kontextu. Učitel může postupně odkrývat řešení či studentům připravit různé nápovědy, předpřipravit syntaxi apod.

Autor
Pavel Konrád

Hodnocení uživatelů

Článek nebyl prozatím komentován.

Váš komentář

Pro vložení komentáře je nutné se nejprve přihlásit.

RVP do 2024

Očekávané výstupy:

Materiály s klíčovým slovem NPO 3.1 DIGI vytvořil tým metodiků v projektu Podpora škol v kontextu digitalizace (Národní plán obnovy 3.1 DIGI) pro podporu pedagogů při ICT revizích.

Další informace, metodické materiály i inspiraci do výuky jednotlivých předmětů i napříč předměty najdete na webu https://digitalizace.rvp.cz/