Noten kraken
Laat de computer muziek maken
Wie graag eerst een video kijkt, dat kan. Nu nog het origineel uit de SAP-cursus met Nederlandse ondertiteling, straks wellicht ook een Nederlandse variant.
In dit project gaan we muziek maken. Dat kan binnen Snap! op vele manieren.
Snap! heeft een blokkendoos Geluiden waarin je het basisblok
vindt. Hier kun je aangeven welke noot hoe lang moet worden gespeeld. Hoe lang een tel duurt hangt af van het aantal tellen in een minuut, een term die beter bekend is als BPM (beats per minute) en die je kan instellen met
.
Een liedje bestaat uit een heleboel noten en die zou je stuk voor stuk kunnen maken en onder elkaar plakken
Een begin van Gloria …
Maar dat wordt al snel onoverzichtelijk. Een truc om het overzichtelijker te krijgen is abstractie, wat hier wil zeggen dat je de inhoud (de noten) loskoppelt van de actie (het afspelen). Zodat je bijvoorbeeld eenvoudig kunt wisselen naar een ander liedje.
De noten van Gloria in een lijst die een-voor-een gespeeld worden
  • Open een nieuw Snap!-project en bewaar dat als MC2DS-W1U4-NotenKraken
  • Bouw bovenstaande scripts allebei na en luister hoe ze klinken
  • Wijzig het tempo met
    en luister opnieuw
  • Vind je element een goede naam voor de noten die gespeeld worden? Je kunt het veranderen in noot door op de eerste
    en klikken en dan in het venster de naam te wijzigen:
Standaardwaarde element vervangen door een woord dat de lijstelementen beter beschrijft
Zoals je hoort klinkt het nog wat vlak. Een manier om er leven in te brengen is door de speelduur, nu steeds een halve tel, te variëren.
  • Maak een tweede lijst noten, maar nu met voor elke noot een lijstje: noot met zijn speelduur
Voor het spelen kun je nu gebruik maken van
en
, de eerste voor de noot en de tweede voor de tijdsduur.
  • Pas het afspeelblok aan zodat rekening wordt gehouden met de tijd
  • Maak een variabele aan, noem die bijvoorbeeld Gloria, en wijs als waarde de bovenstaande lijst toe:
  • Nu kan het afspelen veel overzichtelijker met
En als liedjes zo opgeslagen worden in lijstjes van lijstjes kun je bovenstaande samenvatten in een zelfgemaakt blok
. In programmeren noemen we dit een abstractie stap. We verbergen de details binnen de definitie van een goedgekozen functienaam. Het blok spreekt voor zichzelf en kan ook gebruikt worden als je niet (meer) precies weet hoe een liedje wordt afgespeeld.
  • Maak zo'n blok.
Liedjes kun je ook in een hogere toon zingen. Als je alle noten met eenzelfde aantal hele of halve tonen verhoogt, dan noemen we dat transponeren.
  • Wat verwacht als resultaat van
    ?
Een manier om zo'n transponeerblok te bouwen is door met iteratie van iedere noot (een tweetal toonhoogte, speelduur) de toonhoogte te veranderen met het opgegeven getal:
  • Probeer de code eerst te begrijpen en bouw hem daarna na.
  • Gebruik je blok om een liedje met oplopende toonhoogte af te spelen:

Akkoorden

Bij een akkoord speel je meerdere noten tegelijkertijd. We moeten een truc verzinnen om meerdere
blokken precies tegelijk te laten starten. Dat kan bijvoorbeeld met de groene vlag:
, zodra je op de groene vlag klikt worden de scripts die onder een groene vlag hangen gestart. Je zou ook met signalen kunnen werken, maar dan wordt het al snel onoverzichtelijk. Eigenlijk zou je een blok willen maken dat in een keer duidelijk maakt wat er moet gebeuren:
Er is een betere aanpak mogelijk door gebruik te maken van het start script blok
  • Bouw zo'n blok om een akkoord te spelen en beluister het resultaat
Het kan heel goed dat je met bovenstaand blok alleen de laatste noot hoort. Dit komt doordat het startblok zoveel tijd nodig heeft om te starten dat de waarde van noot alweer gewijzigd is. Om er zeker van te zijn dat ieder startblok de juiste noot als invoer heeft moeten we dat afdwingen door het startblok uit te breiden met een expliciete invoer.
  • Klik daarvoor op het meest rechtse driehoekje, het blok wordt langer! verhuis de noot naar het invoervak, en wis de standaardwaarde van 60, die tevoorschijn kwam bij verhuizen van noot Bewaar het aangepaste script en luister nog eens.
  • Om te zorgen dat alle noten zo snel als mogelijk na elkaar worden gestart (zodat het lijkt alsof ze tegelijkertijd starten) kunnen we het voor iedere - blok omringen met een warp. Warp zorgt ervoor dat alles erbinnen ononderbroken wordt uitgevoerd, er is dus geen vertraging van eventuele andere scripts. Pas je definitie aan:
Hoe zouden nu meerdere akkoorden achter elkaar klinken?
  • Probeer twee of meer akkoorden achter elkaar af te spelen. Wat hoor je? Waardoor denk je dat dat komt? Heb je een idee voor een oplossing?
Het tweede (en de erna volgende akkoorden) worden meteen afgespeeld, maar dat wil je niet.
  • Pas nog één keer het speel akkoord blok aan door een pauzeer blok toe te voegen:

Probeer meer

Als begin kun je project maken dat een liedje uit je jeugd afspeelt. Gebruik de lijst-van-lijsten datastructuur zoals hiervoor beschreven, en gebruik een herhaal structuur voor het afspelen. Dit voorbeeld script kan handig zijn
Om makkelijk meerdere liedjes te kunnen afspelen, waarbij je liedje beschrijft als hierboven, is het fijn om een eigen blok te maken
. Doe dat.
En kun je nu ook een variant maken die zowel noten als akkoorden kan afspelen, zodat de volgende lijst als invoer kan dienen
Hier is iedere noot een paar. Het tweede getal wijst naar de speelduur, het eerste naar een noot, of ... een lijstje van noten, een akkoord. Hiervoor heb je een blok gemaakt om akkoorden af te spelen en dat zou je kunnen gebruiken. Om te zien of je met een losse noot of een akkoord van doen hebt is dit blok handig
Maak een blok
waar de lijst invoer een liedje representeert en het vakje een toonverhoging, zodat je een liedje bijvoorbeeld meerdere keren steeds hoger kan afspelen
Als uitsmijter: ken je een liedje dat vaak als een canon wordt gespeeld? Kun je een script schrijven dat de canon in meerdere stemmen afspeelt? Hoe je meer dan een stem gelijktijdig laten klinkken? Herinner je
nog dat we gebruikten om een akkoord te spelen?
Pro tip: als de stemmen uit je canon uit sync raken, kun je dat voorkomen door Snap in turbomodus te zetten. In turbo mode maakt Snap gebruik van een veel preciezer tijdssysteem en dat is precies wat bij muziek belangrijk is. Er is zelfs een blok om met code de turbo erop te zetten:
En als je onverhoopt vast komt te zitten kun je altijd kijken bij het project van de meester https://snap.berkeley.edu/project?user=jens&project=Snap2-W1U4-Music

Testopgaven

1 Wat voor soort invoer hoort in het vakje na speel noot in
  • Een lettergreep die de internationaal erkende muzieknaam van de noot weergeeft zoals Do voor de noot C, Re voor D, Mi voor E
  • Je kunt verschillende soorten invoer gebruiken, letters zoals C, G, A, woorden zoals Do, Re Mi en getallen die staan voor een MIDI-noot zoals 65, 69, 72
  • Een hoofdletter eventueel gevolgd door een kruis “A#” voor een verhoogde toon of kleine letter b “Ab” voor een verlaagde toon.
  • Een geheel getal die in MIDI-notatie de toonhoogte weergeeft, bijvoorbeeld 69 voor A
2 Een tabel is in Snap een lijst van lijsten. Hoe kun je de volgende tabel in Snap maken?
3 Het volgende script speelt een korte melodie. We kunnen de gegevens in een tabel, een lijst van lijsten, zetten met het script dat ernaast wordt getoond. vervolgens kunnen we de melodie afspelen met één enkel speel blok in een herhaal-lus. Welk script doet dat?
4 Maak de volgende zin af: Programma's die meerdere acties gelijktijdig uitvoeren zoals het spelen van een akkoord voeren
  • processen parallel uit
  • uitdrukkingen voorwaardelijk uit
  • scripts in serie uit
  • opdrachten in privé modus uit
Last modified 7mo ago