• Re: C=64 vs Pipe Organ (1/2)

    From Stefan Ram@21:1/5 to All on Sat Feb 18 16:54:10 2023
    Ben Collver <bencollver@tilde.pink> quoted:
    "It struck me that, at least in theory, organ pipes should generate
    quite primitive sound waves. If so, how come a church organ doesn't
    sound like a chip tune, which is also built up from simple waveforms?
    Well, actually it will, if you remove the church. And if you connect a >Commodore 64 home computer to a loudspeaker in a large hall, it will
    sound like an organ."

    I have written a small Python program to illustrate this.
    But it only runs on the Microsoft® Windows platform!

    Start it, and it should begin to play after about one minute.
    Then try it again, this time with "reverb = False" where it
    now reads "reverb = True" near the start of the source code.

    # requires:
    # - Python 3.9
    # - winsound (i.e., Windows)

    # Created 2021-08/2021-09 # Stefan Ram
    # Cleaned up 2021-12/2022-01/2022-05 # Stefan Ram

    # You are hereby licensed to keep and execute this program but not
    # to redistribute it. - Stefan Ram 2023-02-18T17:42:50+01:00

    import io
    import math
    import wave
    import winsound
    import random
    import array
    import sys
    import time
    from math import sin

    anti_click = True # there are still some clicks!
    sine = False
    hull_curve = True
    intro = True
    reverb = True
    noise = False
    randomness_intensities = True
    instrument = 0

    if noise:
    strong_noise = lambda x:( random.random() - 0.5 )* x/2 + x
    weak_noise = lambda x:( random.random() - 0.5 )* x/5 + x
    else:
    strong_noise = lambda x: x
    weak_noise = lambda x: x

    def initialize_frame_buffer():
    estimated_duration_in_seconds = 140
    frame_buffer_size = estimated_duration_in_seconds * frames_per_second
    global frame_values
    frame_values =[ 0 ]* frame_buffer_size
    del frame_buffer_size
    global write_position
    write_position = 0

    def initialize_reverb_buffers():
    global reverb_buffer_size
    reverb_buffer_size = 10000
    global reverb_buffer
    reverb_buffer =[ 0.0 ]* reverb_buffer_size
    global primary_reverb_buffer_position
    primary_reverb_buffer_position = 0

    global size_of_the_second_reverb_buffer
    size_of_the_second_reverb_buffer =22768
    global second_reverb_buffer
    second_reverb_buffer =[ 0.0 ]*size_of_the_second_reverb_buffer
    global second_reverb_buffer_position
    second_reverb_buffer_position = 0

    def initialize():
    global frames_per_second
    frames_per_second = 48000

    print( "Program might need about 1 GB of main memory.\nPlease "+
    "be patient." )

    initialize_frame_buffer()
    initialize_reverb_buffers()
    record_signal_for_reverb( 0 )

    global number_of_tones_or_pauses_inserted
    number_of_tones_or_pauses_inserted = 0

    def record_signal_for_reverb( signal ):
    global reverb_buffer_is_initialized
    global primary_reverb_buffer_position
    global second_reverb_buffer_position
    reverb_buffer[ primary_reverb_buffer_position ]= signal
    primary_reverb_buffer_position += 1
    primary_reverb_buffer_position %= reverb_buffer_size
    second_reverb_buffer[ second_reverb_buffer_position ]= signal
    second_reverb_buffer_position += 1
    second_reverb_buffer_position %= size_of_the_second_reverb_buffer
    return signal

    def some_reverb():
    return reverb_buffer[ primary_reverb_buffer_position ]* 0.3 +\
    second_reverb_buffer[ second_reverb_buffer_position ]* 0.1

    def free_reverb_buffer_memory():
    global reverb_buffer
    reverb_buffer = None
    del reverb_buffer

    global second_reverb_buffer
    second_reverb_buffer = None
    del second_reverb_buffer

    def show_progress():
    global number_of_tones_or_pauses_inserted
    text = "Please stand by while I'm filling the buffer!"
    if number_of_tones_or_pauses_inserted % 20 == 0:
    cd = 545 + 69 - number_of_tones_or_pauses_inserted
    cdp = int( cd / 620 * 100 )
    print( "About "+ str( cdp )+" % to go. " + text )
    number_of_tones_or_pauses_inserted += 1

    def integral_duration_of( duration ):
    "convert from duration in milliseconds to duration in frames"
    return round( duration * frames_per_second / 1000 )

    def hull_curve_of( frame_number, integral_duration ):
    '''
    preconditions:
    frame_number <= integral_duration
    integral_duration > -1
    /`-.
    ADSR
    attack-decay-sustain-release curve
    attack: rise to maximum_intensity until end_of_attack,
    decay: then fall to 1 until end_of_decay,
    sustain: then, sustain the value of 1 until
    integral_duration - initial_duration,
    release: finally, fall to 0 until integral_duration
    '''
    initial_duration = 600
    maximum_intensity = 1.2
    end_of_attack = maximum_intensity * initial_duration
    end_of_decay = end_of_attack +( maximum_intensity - 1 )*\
    initial_duration
    if frame_number < end_of_attack: # A - attack from 0 to
    # maximum_intensity, reaching 1 at initial_duration
    hull_curve = frame_number / initial_duration
    elif frame_number < end_of_decay:
    # D - decay from maximum_intensity to 1
    width_of_decay = end_of_decay - end_of_attack
    goes_from_0_to_1 =( frame_number - end_of_attack )\
    /width_of_decay
    goes_from_maximum_intensity_to_0 = maximum_intensity *\
    ( end_of_decay - frame_number )/ width_of_decay
    hull_curve = goes_from_0_to_1 +\
    goes_from_maximum_intensity_to_0
    elif integral_duration - initial_duration < frame_number:
    # R release
    hull_curve =( integral_duration - frame_number )\
    / initial_duration
    else: # S - sustain at 1
    hull_curve = 1
    return hull_curve

    def accompanying_hull_curve_of\
    ( frame_number, frequency_multiplier,
    attack_duration, attack_duration_ ):
    '''
    /\
    AD
    attack-decay curve
    attack: rise to maximum_intensity until ...
    decay: then fall to 0 until ...
    '''
    if frame_number - frequency_multiplier < attack_duration_:
    if frame_number < attack_duration:
    # A - attack
    hull_curve_for_accompanying_sound = \
    frame_number / attack_duration
    else:
    # D - decay
    hull_curve_for_accompanying_sound = \
    1 -( frame_number - attack_duration )/attack_duration_
    else:
    hull_curve_for_accompanying_sound = 0
    return hull_curve_for_accompanying_sound

    def record_instrument_value( instrument_value ):
    global write_position
    frame_value = instrument_value
    if reverb:
    frame_value += some_reverb()
    record_signal_for_reverb( frame_value )
    frame_values[ write_position ]= round( 32767/3 * frame_value )
    write_position+=1

    class instrument0:
    halftone_step = 2**( 1/12 )
    base_duration = 4
    attack_duration = base_duration * 60
    release_duration = base_duration * 100
    frequency_factor = 5 * halftone_step
    base_duration_1 = 5
    attack_duration_1 = base_duration_1 * 100
    release_duration_1 = base_duration_1 * 240
    frequency_factor_1 =( 12 + 5 )* halftone_step
    frequency_multiplier = 0
    def instrument_of( self, frame_number ):
    current_angle = self.frequency_multiplier * frame_number

    hull_curve = \
    hull_curve_of( frame_number, self.integral_duration )

    if sine:
    if hull_curve:
    frame_value = hull_curve *( sin( current_angle ) )
    else:
    frame_value = sin( current_angle )
    else:
    if hull_curve:
    frame_value = \
    hull_curve *\
    ( sin( current_angle )+
    sin( 2 * current_angle )/3 +
    sin( 4 * current_angle )/6 +
    sin( 8 * current_angle )/12 )
    if intro:
    hull_curve_for_accompanying_sound = \
    accompanying_hull_curve_of\
    ( frame_number, self.frequency_multiplier,
    self.attack_duration, self.release_duration )
    if hull_curve_for_accompanying_sound:
    frame_value += \
    strong_noise\
    ( self.intensity_of_first_accompanying_sound *
    hull_curve_for_accompanying_sound *
    sin( self.frequency_factor * current_angle ))
    hull_curve_for_second_accompanying_sound = \
    accompanying_hull_curve_of\
    ( frame_number, self.frequency_multiplier,
    self.attack_duration_1, self.release_duration_1 )
    if hull_curve_for_second_accompanying_sound:
    frame_value += \
    strong_noise\
    ( self.intensity_of_second_accompanying_sound * \
    hull_curve_for_second_accompanying_sound * \
    sin( self.frequency_factor_1 * current_angle ))
    else:
    frame_value =\
    ( sin( current_angle )+
    sin( 2 * current_angle )/3 +
    sin( 4 * current_angle )/6 +
    sin( 8 * current_angle )/12 )
    return weak_noise( frame_value )

    class instrument1:
    base_duration = 4
    halftone_step = 2**( 1/12 )
    attack_duration = base_duration * 10
    release_duration = base_duration * 2400
    frequency_factor = 5 * halftone_step
    attack_duration_1 = base_duration * 100
    release_duration_1 = base_duration * 240
    attack_duration_2 = base_duration * 400
    release_duration_2 = base_duration * 4800
    halftone_step = 2**( 1/12 )
    def instrument_of( self, frame_number ):
    current_angle = self.frequency_multiplier * frame_number
    hull_curve = \
    accompanying_hull_curve_of\
    ( frame_number, self.frequency_multiplier,
    self.attack_duration, self.release_duration )
    hull_curve_1 = \
    accompanying_hull_curve_of\
    ( frame_number, self.frequency_multiplier,
    self.attack_duration_1, self.release_duration_1 )
    hull_curve_2 = \
    accompanying_hull_curve_of\
    ( frame_number, self.frequency_multiplier,\
    self.attack_duration_2, self.release_duration_2 )
    if hull_curve or hull_curve_1 or hull_curve_2:
    frame_value =\
    hull_curve *\
    ( sin( 1 * current_angle )+
    sin( 1.4 * current_angle )/3 +
    sin( 1.8 * current_angle )/6 +
    sin( 2.1 * current_angle )/12 )
    frame_value +=\
    0.5 * hull_curve_1 *\
    ( sin( 1 * current_angle )+
    sin( current_angle * self.halftone_step )/2+
    sin( current_angle * 2 )/3 )
    frame_value +=\
    0.1 * hull_curve_2 *\
    ( sin( 2 * current_angle )+
    sin( 2 * current_angle * self.halftone_step )/2+
    sin( 2 * current_angle * 2 )/3 )
    else:
    frame_value = 0
    return frame_value

    instrument =[ instrument0, instrument1 ][ instrument ]

    def append_note_to_frame_buffer( i, frequency, duration ):
    frequency *= 0.75
    show_progress()
    i.frequency_multiplier = 2 * math.pi * frequency / frames_per_second
    i.integral_duration = integral_duration_of( duration )
    if randomness_intensities:
    i.intensity_of_first_accompanying_sound = \
    0.05 *( 1 + random.random() )/ 6
    i.intensity_of_second_accompanying_sound = \
    0.05 *( 1 + random.random() )/ 7
    else:
    i.intensity_of_first_accompanying_sound = \
    0.05 *( 1 + .5 )/ 6
    i.intensity_of_second_accompanying_sound = \
    0.05 *( 1 + .5 )/ 7

    for frame_number in range( i.integral_duration ):
    instrument_value = i.instrument_of( frame_number )
    record_instrument_value( instrument_value )

    signum = 1 if instrument_value > 0 else -1
    while instrument_value != 0 and anti_click:
    # anti click - get near zero with the frame_value
    # before quitting this tone
    frame_number += 1
    instrument_value = i.instrument_of( frame_number )
    new_signum = 1 if instrument_value > 0 else -1
    if new_signum != signum: break
    record_instrument_value( instrument_value )

    def append_silence_to_frame_buffer( duration_in_seconds ):
    duration_in_milliseconds = duration_in_seconds * 1000
    show_progress()
    integral_duration = integral_duration_of( duration_in_milliseconds )
    for _ in range( integral_duration ):
    record_instrument_value( 0 )

    def clear_screen():
    print( "\n" * 200 )

    def play_the_recording():
    global frame_values
    clear_screen()
    free_reverb_buffer_memory()
    stream = io.BytesIO()
    writer = wave.Wave_write( stream )
    writer.setnchannels( 1 )
    writer.setsampwidth( 2 )
    writer.setframerate( frames_per_second )
    writer.writeframes( array.array( 'h', frame_values ).tobytes() )
    frame_values = None
    del frame_values
    writer.close()
    writer = None
    del writer
    winsound.PlaySound( stream.getbuffer(), winsound.SND_MEMORY )
    stream = None
    del stream

    def play_BWV_846():
    i = instrument()
    append_note_to_frame_buffer( i, 392, 191 )
    append_note_to_frame_buffer( i, 494, 198 )
    append_note_to_frame_buffer( i, 587, 180 )
    append_note_to_frame_buffer( i, 784, 179 )
    append_note_to_frame_buffer( i, 988, 186 )
    append_note_to_frame_buffer( i, 587, 185 )
    append_note_to_frame_buffer( i, 784, 184 )
    append_note_to_frame_buffer( i, 988, 177 )
    append_silence_to_frame_buffer( 0.001374 )
    append_note_to_frame_buffer( i, 392, 208 )
    append_note_to_frame_buffer( i, 494, 179 )
    append_note_to_frame_buffer( i, 587, 176 )
    append_note_to_frame_buffer( i, 784, 180 )
    append_note_to_frame_buffer( i, 988, 177 )
    append_note_to_frame_buffer( i, 587, 177 )
    append_note_to_frame_buffer( i, 784, 187 )
    append_note_to_frame_buffer( i, 988, 181 )
    append_silence_to_frame_buffer( 0.000381 )
    append_note_to_frame_buffer( i, 392, 176 )
    append_note_to_frame_buffer( i, 440, 193 )
    append_note_to_frame_buffer( i, 660, 182 )
    append_note_to_frame_buffer( i, 880, 183 )
    append_note_to_frame_buffer( i, 1047, 183 )
    append_note_to_frame_buffer( i, 660, 178 )
    append_note_to_frame_buffer( i, 880, 184 )
    append_note_to_frame_buffer( i, 1047, 181 )
    append_silence_to_frame_buffer( 0.001690 )
    append_note_to_frame_buffer( i, 392, 206 )
    append_note_to_frame_buffer( i, 440, 205 )
    append_note_to_frame_buffer( i, 660, 182 )
    append_note_to_frame_buffer( i, 880, 180 )
    append_note_to_frame_buffer( i, 1047, 187 )
    append_note_to_frame_buffer( i, 660, 185 )
    append_note_to_frame_buffer( i, 880, 188 )
    append_note_to_frame_buffer( i, 1047, 187 )
    append_silence_to_frame_buffer( 0.003452 )
    append_note_to_frame_buffer( i, 370, 200 )
    append_note_to_frame_buffer( i, 440, 200 )
    append_note_to_frame_buffer( i, 587, 179 )
    append_note_to_frame_buffer( i, 880, 186 )
    append_note_to_frame_buffer( i, 1047, 187 )
    append_note_to_frame_buffer( i, 587, 188 )
    append_note_to_frame_buffer( i, 880, 189 )
    append_note_to_frame_buffer( i, 1047, 184 )
    append_silence_to_frame_buffer( 0.003140 )
    append_note_to_frame_buffer( i, 370, 194 )
    append_note_to_frame_buffer( i, 440, 187 )
    append_note_to_frame_buffer( i, 587, 181 )
    append_note_to_frame_buffer( i, 880, 178 )
    append_note_to_frame_buffer( i, 1047, 185 )
    append_note_to_frame_buffer( i, 587, 178 )
    append_note_to_frame_buffer( i, 880, 177 )
    append_note_to_frame_buffer( i, 1047, 188 )
    append_silence_to_frame_buffer( 0.002649 )
    append_note_to_frame_buffer( i, 392, 209 )
    append_note_to_frame_buffer( i, 494, 206 )
    append_note_to_frame_buffer( i, 587, 186 )
    append_note_to_frame_buffer( i, 784, 183 )
    append_note_to_frame_buffer( i, 988, 180 )
    append_note_to_frame_buffer( i, 587, 186 )
    append_note_to_frame_buffer( i, 784, 183 )
    append_note_to_frame_buffer( i, 988, 183 )
    append_silence_to_frame_buffer( 0.010631 )
    append_note_to_frame_buffer( i, 392, 192 )
    append_note_to_frame_buffer( i, 494, 194 )
    append_note_to_frame_buffer( i, 587, 186 )
    append_note_to_frame_buffer( i, 784, 185 )
    append_note_to_frame_buffer( i, 988, 185 )
    append_note_to_frame_buffer( i, 587, 182 )
    append_note_to_frame_buffer( i, 784, 180 )
    append_note_to_frame_buffer( i, 988, 181 )
    append_silence_to_frame_buffer( 0.005442 )
    append_note_to_frame_buffer( i, 392, 212 )
    append_note_to_frame_buffer( i, 494, 208 )
    append_note_to_frame_buffer( i, 660, 182 )
    append_note_to_frame_buffer( i, 988, 180 )
    append_note_to_frame_buffer( i, 1320, 186 )
    append_note_to_frame_buffer( i, 660, 184 )
    append_note_to_frame_buffer( i, 988, 179 )
    append_note_to_frame_buffer( i, 1320, 187 )
    append_silence_to_frame_buffer( 0.007269 )
    append_note_to_frame_buffer( i, 392, 226 )
    append_note_to_frame_buffer( i, 494, 202 )
    append_note_to_frame_buffer( i, 660, 187 )
    append_note_to_frame_buffer( i, 988, 182 )
    append_note_to_frame_buffer( i, 1320, 184 )
    append_note_to_frame_buffer( i, 660, 179 )
    append_note_to_frame_buffer( i, 988, 190 )
    append_note_to_frame_buffer( i, 1320, 187 )
    append_silence_to_frame_buffer( 0.002452 )
    append_note_to_frame_buffer( i, 392, 229 )
    append_note_to_frame_buffer( i, 440, 190 )
    append_note_to_frame_buffer( i, 554, 181 )
    append_note_to_frame_buffer( i, 660, 189 )
    append_note_to_frame_buffer( i, 880, 185 )
    append_note_to_frame_buffer( i, 554, 181 )
    append_note_to_frame_buffer( i, 660, 185 )
    append_note_to_frame_buffer( i, 880, 188 )
    append_silence_to_frame_buffer( 0.007138 )
    append_note_to_frame_buffer( i, 392, 210 )
    append_note_to_frame_buffer( i, 440, 206 )
    append_note_to_frame_buffer( i, 554, 188 )
    append_note_to_frame_buffer( i, 660, 185 )
    append_note_to_frame_buffer( i, 880, 181 )
    append_note_to_frame_buffer( i, 554, 184 )
    append_note_to_frame_buffer( i, 660, 190 )
    append_note_to_frame_buffer( i, 880, 180 )
    append_silence_to_frame_buffer( 0.009927 )
    append_note_to_frame_buffer( i, 370, 208 )
    append_note_to_frame_buffer( i, 440, 204 )
    append_note_to_frame_buffer( i, 587, 191 )
    append_note_to_frame_buffer( i, 880, 186 )
    append_note_to_frame_buffer( i, 1175, 184 )
    append_note_to_frame_buffer( i, 587, 186 )
    append_note_to_frame_buffer( i, 880, 184 )
    append_note_to_frame_buffer( i, 1175, 190 )
    append_silence_to_frame_buffer( 0.006591 )
    append_note_to_frame_buffer( i, 370, 199 )
    append_note_to_frame_buffer( i, 440, 199 )
    append_note_to_frame_buffer( i, 587, 189 )
    append_note_to_frame_buffer( i, 880, 187 )
    append_note_to_frame_buffer( i, 1175, 183 )
    append_note_to_frame_buffer( i, 587, 190 )
    append_note_to_frame_buffer( i, 880, 190 )
    append_note_to_frame_buffer( i, 1175, 185 )
    append_silence_to_frame_buffer( 0.011220 )
    append_note_to_frame_buffer( i, 370, 193 )
    append_note_to_frame_buffer( i, 392, 206 )
    append_note_to_frame_buffer( i, 494, 181 )
    append_note_to_frame_buffer( i, 587, 187 )
    append_note_to_frame_buffer( i, 784, 183 )
    append_note_to_frame_buffer( i, 494, 191 )
    append_note_to_frame_buffer( i, 587, 188 )
    append_note_to_frame_buffer( i, 784, 189 )
    append_silence_to_frame_buffer( 0.004748 )
    append_note_to_frame_buffer( i, 370, 197 )
    append_note_to_frame_buffer( i, 392, 200 )
    append_note_to_frame_buffer( i, 494, 185 )
    append_note_to_frame_buffer( i, 587, 192 )
    append_note_to_frame_buffer( i, 784, 185 )
    append_note_to_frame_buffer( i, 494, 185 )
    append_note_to_frame_buffer( i, 587, 183 )
    append_note_to_frame_buffer( i, 784, 190 )
    append_silence_to_frame_buffer( 0.021366 )
    append_note_to_frame_buffer( i, 330, 219 )
    append_note_to_frame_buffer( i, 392, 196 )
    append_note_to_frame_buffer( i, 494, 183 )
    append_note_to_frame_buffer( i, 587, 182 )
    append_note_to_frame_buffer( i, 784, 182 )
    append_note_to_frame_buffer( i, 494, 191 )
    append_note_to_frame_buffer( i, 587, 192 )
    append_note_to_frame_buffer( i, 784, 184 )
    append_silence_to_frame_buffer( 0.003144 )
    append_note_to_frame_buffer( i, 330, 189 )
    append_note_to_frame_buffer( i, 392, 194 )
    append_note_to_frame_buffer( i, 494, 191 )
    append_note_to_frame_buffer( i, 587, 190 )
    append_note_to_frame_buffer( i, 784, 189 )
    append_note_to_frame_buffer( i, 494, 183 )
    append_note_to_frame_buffer( i, 587, 187 )
    append_note_to_frame_buffer( i, 784, 185 )
    append_silence_to_frame_buffer( 0.020051 )
    append_note_to_frame_buffer( i, 220, 207 )
    append_note_to_frame_buffer( i, 330, 199 )
    append_note_to_frame_buffer( i, 440, 189 )
    append_note_to_frame_buffer( i, 554, 190 )
    append_note_to_frame_buffer( i, 784, 184 )
    append_note_to_frame_buffer( i, 440, 189 )
    append_note_to_frame_buffer( i, 554, 194 )
    append_note_to_frame_buffer( i, 784, 191 )
    append_silence_to_frame_buffer( 0.028114 )
    append_note_to_frame_buffer( i, 220, 201 )
    append_note_to_frame_buffer( i, 330, 209 )
    append_note_to_frame_buffer( i, 440, 188 )
    append_note_to_frame_buffer( i, 554, 195 )
    append_note_to_frame_buffer( i, 784, 184 )
    append_note_to_frame_buffer( i, 440, 190 )
    append_note_to_frame_buffer( i, 554, 184 )
    append_note_to_frame_buffer( i, 784, 188 )
    append_silence_to_frame_buffer( 0.029809 )
    append_note_to_frame_buffer( i, 293, 227 )
    append_note_to_frame_buffer( i, 370, 192 )
    append_note_to_frame_buffer( i, 440, 192 )
    append_note_to_frame_buffer( i, 587, 188 )
    append_note_to_frame_buffer( i, 740, 186 )
    append_note_to_frame_buffer( i, 440, 191 )
    append_note_to_frame_buffer( i, 587, 191 )
    append_note_to_frame_buffer( i, 740, 189 )
    append_silence_to_frame_buffer( 0.015669 )
    append_note_to_frame_buffer( i, 293, 221 )
    append_note_to_frame_buffer( i, 370, 214 )
    append_note_to_frame_buffer( i, 440, 191 )
    append_note_to_frame_buffer( i, 587, 192 )
    append_note_to_frame_buffer( i, 740, 191 )
    append_note_to_frame_buffer( i, 440, 188 )
    append_note_to_frame_buffer( i, 587, 186 )
    append_note_to_frame_buffer( i, 740, 193 )
    append_silence_to_frame_buffer( 0.019541 )
    append_note_to_frame_buffer( i, 293, 207 )
    append_note_to_frame_buffer( i, 349, 201 )
    append_note_to_frame_buffer( i, 494, 193 )
    append_note_to_frame_buffer( i, 587, 191 )
    append_note_to_frame_buffer( i, 831, 188 )
    append_note_to_frame_buffer( i, 494, 190 )
    append_note_to_frame_buffer( i, 587, 185 )
    append_note_to_frame_buffer( i, 831, 193 )
    append_silence_to_frame_buffer( 0.022523 )
    append_note_to_frame_buffer( i, 293, 225 )
    append_note_to_frame_buffer( i, 349, 198 )
    append_note_to_frame_buffer( i, 494, 192 )
    append_note_to_frame_buffer( i, 587, 195 )
    append_note_to_frame_buffer( i, 831, 196 )
    append_note_to_frame_buffer( i, 494, 192 )
    append_note_to_frame_buffer( i, 587, 194 )
    append_note_to_frame_buffer( i, 831, 185 )
    append_silence_to_frame_buffer( 0.025643 )
    append_note_to_frame_buffer( i, 261, 212 )
    append_note_to_frame_buffer( i, 330, 199 )
    append_note_to_frame_buffer( i, 440, 187 )
    append_note_to_frame_buffer( i, 660, 186 )
    append_note_to_frame_buffer( i, 880, 196 )
    append_note_to_frame_buffer( i, 440, 195 )
    append_note_to_frame_buffer( i, 660, 194 )
    append_note_to_frame_buffer( i, 880, 187 )
    append_silence_to_frame_buffer( 0.013077 )
    append_note_to_frame_buffer( i, 261, 190 )
    append_note_to_frame_buffer( i, 330, 213 )
    append_note_to_frame_buffer( i, 440, 192 )
    append_note_to_frame_buffer( i, 660, 191 )
    append_note_to_frame_buffer( i, 880, 191 )
    append_note_to_frame_buffer( i, 440, 189 )
    append_note_to_frame_buffer( i, 660, 191 )
    append_note_to_frame_buffer( i, 880, 192 )
    append_silence_to_frame_buffer( 0.006350 )
    append_note_to_frame_buffer( i, 261, 225 )
    append_note_to_frame_buffer( i, 311, 209 )
    append_note_to_frame_buffer( i, 440, 197 )
    append_note_to_frame_buffer( i, 523, 196 )
    append_note_to_frame_buffer( i, 740, 195 )
    append_note_to_frame_buffer( i, 440, 190 )
    append_note_to_frame_buffer( i, 523, 197 )
    append_note_to_frame_buffer( i, 740, 188 )
    append_silence_to_frame_buffer( 0.002840 )
    append_note_to_frame_buffer( i, 261, 221 )
    append_note_to_frame_buffer( i, 311, 217 )
    append_note_to_frame_buffer( i, 440, 187 )
    append_note_to_frame_buffer( i, 523, 197 )
    append_note_to_frame_buffer( i, 740, 194 )
    append_note_to_frame_buffer( i, 440, 190 )
    append_note_to_frame_buffer( i, 523, 188 )
    append_note_to_frame_buffer( i, 740, 193 )
    append_silence_to_frame_buffer( 0.010174 )
    append_note_to_frame_buffer( i, 247, 234 )
    append_note_to_frame_buffer( i, 293, 209 )
    append_note_to_frame_buffer( i, 392, 188 )
    append_note_to_frame_buffer( i, 587, 193 )
    append_note_to_frame_buffer( i, 784, 191 )
    append_note_to_frame_buffer( i, 392, 193 )
    append_note_to_frame_buffer( i, 587, 197 )
    append_note_to_frame_buffer( i, 784, 193 )
    append_silence_to_frame_buffer( 0.017742 )
    append_note_to_frame_buffer( i, 247, 221 )
    append_note_to_frame_buffer( i, 293, 204 )
    append_note_to_frame_buffer( i, 392, 187 )
    append_note_to_frame_buffer( i, 587, 196 )
    append_note_to_frame_buffer( i, 784, 189 )
    append_note_to_frame_buffer( i, 392, 195 )
    append_note_to_frame_buffer( i, 587, 198 )
    append_note_to_frame_buffer( i, 784, 193 )
    append_silence_to_frame_buffer( 0.035872 )
    append_note_to_frame_buffer( i, 247, 212 )
    append_note_to_frame_buffer( i, 261, 210 )
    append_note_to_frame_buffer( i, 330, 192 )
    append_note_to_frame_buffer( i, 392, 199 )
    append_note_to_frame_buffer( i, 523, 195 )
    append_note_to_frame_buffer( i, 330, 190 )
    append_note_to_frame_buffer( i, 392, 192 )
    append_note_to_frame_buffer( i, 523, 190 )
    append_silence_to_frame_buffer( 0.036867 )
    append_note_to_frame_buffer( i, 247, 229 )
    append_note_to_frame_buffer( i, 261, 196 )
    append_note_to_frame_buffer( i, 330, 189 )
    append_note_to_frame_buffer( i, 392, 196 )
    append_note_to_frame_buffer( i, 523, 190 )
    append_note_to_frame_buffer( i, 330, 199 )
    append_note_to_frame_buffer( i, 392, 199 )
    append_note_to_frame_buffer( i, 523, 196 )
    append_silence_to_frame_buffer( 0.036948 )
    append_note_to_frame_buffer( i, 220, 199 )
    append_note_to_frame_buffer( i, 261, 207 )
    append_note_to_frame_buffer( i, 330, 196 )
    append_note_to_frame_buffer( i, 392, 191 )
    append_note_to_frame_buffer( i, 523, 190 )
    append_note_to_frame_buffer( i, 330, 191 )
    append_note_to_frame_buffer( i, 392, 196 )
    append_note_to_frame_buffer( i, 523, 193 )
    append_silence_to_frame_buffer( 0.016865 )
    append_note_to_frame_buffer( i, 220, 225 )
    append_note_to_frame_buffer( i, 261, 218 )
    append_note_to_frame_buffer( i, 330, 195 )
    append_note_to_frame_buffer( i, 392, 196 )
    append_note_to_frame_buffer( i, 523, 199 )
    append_note_to_frame_buffer( i, 330, 200 )
    append_note_to_frame_buffer( i, 392, 191 )
    append_note_to_frame_buffer( i, 523, 197 )
    append_silence_to_frame_buffer( 0.021891 )
    append_note_to_frame_buffer( i, 146, 199 )
    append_note_to_frame_buffer( i, 220, 201 )
    append_note_to_frame_buffer( i, 293, 195 )
    append_note_to_frame_buffer( i, 370, 196 )
    append_note_to_frame_buffer( i, 523, 193 )
    append_note_to_frame_buffer( i, 293, 196 )
    append_note_to_frame_buffer( i, 370, 192 )
    append_note_to_frame_buffer( i, 523, 194 )
    append_silence_to_frame_buffer( 0.006195 )
    append_note_to_frame_buffer( i, 146, 206 )
    append_note_to_frame_buffer( i, 220, 212 )
    append_note_to_frame_buffer( i, 293, 201 )
    append_note_to_frame_buffer( i, 370, 200 )
    append_note_to_frame_buffer( i, 523, 199 )
    append_note_to_frame_buffer( i, 293, 198 )
    append_note_to_frame_buffer( i, 370, 195 )
    append_note_to_frame_buffer( i, 523, 201 )
    append_silence_to_frame_buffer( 0.013161 )
    append_note_to_frame_buffer( i, 196, 212 )
    append_note_to_frame_buffer( i, 247, 206 )
    append_note_to_frame_buffer( i, 293, 202 )
    append_note_to_frame_buffer( i, 392, 191 )
    append_note_to_frame_buffer( i, 494, 192 )
    append_note_to_frame_buffer( i, 293, 197 )
    append_note_to_frame_buffer( i, 392, 196 )
    append_note_to_frame_buffer( i, 494, 192 )
    append_silence_to_frame_buffer( 0.015321 )
    append_note_to_frame_buffer( i, 196, 213 )
    append_note_to_frame_buffer( i, 247, 196 )
    append_note_to_frame_buffer( i, 293, 202 )
    append_note_to_frame_buffer( i, 392, 192 )
    append_note_to_frame_buffer( i, 494, 192 )
    append_note_to_frame_buffer( i, 293, 192 )
    append_note_to_frame_buffer( i, 392, 195 )
    append_note_to_frame_buffer( i, 494, 202 )
    append_silence_to_frame_buffer( 0.024235 )
    append_note_to_frame_buffer( i, 196, 242 )
    append_note_to_frame_buffer( i, 293, 214 )
    append_note_to_frame_buffer( i, 349, 201 )
    append_note_to_frame_buffer( i, 392, 200 )
    append_note_to_frame_buffer( i, 494, 196 )
    append_note_to_frame_buffer( i, 349, 195 )
    append_note_to_frame_buffer( i, 392, 192 )
    append_note_to_frame_buffer( i, 494, 198 )
    append_silence_to_frame_buffer( 0.059580 )
    append_note_to_frame_buffer( i, 196, 208 )
    append_note_to_frame_buffer( i, 293, 205 )
    append_note_to_frame_buffer( i, 349, 200 )
    append_note_to_frame_buffer( i, 392, 203 )
    append_note_to_frame_buffer( i, 494, 197 )
    append_note_to_frame_buffer( i, 349, 203 )
    append_note_to_frame_buffer( i, 392, 192 )
    append_note_to_frame_buffer( i, 494, 203 )
    append_silence_to_frame_buffer( 0.038499 )
    append_note_to_frame_buffer( i, 130, 229 )
    append_note_to_frame_buffer( i, 261, 199 )
    append_note_to_frame_buffer( i, 330, 197 )
    append_note_to_frame_buffer( i, 392, 192 )
    append_note_to_frame_buffer( i, 494, 197 )
    append_note_to_frame_buffer( i, 330, 193 )
    append_note_to_frame_buffer( i, 392, 200 )
    append_note_to_frame_buffer( i, 494, 203 )
    append_silence_to_frame_buffer( 0.004254 )
    append_note_to_frame_buffer( i, 130, 234 )
    append_note_to_frame_buffer( i, 261, 220 )
    append_note_to_frame_buffer( i, 330, 199 )
    append_note_to_frame_buffer( i, 392, 201 )
    append_note_to_frame_buffer( i, 494, 195 )
    append_note_to_frame_buffer( i, 330, 201 )
    append_note_to_frame_buffer( i, 392, 202 )
    append_note_to_frame_buffer( i, 494, 202 )
    append_silence_to_frame_buffer( 0.002088 )
    append_note_to_frame_buffer( i, 138, 234 )
    append_note_to_frame_buffer( i, 196, 204 )
    append_note_to_frame_buffer( i, 330, 200 )
    append_note_to_frame_buffer( i, 392, 205 )
    append_note_to_frame_buffer( i, 466, 194 )
    append_note_to_frame_buffer( i, 330, 197 )
    append_note_to_frame_buffer( i, 392, 195 )
    append_note_to_frame_buffer( i, 466, 205 )
    append_silence_to_frame_buffer( 0.042655 )

    [continued in next message]

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)