Odborné články Gymnaziální vzdělávání Python v hudbě: generátor chromatiky
Odborný článek

Python v hudbě: generátor chromatiky

19. 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 deváté aktivitě vytvoříme generátor chromatické stupnice. Každému tónu přiřadíme frekvenci a pomocí oscilátoru ji bude počítač přehrávat. Celý program bude mít jeden uživatelský vstup, kde uživatel zadá tón a program následně vygeneruje a přehraje od zadaného tónu chromatickou stupnici.
  • 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: Vytvoří přehledný program pro vyřešení konkrétního problému s ohledem na jeho možné důsledky a svou odpovědnost za ně; používá opakování, větvení programu se složenými podmínkami, proměnné, seznamy, podprogramy s parametry a návratovými hodnotami; ve snaze o vyšší efektivitu navrhuje, řídí a hodnotí souběh procesů.
  • Časová dotace:
    • Výuka: 45 minut
    • Příprava: 30 minut
  • Pomůcky, hardware a software
    • Učitel: nainstalovaný Python
    • Žák: PC WIN s nainstalovaným Pythonem a IDE

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ů
  • Znalost cyklů while a for
  • Znalost tvorby funkcí

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:

  • Vytvořit generátor chromatické stupnice, který bude postupně přehrávat tóny na určitých frekvencích.
  • Na praktické aktivitě zopakovat celou základní konstrukci jazyka Python.

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

Díky algoritmu můžeme generovat frekvence jednotlivých tónů, které nám mohou posloužit jako metodická pomůcka v hudebních výchovách při porovnání různých historických ladění.

Metodická poznámka

Tato aktivita navazuje na sérii Python v hudbě – 09 funkce. Tato aktivita je opakováním celé série Python v hudbě. Studenti upevňují a aplikují naučené dovednosti na reálný problém, který řeší pomocí algoritmizace.

Metodický postup

Nejprve si načrtneme zadání, jak by měl program vypadat:

Vytvořte algoritmus, který bude na základě frekvencí přehrávat dvanáctitónovou chromatickou řadu. Na základě uživatelského vstupu, kde uživatel zvolí tón, od kterého chce generovat chromatiku, se vygeneruje posloupná řada dvanácti tónů, které zároveň počítač přehraje na základě definovaných frekvencí.

Jak postupovat?

  1. Importujte moduly pro práci s časem a Windows zvuky.
  2. Vytvořte proměnnou scale, do které uložíte nejprve názvy tónů.

3. Poté vytvořte proměnnou frequency, do které uložíte frekvence jednotlivých tónů. Ty nebudeme složitě zjišťovat, ale pouze si je zkopírujeme ze zadání.

4. Vytvoříme funkci, která najde

index, na kterém se tón nachází.

5. Nesmíme zapomenout, že číslo, které nám funkce vrátí, se musí uložit do nějaké proměnné. Zároveň vytvoříme počítadlo tónů, které nastavíme na 0.

Jelikož pořadí hodnot na indexu z proměnné scale odpovídá údajům na indexech z proměnné frequency, nebude již těžké algoritmus rozhýbat. Když potřebujeme uložit více informací o nějakých konkrétních datech, uděláme to normálně přes vícerozměrný seznam. Ten jsme se ještě zatím neučili, tudíž použijeme dvě proměnné scale a frequency, které jsme si definovali na začátku.

6. Začneme cyklem while, který bude konat nějakou akci, dokud se počítadlo nenaplní 12 tóny.

7. Zde ovšem narazíme na problém – v případě, že vstup uživatele bude jiný než c, program dojede na konec řady, ale počítadlo ještě nebude naplněné 12 tóny. Algoritmus bude chtít generovat dál, ale program nahlásí chybu, že již nemá další data. V tom případě musíme tedy index nastavit zpět na 0, aby řada pokračovala dále od začátku stejně jako v hudební řadě.

8. Vidíme, že díky funkci, kterou jsme si vytvořili, je program mnohem snazší. Použijeme tedy další funkci, kterou již máme v modulu winsound nadefinovanou, a tou je přehrávání frekvencí. Jelikož tyto frekvence máme již nadefinované, stačí funkci říct, na jakém indexu v proměnné frequency si má údaje vyzvednout, a funkci pomocí beep zavolat. Nezapomeňme, že funkce winsound.beep má dva parametry. První je číslo, které vyjadřuje, na jaké frekvenci počítač rozezní oscilátor, druhý parametr je číslo, jež určuje, po jak dlouhou dobu bude takto činit. Nezapomeňme, že musíme upřesnit, že se jedná o číselný typ.

9. Jestliže jsme udělali všechno správně, tak nám náš program přehrává frekvence, které jsou uložené na jednotlivých indexech z proměnné frequency, a zároveň nám vypíše z proměnné scale, jak jim říkáme v hudebním světě. Gratuluji, právě jsme společně naučili počítač zahrát chromatickou stupnici. Je tam ale ještě jeden zádrhel. V případě, že se nám index vrátí do pozice 0, tak s ním kontroler přehrává opět nízkou frekvenci. Z hudební tradice ale chceme, aby tóny, které přesáhnou první oktávu, byly tónově vyšší než tóny z původní oktávy. Potřebujeme je vynásobit přesně jednou tolik, aby reprezentovaly tóny v další oktávě. Poté, co podmínka vynuluje index, musíme proměnnou frequency vynásobit dvěma.

Řešení:

Hodnocení:

aktivita v hodině, návrh vlastního řešení, sestavení vlastní funkce, funkčnost kódu, inovace a kreativní přístup, grafická úprava kódu, pasivní porozumění látce, míra porozumění zadání

Úloha 1: Vytvořte algoritmus, který bude přehrávat nadefinované frekvence, k nimž přiřadí jméno daného tónu. Postupujte následným způsobem:

  • Importujte modul winsound.
  • Utvořte proměnnou scale, kde do seznamu uložíte tóny v tomto pořadí: "c", "c#", "d", "d#", "e", "f", "f#", "g", "g#", "a", "bb", "b".
  • Vytvořte proměnnou frequency, do které uložíte frekvence jednotlivých tónů v tomto pořadí: 261.63, 277.18, 293.66, 311.13, 329.63, 349.23, 369.99, 392.00, 415.30, 440.00, 466.16, 493.88.
  • Vytvořte vstup, do kterého bude uživatel zadávat název tónu, od něhož bude algoritmus generovat chromatickou stupnici.
  • Vytvořte funkci, která najde pozici daného tónu pomocí metody index. Funkce bude vracet číslo, které bude představovat pozici indexu, na němž se hodnota nachází.
  • Celou funkci uložte do proměnné index. Hodnota proměnné bude volat funkci najdiTon(vstup).
  • Vytvořte proměnnou pocitadlo a nastavte ji na hodnotu 0.
  • Sestavte cyklus while, který bude mít následnou podmínku: pocitadlo < 13.
  • Uspořádejte if a else takovým způsobem, aby když nebude proměnná index větší než 11, budou se vypisovat hodnoty z proměnné scale.
  • V momentě, kdy index dosáhne hodnoty 11, vynulujte ho na hodnotu 0.
  • Nezapomeňte, že po každém vypsání hodnot z proměnné scale musí počitadlo i index zvýšit hodnotu o + = 1.
  • Za příkaz print přidejte také funkci beep(frequency[pozice], délka tónu).
  • Posledním bodem bude donutit program, aby se v případě platnosti podmínky, že index je větší než 11, všechny prvky v poli vynásobily dvěma. Použijte tuto metodu: frequency = [freq * 2 for freq in frequency].
  • Samotný výraz [freq * 2 for freq in frequency] je tzv. list comprehension, který slouží k vytvoření nového seznamu na základě existujícího seznamu frequency.
  • V tomto případě se pro každý prvek freq ze seznamu frequency provede operace freq * 2, což znamená, že každý prvek se vynásobí dvěma. Výsledkem list comprehension je nový seznam, ve kterém jsou prvky výsledky těchto operací.

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

Tento materiál je samostatnou prací, kde můžeme nechat větší iniciativu na studentech. Můžeme ji použít jako závěrečnou práci z oblasti programování v Pythonu, kde záleží na daných podmínkách, jak přísně se rozhodneme stanovit kritéria pro známkování. Práci můžeme pojmout jako společný projekt, kde postupně odkrýváme jednotlivé kroky a šikovnější studenty necháváme pracovat samostatně, očekáváme od nich vlastní inovativní řešení, jako je ošetření uživatelských vstupů, tvoření funkcí a celková úprava programu, která bude přispívat k intuitivní interakci mezi uživatelem a programem.

Se studenty, kteří mají problémy s abstrakcí, postupujeme pomalu a mezi jednotlivými kroky necháváme dostatečně dlouhé intervaly. Necháváme je opisovat řešení, které učitel promítá na společnou tabuli. Než učitel napíše řešení k jednotlivým bodům, nechá dostatečně dlouhý prostor pro individuální řešení studentů.

Daná úloha je celkem složitá a k jejímu vyřešení je potřeba nechat studentům dost prostoru. Ideálně tak můžeme úlohu rozdrobit do několika částí, kde si studenti ukládají svůj průběh a na dalších hodinách se k němu vracejí. Můžeme případně vytvořit i menší skupinky, které pracují na zadání společně.

Ideálně můžeme použít mechanismy gamifikace, kde nastavíme bodové hodnocení jednotlivých kroků. Jednotlivé skupinky tak mohou soutěžit v různých hodnotících kritériích, jako je rychlost, úprava, funkčnost, inovace aj. Hodnotící systém tak můžeme nastavit na zdravě soutěživé prostředí namísto klasického hodnocení, které by slabší studenty mohlo zbytečně stresovat.

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/