Η μουσική συναντά την επιστήμη και την τεχνολογία

Δειγματοληψία από Δειγματικούς χώρους πιθανοτήτων

Σύντομη περιγραφή

Σε αυτό το μάθημα χρησιμοποιούμε το εργαλείο JAZZARI για να δημιουργήσουμε μουσική με ένα υποτυπώδες σύστημα τεχνητής νοημοσύνης που θα κατασκευάσουμε. Τα εργαλεία που θα χρησιμοποιήσουμε προέρχονται από τη θεωρία πιθανοτήτων, ενώ θα εξοικειωθούμε με τις έννοιες του δειγματικού χώρου και της δειγματοληψίας. 

Σκοπός μαθήματος

Η θεωρία πιθανοτήτων αποτελεί βάση πολλών σύγχρονων μεθόδων και εφαρμογών γύρω από την τεχνητή νοημοσύνη. Στόχος του μαθήματος είναι να δώσει μια πρώτη επαφή με τα μαθηματικά και στον προγραμματισμό που επιτρέπουν στοιχειώδη δημιουργία μουσικής, μέσα από την κατασκευή και αξιοποίηση δειγματικών χώρων. 

Μαθησιακά αποτελέσματα

  • Να δημιουργεί τυχαίους δειγματικούς χώρους και να μεταβάλλει τα χαρακτηριστικά τους. 
  • Να αξιοποιεί δειγματικούς χώρους σαν δειγματοληπτική μέθοδο τεχνητής νοημοσύνης για να δημιουργεί αυτόματα μουσική. 
  • Να δημιουργεί δειγματικούς χώρους από μουσικά δεδομένα και να τους αξιοποιεί για αυτόματη μουσική σύνθεση. 

Προαπαιτούμενα

  • Κατανόηση των διανυσμάτων σε javascript. 
  • Κατανόηση των εννοιών βρόχου, ελέγχου και της εξόδου από βρόχο με break. 
  • Κατανόηση των συναρτήσεων σε javascript. 

Εκφώνηση

Ανοίξτε τη διαδικτυακή εφαρμογή:

https://jackschaedler.github.io/jazzari/index.html

Δειγματικός χώρος για το όργανο “KEYS”: οι νότες που μπορεί να παίξει το όργανο μαζί με τις πιθανότητές τους. Οι νότες περιλαμβάνουν πληροφορία μόνο για το τονικό ύψος (pitch) ενώ ο χρόνο έναρξης (onset time) και η διάρκεια (duration) θεωρούνται σταθερά για όλες τις νότες. 

Eπιλέξτε σίγαση στο όργανο “BASS”, έπειτα επιλέξτε το όργανο “KEYS” και αντιγράψτε τον παρακάτω κώδικα για το τελευταίο όργανο (μεταφερθείτε στην εφαρμογή JAZZARI για τη συνέχεια του μαθήματος):

// Δειγματικός χώρος για τονικά ύψη στο όργανο “KEYS”: 
// Πιθανά ενδεχόμενα / νότες: 
var pitches = [12, 16, 19, 22, 26]; 
// Πιθανότητες για κάθε ενδεχόμενο: 
var probabilities = [0.4, 0.15, 0.3, 0.1, 0.05]; 
// Δημιουργούμε την αθροιστική κατανομή 
var cumulative = [0.4, 0.55, 0.85, 0.95, 1]; 
// Δημιουργούμε μια συνάρτηση δειγματοληψίας 
function sample_from(c){ 
  // ρίχνουμε ένα ζάρι 
  var r = Math.random(); 
  // αρχικοποιούμε την απόφαση της συνάρτησης με -1 
  var decision = -1; 
  // βλέπουμε ποιο στοιχείο της κατανομής είναι το πρώτο 
  // που είναι μικρότερο από το ζάρι 
  for (var i=0; i<c.length-1; i++){ 
    if ( r > c[i] && r <= c[i+1] ){ 
      decision = i; 
      break; 
    } 
  } 
  return decision; 
} 
  
// Θεωρούμε ότι οι διάρκειες και οι χρόνοι εκκίνησης 
// είναι ίδιοι για όλες τις νότες. 
var time_distance = 1/8; 
var current_time = 0; 
// Γεμίζουμε με νότες 
for (var i=0; i<32; i++){ 
  // ρίχνουμε ένα ζάρι και βλέπουμε που έπεσε  
  // χρησιμοποιώντας τη συνάρτηση που φτιάξαμε 
  // παραπάνω 
  var d = sample_from( cumulative ); 
  NOTE({ 
    row:pitches[d], 
    time:current_time, 
    length:time_distance, 
    vol: 0.5 + 0.5*Math.random() 
  }); 
  current_time += time_distance; 
} 

Ασκήσεις

  1. Δοκιμάστε να ακολουθήσετε μια παρόμοια στρατηγική για να φτιάξετε μουσική για το όργανο “BASS”.
  2. Δοκιμάστε να δημιουργήσετε μια παρόμοια στρατηγική για τον ρυθμό και τις εντάσεις στα όργανα “KEYS” και “BASS”.

Leave a comment

Your email address will not be published. Required fields are marked *