Skip to main content

Featured Post

Your First Programming Language

What programming language you start with really all depends on where you want to go with programming/coding. The great thing about this field is that there are an absolute abundance of smaller fields that you can go into, all using programming in their own unique ways. For web applications, a good start would be with HTML and later moving your way through CSS, JavaScript, JQuery, PHP, SQL, and any of the JavaScript libraries. Ruby is also a popular choice, so I would recommend checking that out too. For more scientific fields or areas with more machine learning and A.I., Python is generally a great place to start as it is widely used in that field of study. C++ is also a very useful language to know for that, but it can be a little more challenging for beginners. For game and application design, languages such as C#, C, Swift, Kotlin, and Java are most often used for that.

Mozart's Musical Dice

Description
In 1787 the famous composer Wolfgang Amadeus Mozart devised a Musikalisches Würfelspiel (musical dice game) that lets you "compose without the least knowledge of music". Obviously, this is a very loose definition of "compose", but it does produce pieces of music that have probably never been written down or played before. We'll be playing his game today (with some simplifications so you don't need to know musical notation).

Today's challenge may seem a little harder than typical at first, but it's actually not bad once you get the idea. I've tried to make the instructions as clear and complete as possible, but please ask for help if you have any trouble understanding them.

The starting composition
Start by downloading the starting composition here. Each line in this file gives the note name, starting time, and duration for one note in the starting composition, e.g.:

D3 281.5 0.5
"D3" is the name of the note, which you don't need to understand for this game. The starting time and duration of the note are given in units of beats, where beat 0 is the start of the song. This line means to play note D3 for 0.5 beats, starting at beat 281.5, and ending at beat 282.

The starting composition is 528 beats long, and consists of 176 measures, each of which is 3 beats long. Measure 1 goes from beat 0 to beat 3, measure 2 goes from beat 3 to beat 6, etc., up to measure 176, which goes from beat 525 to 528.

Building your composition
The game consists of selecting 16 of the 176 measures from the starting composition, rearranging them to be measures 1 through 16 of a shorter, 48-beat composition, and outputting this shorter composition in the same format as the starting composition.

For instance, the first measure you select might be measure 3. Measure 3 goes from beat 6 to beat 9, which means it's all lines that start on or after beat 6, and before beat 9:

C3 6 2
E3 6 2
G5 6 1
C5 7 1
E5 8 1
You need to change the starting times of each note in this measure so that it's measure 1 in your new composition. In this case that means to subtract 6 from each of the starting times. The note names and the durations will stay the same. The measure will then look like this:

C3 0 2
E3 0 2
G5 0 1
C5 1 1
E5 2 1
The second measure you select from the starting composition might be measure 22, which is these notes:

C3 63 2
E5 63 1
C5 64 1
G4 65 1
You would then change the starting times of each note in measure 22 of the starting composition so that it's measure 2 in your new composition:

C3 3 2
E5 3 1
C5 4 1
G4 5 1
And so on. Once you've changed the starting times of each note in all 16 of your selected measures, just output all the notes in your new composition.

Measure selection
If you just randomly choose 16 measures from the starting composition, it won't sound very good, so you need to use Mozart's system for selecting the measures. For each of your 16 measures, there are 11 possible selections from the starting composition, and you choose each one by rolling two six-sided dice and taking their total (2 through 12), using this table:

96 32 69 40 148 104 152 119 98 3 54
22 6 95 17 74 157 60 84 142 87 130
141 128 158 113 163 27 171 114 42 165 10
41 63 13 85 45 167 53 50 156 61 103
105 146 153 161 80 154 99 140 75 135 28
122 46 55 2 97 68 133 86 129 47 37
11 134 110 159 36 118 21 169 62 147 106
30 81 24 100 107 91 127 94 123 33 5
70 117 66 90 25 138 16 120 65 102 35
121 39 136 176 143 71 155 88 77 4 20
26 126 15 7 64 150 57 48 19 31 108
9 56 132 34 125 29 175 166 82 164 92
112 174 73 67 76 101 43 51 137 144 12
49 18 58 160 136 162 168 115 38 59 124
109 116 145 52 1 23 89 72 149 173 44
14 83 79 170 93 151 172 111 8 78 131
For each of the 16 rows in this table, select one of the numbers from the row depending on the roll of two dice. If you roll 2, take the first number in the row, if you roll 3, take the second number, etc. For example, if your first roll is a 7, you would take the sixth number from the first row (104). Then if your second roll is a 6, you would take the fifth number from the second row (74). Continuing to all 16 rows, you might get this sequence:

104 74 163 85 146 129 169 91 138 77 48 29 137 160 89 131
These are, in order, the 16 measures that you take from the starting composition to make your composition. So for this example, measure 104 from the starting composition will become measure 1, measure 74 will become measure 2, and so on, with measure 131 from the starting composition becoming measure 16. Here is the result for this example.

Listening to your composition
I threw together a JavaScript page that converts the format used here into generated sounds. Try it out by pasting your output into the text box and hitting play.

If you're feeling extra ambitious, use a library in the language of your choice to convert your text file into a playable music file, such as MP3 or MIDI.

Solution
in Ruby

# Song.new(filename) creates a new song based on "Mozart's Dice"
class Song
  def initialize(song_name)
    @song_name = song_name
    @source = []
    @possibilities = []
    @measures = []
    @song = []
    read_file
    read_possibilities
    get_measures
    make_song
    realign_measures
    write_song
  end

  def read_file
    File.open("mozart-dice-starting.txt").each_line do |line|
      @source << line.split(/\s+/)
    end
  end

  def read_possibilities
    File.open("mozarts-system.txt").each_line do |line|
      temp = line.split(/\s+/).map(&:to_i)
      @possibilities << temp
    end
  end

  def get_measures
    dice = Dice.new
    @possibilities.each_index do |i|
      @measures << @possibilities[i][dice.roll + dice.roll - 2]
    end
  end

  def make_song
    @measures.each do |measure|
      lim = measure * 3
      temp = @source.select { |m| m[1].to_i >= (lim - 3) && m[1].to_i < lim }
      temp.each { |a| @song << a }
    end
  end

  def realign_measures
    j = 0.0
    temp = @song[0][1]
    @song.size.times do |i|
      if @song[i][1] != temp
        temp = @song[i][1]
        j += if @song[i][1] =~ /(\.5)/ || j.to_s =~ /(\.5)/
               0.5
             else
               1
             end
      end
      @song[i][1] = j.to_s
    end
  end

  def write_song
    File.open(@song_name + '.txt', 'a') do |file|
      @song.each do |line|
        file.puts(line.join(' '))
      end
    end
  end
end

# overkill dice object for creating random numbers
class Dice
  attr_reader :value

  def roll
    @value = 1 + rand(5)
  end
end

Song.new(ARGV[0])

Comments

Popular posts from this blog

Decipher A Seven Segment Display

Description Today's challenge will be to create a program to decipher a seven segment display, commonly seen on many older electronic devices. Input Description For this challenge, you will receive 3 lines of input, with each line being 27 characters long (representing 9 total numbers), with the digits spread across the 3 lines. Your job is to return the represented digits. You don't need to account for odd spacing or missing segments. Output Description Your program should print the numbers contained in the display. Challenge Inputs     _  _     _  _  _  _  _   | _| _||_||_ |_   ||_||_|   ||_  _|  | _||_|  ||_| _|     _  _  _  _  _  _  _  _ |_| _| _||_|| ||_ |_| _||_   | _| _||_||_| _||_||_  _|  _  _  _  _  _  _  _  _  _ |_  _||_ |_| _|  ||_ | ||_|  _||_ |_||_| _|  ||_||_||_|  _  _        _  _  _  _  _ |_||_ |_|  || ||_ |_ |_| _|  _| _|  |  ||_| _| _| _||_ Challenge Outputs 123456789 433805825 526837608 954105592 Solution in Go package mai

Continued Fraction

Description In mathematics, a continued fraction is an expression obtained through an iterative process of representing a number as the sum of its integer part and the reciprocal of another number, then writing this other number as the sum of its integer part and another reciprocal, and so on. A continued fraction is an expression of the form             1     x + ----------                1         y + -------                   1             z + ----                  ... and so forth, where x, y, z, and such are real numbers, rational numbers, or complex numbers. Using Gauss notation, this may be abbreviated as [x; y, z, ...] To convert a continued fraction to an ordinary fraction, we just simplify from the right side, which may be an improper fraction, one where the numerator is larger than the denominator. Continued fractions can be decomposed as well, which breaks it down from an improper fraction to its Gauss notation. For example: 16        1 -- = 0 + --- 45

Kolakoski Sequence

Description A Kolakoski sequence (A000002) is an infinite sequence of symbols {1, 2} that is its own run-length encoding. It alternates between "runs" of symbols. The sequence begins: 12211212212211211221211212211... The first three symbols of the sequence are 122, which are the output of the first two iterations. After this, on the i-th iteration read the value x[i] of the output (one-indexed). If i is odd, output x[i] copies of the number 1. If i is even, output x[i] copies of the number 2. There is an unproven conjecture that the density of 1s in the sequence is 1/2 (50%). In today's challenge we'll be searching for numerical evidence of this by tallying the ratio of 1s and 2s for some initial N symbols of the sequence. Input Description As input you will receive the number of outputs to generate and tally. Output Description As output, print the ratio of 1s to 2s in the first n symbols. Sample Input 10 100 1000 Sample Output 5:5 49:51 502:498

Advanced pacman

Description This challenge takes its roots from the world-famous game Pacman. To finish the game, pacman needs to gather all pacgum on the map. The goal of this chalenge is to have a time-limited pacman. Pacman must gather as much pacgum as possible in the given time. To simplify, we will say that 1 move (no diagonals) = 1 unit of time. Formal Inputs & Outputs Input description You will be given a number, the time pacman has to gather as much pacgum as possible, and a table, being the map pacman has to explore. Every square of this map can be one of those things : A number N between (1 and 9) of pacgums that pacman can gather in one unit of time. "X" squares cannot be gone through. "C" will be where pacman starts. "O" (the letter, not zero ) will be a warp to another "O". There can be only 2 "O" on one map; Output description Your program should output the maximum number of pacgums pacman can gather in the given t

Puzzle Me This

Description First they took our jerbs, now they're taking our puzzles! (with your help) Today we're gonna find a way to solve jigsaw puzzles using computers Input Description As I am no designer the input will be purely numerical, feel free to make some visual version of the jigsaw puzzles :) You will first be given the dimension as X, Y Afterwards you will be given list of puzzle pieces and what type their 4 sides connect to (given as up, right, down, left) Their side-connection is given as a number, They connect with their negated number this means that a 1 and -1 connects, 2 and -2 connects etc. 0 means that it doesnt connect with anything. Assume pieces are rotated in the correct direction. fx: 2, 2 0: 0,1,2,0 1: 0,0,2,-1 2: -2,0,0,2 3: -2,-2,0,0 Output Description Output is a 2D picture/matrix of the pieces in their correct position for the example this would be 0 1 3 2 Challenge Input Challenges are generated, so there is a slight chanc

Everyone's A Winner

Description Today's challenge comes from the website fivethirtyeight.com, which runs a weekly Riddler column. Today's dailyprogrammer challenge was the riddler on 2018-04-06. From Matt Gold, a chance, perhaps, to redeem your busted bracket: On Monday, Villanova won the NCAA men’s basketball national title. But I recently overheard some boisterous Butler fans calling themselves the “transitive national champions,” because Butler beat Villanova earlier in the season. Of course, other teams also beat Butler during the season and their fans could therefore make exactly the same claim. How many transitive national champions were there this season? Or, maybe more descriptively, how many teams weren’t transitive national champions? (All of this season’s college basketball results are here. To get you started, Villanova lost to Butler, St. John’s, Providence and Creighton this season, all of whom can claim a transitive title. But remember, teams beat those teams, too.) Outp

Star Battle solver

Background Star Battle is a grid-based logic puzzle. You are given a SxS square grid divided into S connected regions, and a number N. You must find the unique way to place N*S stars into the grid such that: Every row has exactly N stars. Every column has exactly N stars. Every region has exactly N stars. No two stars are horizontally, vertically, or diagonally adjacent. If you would like more information: Star Battle rules and info YouTube tutorial and written tutorial of solving Star Battle puzzles by hand There are many Star Battle puzzles available on Grandmaster Puzzles. Just be aware that some are variants that follow different rules. Challenge Write a program to solve a Star Battle puzzle in a reasonable amount of time. There's no strict time requirement, but you should run your program through to completion for at least one (N, S) = (2, 10) puzzle for it to count as a solution. Feel free to use whatever input/output format is most convenient for you. In the