Again the sounds are very technical and abstract. I'll leave it like that for the moment. I'm still learning about what I can do. You can see the spectrum of the signal as it appears in Audacity:
It is easy to see that the spectrum now has the shape of the X- and Y- components of the shapes.
Next time I'll try to map the shape to the frequency domain while using the original waveform and not a pure sine signal. To do this I'll have to resample the waveform. This is a bit tricky to program but should give a more interesting signal.
In the meantime I've found a lot of interesting articles about shape sonification. In the future I'll try to do things with the curvature of the shape. And I haven't done anything with the spectral components yet.
from Nsound import *
import math
import math
def convert_chaincode_to_x(c,x):
if c == 1 or c == 0 or c == 7:
x = x + 1
return (x)
elif ( c == 2 or c == 6):
x = x
return (x)
else:
x = x - 1
return (x)
if c == 1 or c == 0 or c == 7:
x = x + 1
return (x)
elif ( c == 2 or c == 6):
x = x
return (x)
else:
x = x - 1
return (x)
def convert_chaincode_to_y(c,y):
if c == 1 or c == 2 or c == 3:
y = y + 1
return(y)
elif c == 4 or c == 0:
y = y
return(y)
else:
y = y - 1
return(y)
if c == 1 or c == 2 or c == 3:
y = y + 1
return(y)
elif c == 4 or c == 0:
y = y
return(y)
else:
y = y - 1
return(y)
def sine_duration_frequency(duration, frequency):
g = Generator(44100.0)
length = math.ceil(float(duration) * float(frequency))/float(frequency)
return g.drawSine(length, frequency)
g = Generator(44100.0)
length = math.ceil(float(duration) * float(frequency))/float(frequency)
return g.drawSine(length, frequency)
def convert_xy_frequency(xy, minxy, maxxy, minf, maxf):
r = float(maxf - minf)/float(maxxy - minxy)
f = (xy - minxy)*r + minf
return (f)
r = float(maxf - minf)/float(maxxy - minxy)
f = (xy - minxy)*r + minf
return (f)
# ==============================
debug1 = False
debug2 = False
debug2a = False
debug3 = True
debug2 = False
debug2a = False
debug3 = True
# read a chaincode .chc file that has been generated by SHAPE
infile = open("C:\\Users\\user\\Documents\\shape\\shape\\tiny_test.chc")
instr = infile.read()
infile.close()
if debug1:
print instr
infile = open("C:\\Users\\user\\Documents\\shape\\shape\\tiny_test.chc")
instr = infile.read()
infile.close()
if debug1:
print instr
# parse the input file - split it into words
inwords = instr.split(' ')
if debug1: print inwords
inwords = instr.split(' ')
if debug1: print inwords
# delete anything except the chain code
i = 0
for str in inwords:
if str.find('0E+0') > -1 :
break
i = i + 1
inwords = inwords[i+2:len(inwords)-1]
if debug1:
print inwords
i = 0
for str in inwords:
if str.find('0E+0') > -1 :
break
i = i + 1
inwords = inwords[i+2:len(inwords)-1]
if debug1:
print inwords
# fill the x and y buffer with the chaincode values
b_x_chaincode = Buffer()
b_y_chaincode = Buffer()
b_x_chaincode = Buffer()
b_y_chaincode = Buffer()
x = 0
y = 0
for str in inwords:
c = int(str)
x = convert_chaincode_to_x(c,x)
b_x_chaincode << x
y = convert_chaincode_to_y(c,y)
b_y_chaincode << y
y = 0
for str in inwords:
c = int(str)
x = convert_chaincode_to_x(c,x)
b_x_chaincode << x
y = convert_chaincode_to_y(c,y)
b_y_chaincode << y
if debug2a:
print c
print x
if debug2:
b_x_chaincode.plot("x value from chaincode")
Plotter.show()
b_y_chaincode.plot("y value from chaincode")
Plotter.show()
b_x_chaincode.plot("x value from chaincode")
Plotter.show()
b_y_chaincode.plot("y value from chaincode")
Plotter.show()
b_x_chaincode = b_x_chaincode - b_x_chaincode.getMean()
b_y_chaincode = b_y_chaincode - b_y_chaincode.getMean()
b_y_chaincode = b_y_chaincode - b_y_chaincode.getMean()
# generate a frequency modulated x and y signal
temp = Buffer()
b_x_long = Buffer()
b_y_long = Buffer()
temp = Buffer()
b_x_long = Buffer()
b_y_long = Buffer()
soundpixel_length = 0.02
min_f = 40.0
max_f = 5000.0
min_f = 40.0
max_f = 5000.0
min_x = b_x_chaincode.getMin()
max_x = b_x_chaincode.getMax()
max_x = b_x_chaincode.getMax()
if debug3:
i=0
i=0
frequency = convert_xy_frequency(x, min_x, max_x, min_f, max_f)
b_x_long << sine_duration_frequency(soundpixel_length, frequency)
if debug3:
i = i+1
p = int(len(b_x_chaincode)/4)
if i%p == 0:
b = Buffer()
b = sine_duration_frequency(soundpixel_length, frequency)
b.plot(frequency)
Plotter.show()
i = i+1
p = int(len(b_x_chaincode)/4)
if i%p == 0:
b = Buffer()
b = sine_duration_frequency(soundpixel_length, frequency)
b.plot(frequency)
Plotter.show()
b_x_long.normalize()
min_y = b_y_chaincode.getMin()
max_y = b_y_chaincode.getMax()
for y in b_y_chaincode:
frequency = convert_xy_frequency(y, min_y, max_y, min_f, max_f)
b_y_long << sine_duration_frequency(soundpixel_length, frequency)
b_y_long.normalize()
max_y = b_y_chaincode.getMax()
for y in b_y_chaincode:
frequency = convert_xy_frequency(y, min_y, max_y, min_f, max_f)
b_y_long << sine_duration_frequency(soundpixel_length, frequency)
b_y_long.normalize()
# code the x and y signal into the left and right channel of an audio stream
# write the audio stream into a .wav file
a = AudioStream(44100.0, 2)
a[0] = b_x_long
a[1] = b_y_long
a.writeWavefile("C:\\Users\\user\\Documents\\shape\\shape\\tiny_test xy_freq_chaincode.wav")
# write the audio stream into a .wav file
a = AudioStream(44100.0, 2)
a[0] = b_x_long
a[1] = b_y_long
a.writeWavefile("C:\\Users\\user\\Documents\\shape\\shape\\tiny_test xy_freq_chaincode.wav")
No comments:
Post a Comment