def different_sections():
    func_name = 'different_sections'
    print 'Running {}...'.format(func_name)

    marimba = Marimba()
    audio_duration_seconds = 120
    audio = Audio(audio_duration_seconds)

    sections = Sections(32, len(audio))

    scale_type = [0, 4, 7]
    root = 0
    for section in sections:
        section.root = root
        scale = [(pc + root) % 12 for pc in scale_type]
        section.scale = [p for p in range(60, 73) if p % 12 in scale]
        root = (root + 1) % 12

    max_start = len(audio) - 80000

    n_notes = audio_duration_seconds * 5
    for _ in range(n_notes):
        start = np.random.randint(0, max_start)

        scale = sections.get_by_sample_offset(start).scale

        midi_number = np.random.choice(scale)
        note = marimba.get_note(midi_number)
        audio.add(start, note)

    audio.write_wav(func_name)
    print 'Done running {}.'.format(func_name)
class Diss(object):
    def __init__(self):
        self.duration_seconds = 240
        self.setup()
        self.go()
        self.closeout()

    def setup(self):
        self.name = 'Diss'
        print 'Running {}...'.format(self.name)
        self.marimba = Marimba()
        self.audio = Audio(self.duration_seconds)
        self.len_audio = len(self.audio)

    def closeout(self):
        self.audio.write_wav(self.name)
        print 'Done running {}.'.format(self.name)

    def go(self):
        pitch_options = [p for p in range(64, 87) if p % 12 in [0, 2, 4, 7, 9]]
        melody = dissonant_counterpoint(pitch_options, multiplier=10, skip=20)
        beats = Sections(self.duration_seconds * 4, self.len_audio - 80000)
        for beat in beats:
            if beat.index % 4:
                pitch = melody.next()
                note = self.marimba.get_note(pitch)
                self.audio.add(beat.start, note)

        pitch_options = [p for p in range(48, 62) if p % 12 in [0, 2, 4, 7, 9]]
        melody = dissonant_counterpoint(pitch_options, multiplier=10, skip=20)
        beats = Sections(self.duration_seconds, self.len_audio - 80000)
        for beat in beats:
            pitch = melody.next()
            note = self.marimba.get_note(pitch)
            self.audio.add(beat.start, note)
def random_cents_fifths():
    total_duration_seconds = 120
    notes_per_second = 1.2

    marimba = Marimba()
    audio = Audio(total_duration_seconds)

    total_duration_samples = audio.sample_rate * total_duration_seconds

    midi_numbers = marimba.get_midi_numbers(cents=True)[:-4000]

    ticks = int(total_duration_seconds * notes_per_second)
    for _ in range(ticks):
        print _, 'of', ticks

        start = np.random.randint(audio.n_samples - 100000)
        midi_number = np.random.choice(midi_numbers)
        sample = marimba.get_note(midi_number)
        audio.add(start, sample)

        max_delay = .3 * audio.sample_rate
        end_minus_padding = audio.n_samples - (max_delay * 15)
        if start < end_minus_padding:
            delay = audio.sample_rate * np.random.normal(.12, .017)
            for _ in range(4):
                start += delay
                echo_start = int(start)
                midi_number += 7.02
                echo_sample = marimba.get_note(midi_number)
                audio.add(echo_start, echo_sample)

    audio.write_wav('random-uniform')
Ejemplo n.º 4
0
def make_music():
    sr = 44100
    denis_audio, _ = librosa.load('denis-curran-short.mp3', mono=True, sr=sr)
    cqt = np.abs(librosa.cqt(denis_audio, sr=sr)).T
    denis_pitches = np.argmax(cqt, 1) * (np.max(cqt, 1) > .7)

    audio = Audio(initial_audio=denis_audio)

    # audio._audio += denis_audio
    # audio.add(0, denis_audio)

    # audio = np.zeros([len(denis_audio), 2])
    # audio = (audio.T + denis_audio).T

    marimba = Marimba()

    previous_notes = np.ones(marimba.n_notes) * -100
    previous_note_i = -100
    chord = random_chord()

    hop_length = 512
    len_denis_pitches = len(denis_pitches)

    for i, p in enumerate(denis_pitches):
        print i, 'of', len_denis_pitches, p
        if p > 0 and i - previous_note_i > 3:

            if i - previous_note_i > 50:
                chord = random_chord()

            t = i * hop_length

            p = note_in_chord(chord, p)
            while p >= marimba.n_notes:
                p -= 12

            if np.random.random() > .5:
                while p > 0 and i - previous_notes[p] < 10:
                    p -= 12
                if p < 0:
                    continue
            else:
                while p < 60 and i - previous_notes[p] < 10:
                    p += 12
                if p >= 60:
                    continue

            note = marimba.get_note(p)
            length = min(audio.n_samples - t, len(note))

            pan = np.random.random()

            audio.add(t, note[:length], pan=pan)
            # audio[t:t + length, 0] += note[:length] * pan * .1
            # audio[t:t + length, 1] += note[:length] * (1 - pan) * .1

            previous_note_i = i
            previous_notes[p] = i

    audio.write_wav('denis-marimba')
def et_experiment(pitches_per_halfstep=3,
                  notes_per_second=2.5,
                  duration_seconds=30):
    print 'Running et_experiment...'
    marimba = Marimba()

    audio = Audio(duration_seconds)
    max_start = len(audio) - 50000

    min_note = 36.0
    max_note = 96.0
    n_halfsteps = max_note - min_note
    n_pitches = n_halfsteps * pitches_per_halfstep
    midi_notes = np.linspace(36, 96, n_pitches, endpoint=False)

    print midi_notes

    n_notes = int(duration_seconds * notes_per_second)
    for i in range(n_notes):
        print '\t', i, 'of', n_notes

        midi_note = np.random.choice(midi_notes)
        note = marimba.get_note(midi_note)
        start = np.random.randint(max_start)

        audio.add(start, note)

    audio.write_wav('et-experiment')
    print 'Done running et_experiment.'
def different_sections_multiple_2():
    func_name = 'different_sections_multiple_2'
    print 'Running {}...'.format(func_name)

    marimba = Marimba()
    audio_duration_seconds = 240
    audio = Audio(audio_duration_seconds)

    harmonies = Sections(32, len(audio))
    for i, harmony in enumerate(harmonies):
        if i % 2:
            harmony.harmony = [0, 4, 7]
        else:
            harmony.harmony = [5, 9, 0]

    n_density_sections = 121
    densities = Sections(n_density_sections, len(audio))
    density_values = np.linspace(4, 100, 121)
    for section, value in zip(densities, density_values):
        section.density = value

    n_register_sections = 96 - 65
    low = 58
    high = 65
    register_sections = Sections(n_register_sections, len(audio))
    for section in register_sections:
        section.low = low
        section.high = high
        section.register = range(low, high)
        low = max([36, low - 1])
        high = min([96, high + 1])

    max_start = len(audio) - 80000

    print 'max_start', max_start, 'densities[-1].start', densities[-1].start

    for density_section in densities:
        for i in range(int(density_section.density)):
            start = np.random.randint(
                density_section.start,
                min([density_section.next_start, max_start]))

            register_section = register_sections.get_by_sample_offset(start)
            harmony_section = harmonies.get_by_sample_offset(start)
            pitch_options = [
                p for p in register_section.register
                if p % 12 in harmony_section.harmony
            ]

            pitch = np.random.choice(pitch_options)

            note = marimba.get_note(pitch)

            audio.add(start, note)

    audio.write_wav(func_name)
    print 'Done running {}.'.format(func_name)
def sections():
    print 'Running sections...'
    marimba = Marimba()

    quarter_duration_in_seconds = 1.0

    beats_per_section = 2.0
    section_duration_seconds = beats_per_section * quarter_duration_in_seconds
    n_sections = 64

    audio = Audio(int(section_duration_seconds * n_sections) + 3)

    section_duration_samples = int(
        round(section_duration_seconds * audio.sample_rate))

    chords = []
    for _ in range(n_sections):
        root = np.random.choice(np.linspace(0, 12, 24, endpoint=False))
        chord_type = random.choice([
            [0, 2.5, 5, 7, 9.5],
            [0, 2.5, 7, 9.5],
            [0, 3.5, 7, 10.5],
            [0, 4.5, 7],
        ])
        chord = [(p + root) % 12 for p in chord_type]
        chords.append(chord)

    start = 0
    for section_number in range(n_sections):
        chord = chords[section_number]
        lowest = 50.0
        highest = 86.0
        pitches = [
            p for p in np.linspace(
                lowest, highest, (highest - lowest) * 100, endpoint=False)
            if p % 12 in chord
        ]

        end = start + section_duration_samples

        for _ in range(int(beats_per_section *
                           random.choice([1, 2, 4, 8, 16]))):
            note_start = np.random.randint(start, end - 5000)

            midi_note = np.random.choice(pitches)

            note = marimba.get_note(midi_note)
            audio.add(note_start, note)

        start += section_duration_samples

    audio.write_wav('sections')
    print 'Done running sections.'
def random_notes():
    """Chose a random note every 6250 samples"""
    marimba = Marimba()
    audio = Audio(30)
    len_audio = len(audio) - 50000

    tick = 0
    while tick < len_audio:
        note = marimba.get_random_note()
        audio.add(tick, note)
        tick += 6250

    audio.write_wav('samples-test')
def diaphonic_trio_piano_two_sections():
    func_name = 'dissonant_counterpoint_experiment'
    print 'Running {}...'.format(func_name)

    marimba = Marimba()
    audio_duration_seconds = 120
    audio = Audio(audio_duration_seconds)

    odd_harmonics_scale, harmonics = get_odd_harmonics_scale(root=0)
    odd_harmonics_scale_pitch_options = [
        round(p, 2)
        for p in np.linspace(36, 96, (96 - 36) * 100, endpoint=False)
        if round(p % 12, 2) in odd_harmonics_scale
    ]

    harmonics = [
        round((ratio_to_cents(h, 1, round_decimal_places=None) + 3600) / 100,
              2) for h in range(1, 25)
    ]

    max_start = len(audio) - 100000

    start_options = [
        int(s)
        for s in np.linspace(0, int(max_start / 2), audio_duration_seconds * 3)
    ]
    for _ in range(len(start_options) * 2):
        start = np.random.choice(start_options)
        midi_number = np.random.choice(odd_harmonics_scale_pitch_options)
        note = marimba.get_note(midi_number)
        audio.add(start,
                  note,
                  pan=np.random.random(),
                  amplify=np.random.choice(np.linspace(.3, 1.3)))

    start_options = [
        int(s)
        for s in np.linspace(int(max_start /
                                 2), max_start, audio_duration_seconds * 4)
    ]
    for _ in range(len(start_options) * 3):
        start = np.random.choice(start_options)
        midi_number = np.random.choice(harmonics)
        note = marimba.get_note(midi_number)
        audio.add(start,
                  note,
                  pan=np.random.random(),
                  amplify=np.random.choice(np.linspace(.3, 1.3)))

    audio.write_wav(func_name)
    print 'Done running {}.'.format(func_name)
Ejemplo n.º 10
0
class Utah2018(object):
    def __init__(self, version):
        self.version = version

        self.duration_seconds = 200
        self.setup()
        # self.planning()
        self.go()
        self.closeout()

    def setup(self):
        self.base_name = 'Utah2018'
        self.output_parent_dir = 'output/{}'.format(self.base_name)
        self.name = '{}-{}'.format(self.base_name, self.version)
        print '\nRunning {}...'.format(self.name)
        self.marimba = Marimba()
        self.audio = Audio(self.duration_seconds + 5)
        self.len_audio = len(self.audio) - (44100 * 5)

    def closeout(self):
        self.audio.write_wav(self.name,
                             output_parent_dir=self.output_parent_dir)
        print 'Done running {}.\n'.format(self.name)

    def go(self):
        self.meter = Meter(self.duration_seconds, bpm=80)

        # Make a random scale
        options = range(12)
        scale = []
        for _ in range(7):
            pc = np.random.choice(options)
            options.remove(pc)
            scale.append(pc)
        scale.sort()
        print scale

        pitch = np.random.randint(62, 76)

        for sixteenth in self.meter.layers_by_name['sixteenth']:
            if np.random.random() < .8:
                # Rest every 10 or so notes

                pitch_options = range(max([pitch - 5, 56]),
                                      min([pitch + 6, 88]))
                pitch_options.remove(pitch)
                pitch_options = [p for p in pitch_options if p % 12 in scale]
                pitch = np.random.choice(pitch_options)

                note = self.marimba.get_note(pitch)
                self.audio.add(sixteenth.start_samples, note)
def random_notes_2():
    """Choose 100 random notes and put them in random locations throughout the duration of the audio containing the original samples"""
    marimba = Marimba()
    audio = Audio(30)
    len_audio = len(audio) - 50000
    n_notes = 100
    for i in range(n_notes):
        print '\t', i, 'of', n_notes
        note = marimba.get_random_note()
        start = np.random.randint(len_audio)

        audio.add(start, note)

    audio.write_wav('samples-test')
Ejemplo n.º 12
0
def main():
    marimba = Marimba()
    audio_duration_seconds = 120
    audio = Audio(audio_duration_seconds)

    piano_harmonies = PianoHarmonies(audio)

    max_start = len(audio) - 80000

    n_notes = audio_duration_seconds * 3
    for _ in range(n_notes):
        start = np.random.randint(0, max_start)
        scale = piano_harmonies.get_at_sample_offset(start)
        midi_number = np.random.choice(scale)
        note = marimba.get_note(midi_number)
        audio.add(start, note)
def common_tone_chord_experiment(pitches_per_halfstep=3, duration_seconds=60):
    print 'Running common_tone_chord_experiment...'
    marimba = Marimba()

    audio = Audio(duration_seconds)
    max_start = len(audio) - 100000

    min_note = 36.0
    max_note = 96.0
    n_halfsteps = max_note - min_note
    n_pitches = n_halfsteps * pitches_per_halfstep
    midi_notes = list(np.linspace(36, 96, n_pitches, endpoint=False))

    chord = [np.random.choice(midi_notes) for _ in range(4)]
    chord.sort()

    width = (pitches_per_halfstep * 2) - 1
    tick = 0
    while tick < max_start:
        print chord

        n_notes_to_change = np.random.choice([1, 1, 2])
        notes_to_change = random.sample(chord, n_notes_to_change)
        for midi_note in notes_to_change:
            index_in_chord = chord.index(midi_note)

            index_in_midi_notes = midi_notes.index(midi_note)

            lowest = max(index_in_midi_notes - width, 0)
            highest = min(index_in_midi_notes + width, len(midi_notes) - 1)
            new_index_in_midi_notes = np.random.choice(range(lowest, highest))
            midi_note = midi_notes[new_index_in_midi_notes]
            chord[index_in_chord] = midi_note

        for midi_note in chord:
            note = marimba.get_note(midi_note)
            tick += int(audio.sample_rate * 0.08)
            audio.add(tick, note)

        tick += int(round((audio.sample_rate * 0.85)))

    audio.write_wav('common-tone-chords')
    print 'Done running common_tone_chord_experiment.'
def microtonal_experiment_1():
    print 'Running microtonal_experiment_1...'
    marimba = Marimba()

    audio = Audio(30)

    # the marimba recordings have a duration of 50000 samples.
    # Don't start a recording within 50000 samples of the end of the audio
    len_audio = len(audio) - 50000

    print len_audio

    n_notes = 100
    for i in range(n_notes):
        print '\t', i, 'of', n_notes
        note = marimba.get_random_note(cents=True)
        start = np.random.randint(len_audio)

        audio.add(start, note)

    audio.write_wav('samples-test')
    print 'Done running microtonal_experiment_1.'
def block_chord_experiment(pitches_per_halfstep=3, duration_seconds=60):
    print 'Running block_chord_experiment...'
    marimba = Marimba()

    audio = Audio(duration_seconds)
    max_start = len(audio) - 50000

    min_note = 36.0
    max_note = 96.0
    n_halfsteps = max_note - min_note
    n_pitches = n_halfsteps * pitches_per_halfstep
    midi_notes = np.linspace(36, 96, n_pitches, endpoint=False)

    tick = 0
    while tick < max_start:
        for _ in range(3):
            midi_note = np.random.choice(midi_notes)
            note = marimba.get_note(midi_note)
            audio.add(tick, note)
        tick += int(round((audio.sample_rate * 0.85)))

    audio.write_wav('block-chords')
    print 'Done running block_chord_experiment.'
def dissonant_counterpoint_experiment():
    func_name = 'dissonant_counterpoint_experiment'
    print 'Running {}...'.format(func_name)

    marimba = Marimba()

    n_beats = 120
    quarter_duration_in_seconds = .5
    audio_duration = int(n_beats * quarter_duration_in_seconds) + 3
    audio = Audio(audio_duration)
    beat_duration = int(quarter_duration_in_seconds * audio.sample_rate)

    dissonant_counterpoint_generator = dissonant_counterpoint(range(12),
                                                              skip=2)
    pitch_classes = [
        dissonant_counterpoint_generator.next() for _ in range(n_beats)
    ]

    start = 0
    for i, pc in enumerate(pitch_classes):

        if np.random.random() < .8:
            new_note_duration = np.random.choice(np.linspace(3000, 50000, 100))
            note = marimba.get_staccato_note(
                pc + 60, new_note_duration=new_note_duration)
        else:
            note = marimba.get_note(pc + 60)

        audio.add(start,
                  note,
                  amplify=np.random.choice(np.linspace(.2, 1.5, 10)),
                  pan=np.random.random())
        start += beat_duration

    audio.write_wav(func_name)
    print 'Done running {}.'.format(func_name)
class AnthonyDouglass(object):
    def __init__(self, add_microbeats=False):
        self.add_microbeats = add_microbeats
        self.fib = self.fibonacci()
        self.setup_rhythm()
        self.setup()
        self.go()
        self.closeout()

    def setup_rhythm(self):
        self.bpm = 90.0
        self.quarter_duration = 60.0 / self.bpm
        self.bar_duration = self.quarter_duration * 4

        self.n_repetitions_per_pattern = 4

        self.n_patterns = 12

        count_in_duration = self.quarter_duration * 8
        self.duration_seconds = count_in_duration + (self.bar_duration * 8 *
                                                     self.n_patterns)

    def setup(self):
        self.name = 'AnthonyDouglass'
        print '\nRunning {}...'.format(self.name)
        self.marimba = Marimba()
        self.end_padding_seconds = 5
        self.audio = Audio(self.duration_seconds + self.end_padding_seconds)
        self.len_audio = len(
            self.audio) - (self.audio.sample_rate * self.end_padding_seconds)

    def closeout(self):
        self.audio.write_wav(self.name)
        print 'Done running {}.\n'.format(self.name)

    def fibonacci(self):
        # Fibonacci numbers
        a = 1
        b = 2
        while True:
            yield a, b
            a, b = b, a + b

    def add_pattern(self, start, a, b):
        original_start = start
        pattern = [b, b, a]

        microbeats_in_pattern = sum(pattern)
        microbeat_duration = self.bar_duration / microbeats_in_pattern

        n_bars = 4
        rhythm = [d * microbeat_duration for d in pattern * n_bars]

        pitches = ([0, 4, 7] * 2) + ([5, 9, 12] * 2)
        for rhythm_index, duration in enumerate(rhythm):
            pitch = pitches[rhythm_index % len(pitches)]
            note = self.marimba.get_note(pitch + 60)
            self.audio.add(seconds_to_samples(start), note)
            start += duration
        next_start = start

        if self.add_microbeats:
            micro_start = original_start

            microbeats = [microbeat_duration] * microbeats_in_pattern * n_bars
            for duration in microbeats:
                note = self.marimba.get_note(48)
                self.audio.add(seconds_to_samples(micro_start),
                               note,
                               amplify=.15)
                micro_start += microbeat_duration

        return next_start

    def pulse(self):
        start = 0
        half_duration = self.quarter_duration * 2
        n_pulses = int(self.duration_seconds / half_duration)
        for _ in range(n_pulses):
            self.audio.add(seconds_to_samples(start),
                           self.marimba.get_note(84))
            start += half_duration

    def go(self):
        self.pulse()
        print 'count in'

        next_start = self.quarter_duration * 8
        for _ in range(self.n_patterns):
            print
            # Add base pattern
            print 3, 3, 2
            next_start = self.add_pattern(next_start, 2, 3)

            a, b = self.fib.next()
            print b, b, a
            next_start = self.add_pattern(next_start, a, b)
class MusicWithSections(object):
    def __init__(self):
        self.duration_seconds = 240
        self.setup()
        self.setup_harmony_sections()
        self.setup_density_sections()
        self.setup_register_sections()
        self.go()
        self.closeout()

    def setup(self):
        self.name = 'MusicWithSections'
        print 'Running {}...'.format(self.name)
        self.marimba = Marimba()
        self.audio = Audio(self.duration_seconds)
        self.len_audio = len(self.audio)

    def closeout(self):
        self.audio.write_wav(self.name)
        print 'Done running {}.'.format(self.name)

    def setup_harmony_sections(self):
        harmony_sections = [3, 1] * 16
        self.harmony_sections = Sections(harmony_sections, self.len_audio)
        for i, harmony in enumerate(self.harmony_sections):
            if i % 2:
                harmony.harmony = [0, 4, 7]
            else:
                harmony.harmony = [5, 9, 0]

    def setup_density_sections(self):
        n_density_sections = 121
        self.density_sections = Sections(n_density_sections, self.len_audio)
        density_values = np.linspace(4, 100, 121)
        for section, value in zip(self.density_sections, density_values):
            section.density = value

    def setup_register_sections(self):
        n_register_sections = 96 - 65
        low = 58
        high = 65
        self.register_sections = Sections(n_register_sections, self.len_audio)
        for section in self.register_sections:
            section.low = low
            section.high = high
            section.register = range(low, high)
            low = max([36, low - 1])
            high = min([96, high + 1])

    def go(self):
        max_start = len(self.audio) - 80000

        for density_section in self.density_sections:
            for i in range(int(density_section.density)):
                start = np.random.randint(
                    density_section.start,
                    min([density_section.next_start, max_start]))

                register_section = self.register_sections.get_by_sample_offset(
                    start)
                harmony_section = self.harmony_sections.get_by_sample_offset(
                    start)
                pitch_options = [
                    p for p in register_section.register
                    if p % 12 in harmony_section.harmony
                ]

                pitch = np.random.choice(pitch_options)

                note = self.marimba.get_note(pitch)

                self.audio.add(start, note)
def overlapping_sections():
    func_name = 'overlapping_sections'
    print 'Running {}...'.format(func_name)

    marimba = Marimba()

    quarter_duration_in_seconds = 1.0

    beats_per_harmony_section = 2.0
    beats_per_density_section = 1.7777
    n_beats = beats_per_harmony_section * beats_per_density_section * 32
    duration_in_seconds = int(n_beats * quarter_duration_in_seconds + 3)

    audio = Audio(duration_in_seconds)

    harmony_section_duration_samples = int(
        round((beats_per_harmony_section * quarter_duration_in_seconds) *
              audio.sample_rate))
    start = 0
    harmony_section_starts = []
    while start < len(audio):
        harmony_section_starts.append(start)
        start += harmony_section_duration_samples

    density_section_duration_samples = int(
        round((beats_per_harmony_section * quarter_duration_in_seconds) *
              audio.sample_rate))
    start = 0
    density_section_starts = []
    while start < len(audio):
        density_section_starts.append(start)
        start += density_section_duration_samples

    max_start = len(audio) - 500000

    chords = [[0, 4, 7], [0, 5, 9], [0, 4, 7], [0, 5, 9], [0, 4, 7], [0, 5, 9],
              [2, 5, 9, 0], [2, 5, 7, 10]]

    lowest = 59
    highest = 62

    density_section_starts = [
        s for s in density_section_starts if s < max_start
    ]
    len_density_section_starts = len(density_section_starts)
    densities = np.linspace(1, 70, len_density_section_starts)

    for density, section_start in zip(densities, density_section_starts):
        for _ in range(int(density)):
            start = np.random.randint(
                section_start,
                section_start + density_section_duration_samples)
            for tick, next_tick in zip(harmony_section_starts[:-1],
                                       harmony_section_starts[1:]):
                if tick <= start < next_tick:
                    break

            chord_index = harmony_section_starts.index(tick) % len(chords)
            chord_type = chords[chord_index]
            # pitch = random.choice([p for p in range(lowest, highest) if p % 12 in chord_type])
            pitch = random.choice([
                p for p in np.linspace(
                    lowest, highest, (highest - lowest) * 100, endpoint=False)
                if round(p % 12, 2) in chord_type
            ])
            note = marimba.get_note(pitch)

            audio.add(start, note)

        if random.random() < .3:
            lowest = max([36, lowest - 1])
        if random.random() < .6:
            highest = min([95, highest + 1])

    # Future TODO
    # - at one rate, increase density
    # - at another rate, increase register
    # - at another rate, move from staccatto to sustained
    # - at another rate, do something else
    # - etc

    audio.write_wav(func_name)
    print 'Done running {}.'.format(func_name)
def overlapping_sections_with_weird_modulation():
    func_name = 'overlapping_sections_with_weird_modulation'
    print 'Running {}...'.format(func_name)

    marimba = Marimba()

    quarter_duration_in_seconds = 1.0

    beats_per_harmony_section = 2.0
    beats_per_density_section = 1.7777
    n_beats = beats_per_harmony_section * beats_per_density_section * 32
    duration_in_seconds = int(n_beats * quarter_duration_in_seconds + 3)

    audio = Audio(duration_in_seconds)

    harmony_section_duration_samples = int(
        round((beats_per_harmony_section * quarter_duration_in_seconds) *
              audio.sample_rate))
    start = 0
    harmony_section_starts = []
    while start < len(audio):
        harmony_section_starts.append(start)
        start += harmony_section_duration_samples

    density_section_duration_samples = int(
        round((beats_per_harmony_section * quarter_duration_in_seconds) *
              audio.sample_rate))
    start = 0
    density_section_starts = []
    while start < len(audio):
        density_section_starts.append(start)
        start += density_section_duration_samples

    max_start = len(audio) - 500000

    chords = [[0, 4, 7], [0, 5, 9], [0, 4, 7], [0, 5, 9], [0, 4, 7], [0, 5, 9],
              [2, 5, 9, 0], [2, 5, 7, 10]]

    lowest = 59
    highest = 62

    density_section_starts = [
        s for s in density_section_starts if s < max_start
    ]
    len_density_section_starts = len(density_section_starts)
    densities = np.linspace(1, 70, len_density_section_starts)

    halfstep_steps = np.linspace(0, 1, len_density_section_starts, -10)
    halfstep_steps = list(halfstep_steps)
    halfstep_steps += [1.0] * 10

    i = 0
    for density, section_start in zip(densities, density_section_starts):

        coords = [
            (1, 1),
            (3, 1),
            (5, 1),
            (6, 1),
            (7, 1),
        ]
        for x, y in coords:
            chords[x][y] = round(4.0 + (1 - halfstep_steps[i]), 2)

        coords = [
            (0, 1),
            (2, 1),
            (4, 1),
        ]
        for x, y in coords:
            chords[x][y] = round(5.0 - (1 - halfstep_steps[i]), 2)

        i += 1

        for _ in range(int(density)):
            start = np.random.randint(
                section_start,
                section_start + density_section_duration_samples)
            for tick, next_tick in zip(harmony_section_starts[:-1],
                                       harmony_section_starts[1:]):
                if tick <= start < next_tick:
                    break

            chord_index = harmony_section_starts.index(tick) % len(chords)
            chord_type = chords[chord_index]
            pitch = random.choice([
                p for p in np.linspace(
                    lowest, highest, (highest - lowest) * 100, endpoint=False)
                if round(p % 12, 2) in chord_type
            ])
            note = marimba.get_note(pitch)

            audio.add(start, note)

        if random.random() < .3:
            lowest = max([36, lowest - 1])
        if random.random() < .6:
            highest = min([95, highest + 1])

    audio.write_wav(func_name)
    print 'Done running {}.'.format(func_name)
class Polyrhythm20_21(object):
    def __init__(self):
        self.setup_rhythm()
        self.setup()
        self.go()
        self.closeout()

    def setup_rhythm(self):
        self.bpm = 120.0
        self.quarter_duration = 60.0 / self.bpm
        self.eighth_duration = self.quarter_duration / 2.0
        self.triplet_duration = self.quarter_duration / 3.0
        self.sixteenth_duration = self.quarter_duration / 4.0

        self.n_repetitions = 4

        self.rhythm1 = [
            self.quarter_duration, self.quarter_duration,
            self.quarter_duration + self.eighth_duration
        ] * 20 * self.n_repetitions
        self.rhythm2 = [
            self.quarter_duration, self.quarter_duration,
            self.quarter_duration + self.triplet_duration
        ] * 21 * self.n_repetitions

        self.rhythms = [self.rhythm1, self.rhythm2]

        self.duration_seconds = sum(self.rhythm1)

        n_quarters = int(round(self.duration_seconds / self.quarter_duration))
        self.pulse = [self.quarter_duration] * n_quarters

    def setup(self):
        self.name = 'Polyrhythm20_21'
        print '\nRunning {}...'.format(self.name)
        self.marimba = Marimba()
        self.end_padding_seconds = 5
        self.audio = Audio(self.duration_seconds + self.end_padding_seconds)
        self.len_audio = len(
            self.audio) - (self.audio.sample_rate * self.end_padding_seconds)

    def closeout(self):
        self.audio.write_wav(self.name)
        print 'Done running {}.\n'.format(self.name)

    def go(self):
        for i, rhythm in enumerate(self.rhythms):
            start = 0
            for duration in rhythm:
                if i == 0:
                    pitch = 65
                else:
                    pitch = 68

                note = self.marimba.get_note(pitch)

                print start

                self.audio.add(seconds_to_samples(start), note, pan=i)

                start += duration

        start = 0
        for i, duration in enumerate(self.pulse):
            amplify = .7
            if i % 2:
                amplify = .1
            self.audio.add(seconds_to_samples(start),
                           self.marimba.get_note(49),
                           amplify=amplify)
            start += duration