For this week's Creative Code challenge by @sableRalph : Finished an Unfinished Piece, I decided to go back to my Rubberband Relics Piece, Where I sonified the " Incomplete Relics" in SonicPi from Code written in Python.
Traditional Poem for these Submissions
Incomplete
Doesn't mean it is over
For it could be as deep
as it can be on top and hover
Finishing the unfinished relics
Can make their eyes stop their blinks
And leave the brain the ability to think
It now has to render
With a quicker time than using Blender
making sure the vibes are tender
as these transactions can be sent back to sender
or the lender
Since the theme is "Unfinished", the Sound of "Incomplete Relics" has a layered component to represent how the translation may be incomplete and attempts to bring fullness to it
Normal soundscape
Reverse soundscape
50% slow down on soundscape
50% slow down of reverse soundscape
IllestPreacha · IncompleteRelics
Words used in the Python Random Generator
List of Possible Instructional Words
'''
List of instructions in the Rubberband TExt to for generative colorscape building for the relics
Green
Yellow
Red
Black
Purple
Orange
Brown
Neutral
Up
Down
Left
Right
Pin
PinConsistent
PinSwitch
Diagonal
PinnerChoice
Short
Long
Medium
Interior
Exterior
Double
Single
Triple
IF no color in line, then follow instructions and choose your own color scheme
if not alot of instructions, be flexible with pin and band execution
read line and flow as such
'''
In the Python Code, there is a random word generator that is embedded in a timer function. After a word is generated, it is sent to SonicPi to be sonified
#external code borrowed for timer: -https://www.geeksforgeeks.org/how-to-create-a-countdown-timer-using-python/
#Import random function , alongside osc functions
import random as rd
from pythonosc import osc_message_builder
from pythonosc import udp_client
# import the time module
import time
with open("RubberBand.txt", "r") as adj: #open and read the text file
IWT = adj.read() #give the file a variable name
IWTUsed = list(map(str,IWT.split())) #individuals words
# define the countdown func.
def countdown(t):
while t:
mins, secs = divmod(t, 60)
timer = '{:02d}:{:02d}'.format(mins, secs)
print(timer, end="\r")
time.sleep(1)
#Random Word Generator being sent to SonicPi
if t % 1 == 0:
sender = udp_client.SimpleUDPClient('127.0.0.1', 4560)
sender.send_message('/pattern1', [rd.choice(IWTUsed), 100, 8, 45])
sender.send_message('/pattern2', [rd.choice(IWTUsed), 100,rd.randint(5,12) , 45])
sender.send_message('/pattern3', [rd.choice(IWTUsed), 100, 8, rd.randint(40,60)])
t -= 1
# input time in seconds
t = input("Enter the time in seconds: ")
# function call
countdown(int(t))
In the code below, we categorized the list of words(seen above) into four arrays and then make sure, we account for each array combination to get sound.
Colors = ['Green','Yellow','Red','Black','Purple','Orange','Brown','Neutral']
Direction = ['Up','Down','Left','Right','Diagonal']
Placement = ['Short','Long','Medium','Interior','Exterior','Double','Single','Triple']
Pins = ['Pin','PinConsistent','PinSwitch','PinnerChoice','Interior','Exterior']
#setting the conditionals rules of what is recieved from the Python Code
live_loop :phase1 do
use_real_time
a, b, c, d = sync "/osc*/pattern1"
with_fx :flanger, mix: rrand(0.1,0.9) do
if Placement.include? a or Direction.include? a
sample :drum_cowbell , rate: 0.5, decay: dice(5) if spread(d,b).tick
end
if Pins.include? a or Colors.include? a
sample :drum_bass_soft , decay: dice(5) if spread(d,b).tick
end
end
end
live_loop :phase2 do
use_real_time
a, b, c, d = sync "/osc*/pattern2"
if Placement.include? a or Colors.include? a
sample :elec_blip , sustain: dice(4) if spread(c,d).tick
end
if Pins.include? a or Direction.include? a
sample :elec_bong, sustain: dice(4) if spread(c,d).tick
end
end
live_loop :phase3 do
use_real_time
a, b, c, d = sync "/osc*/pattern3"
if Colors.include? a or Pins.include? a
with_fx :echo, mix: 0.6, decay: 4 do
sample :tabla_ghe2, sustain: dice(4) if spread(c,d).tick
end
end
if Direction.include? a or Placement.include? a
with_fx :krush, mix: rrand(0.3,0.6) do
sample :tabla_ghe2 , sustain: dice(4), attack: dice(3) if spread(c,d).tick
end
end
end