Compare commits
1 Commits
vivien-per
...
mara
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ec22d563e8 |
17
README.md
17
README.md
@@ -1 +1,16 @@
|
|||||||
git repo for Vivien Perrot
|
# git repo for art num
|
||||||
|
|
||||||
|
*the wiki will be updated with more information and usefull snipet. fell free to contribute*
|
||||||
|
|
||||||
|
test port ssh
|
||||||
|
|
||||||
|
## how to
|
||||||
|
1. clone this repo to you own computer
|
||||||
|
` git clone https://git.erg.school/P039/art_num_2024.git`
|
||||||
|
2. check before eatch courses for update
|
||||||
|
` git pull `
|
||||||
|
|
||||||
|
## content
|
||||||
|
test
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
1
arduino/README.md
Normal file
1
arduino/README.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
git repo for art num
|
||||||
1
bash/README.md
Normal file
1
bash/README.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
git repo for art num
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
|
|
||||||
# Un système UPIC pour un orchestre de gravures
|
|
||||||
|
|
||||||
C'est un projet prenant pour source de création des gravures faites avec la technique d'eau forte sur plaque de zinc. Il inclut la transcription visuelle dans le champ sonore fréquentiel dont le mouvement du dessin fixe va altérer le comportement sonore dans le temps.
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
import cv2
|
|
||||||
import math
|
|
||||||
|
|
||||||
ring = cv2.imread('../circular.png')
|
|
||||||
|
|
||||||
size = ring.shape[0]
|
|
||||||
outer_radius = size // 2
|
|
||||||
inner_radius = 0
|
|
||||||
|
|
||||||
unwrapped = cv2.warpPolar(
|
|
||||||
ring,
|
|
||||||
(size, int(size * math.pi)),
|
|
||||||
(outer_radius, outer_radius),
|
|
||||||
outer_radius,
|
|
||||||
flags = 0
|
|
||||||
)
|
|
||||||
|
|
||||||
unwrapped = cv2.rotate(unwrapped, cv2.ROTATE_90_COUNTERCLOCKWISE)
|
|
||||||
|
|
||||||
unwrapped = unwrapped[inner_radius:, :]
|
|
||||||
|
|
||||||
cv2.imshow("original", ring)
|
|
||||||
cv2.imshow("Unwrapped", unwrapped)
|
|
||||||
cv2.waitKey(0)
|
|
||||||
cv2.destroyAllWindows()
|
|
||||||
cv2.imwrite("output.png", unwrapped)
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 64 MiB |
@@ -1,101 +0,0 @@
|
|||||||
from tqdm import tqdm
|
|
||||||
from scipy.ndimage import uniform_filter1d
|
|
||||||
from scipy.io.wavfile import write
|
|
||||||
import math, cv2, sys, getopt, wave
|
|
||||||
import numpy as np
|
|
||||||
|
|
||||||
def unwrap_img(input_file):
|
|
||||||
ring_img = cv2.imread(input_file)
|
|
||||||
|
|
||||||
size = ring_img.shape[0]
|
|
||||||
outer_radius = size // 2
|
|
||||||
inner_radius = 0
|
|
||||||
|
|
||||||
unwrapped_img = cv2.warpPolar(
|
|
||||||
ring_img,
|
|
||||||
(size, int(size * math.pi)),
|
|
||||||
(outer_radius, outer_radius),
|
|
||||||
outer_radius,
|
|
||||||
flags=0
|
|
||||||
)
|
|
||||||
|
|
||||||
rotated_unwrapped = cv2.rotate(unwrapped_img, cv2.ROTATE_90_COUNTERCLOCKWISE)
|
|
||||||
cropped_unwrapped = rotated_unwrapped[inner_radius:, :]
|
|
||||||
|
|
||||||
inverted_unwrapped = cv2.bitwise_not(cropped_unwrapped)
|
|
||||||
|
|
||||||
return inverted_unwrapped
|
|
||||||
|
|
||||||
|
|
||||||
def image_to_audio(input_img, out_wav, duration_seconds, sample_rate, vertical_res, amp_threshold):
|
|
||||||
max_freq = 10000
|
|
||||||
min_freq = 50
|
|
||||||
|
|
||||||
duration_seconds = float(duration_seconds)
|
|
||||||
|
|
||||||
# Downsample image vertically to reduce number of frequencies
|
|
||||||
input_img = input_img[::vertical_res] # Use one row every 20 pixels
|
|
||||||
height, width, _ = input_img.shape
|
|
||||||
|
|
||||||
num_samples = int(sample_rate * duration_seconds)
|
|
||||||
freqs = np.logspace(np.log10(min_freq), np.log10(max_freq), height)[::-1]
|
|
||||||
|
|
||||||
brightness = np.mean(input_img / 255.0, axis=2)
|
|
||||||
amplitudes = np.where(brightness >= 0.1, brightness, 0)
|
|
||||||
|
|
||||||
samples = np.zeros(num_samples, dtype=np.float32)
|
|
||||||
chunk_size = 10000
|
|
||||||
|
|
||||||
for start in tqdm(range(0, num_samples, chunk_size)):
|
|
||||||
end = min(start + chunk_size, num_samples)
|
|
||||||
t = np.linspace(start / sample_rate, end / sample_rate, end - start)
|
|
||||||
|
|
||||||
pixel_xs = (t * width / duration_seconds).astype(int)
|
|
||||||
pixel_xs = np.clip(pixel_xs, 0, width - 1)
|
|
||||||
|
|
||||||
amp_per_sample = amplitudes[:, pixel_xs]
|
|
||||||
amp_per_sample[amp_per_sample < amp_threshold] = 0
|
|
||||||
amp_per_sample = uniform_filter1d(amp_per_sample, size=7, axis=1) # Smooth
|
|
||||||
|
|
||||||
phases = 2 * np.pi * freqs[:, None] * t[None, :]
|
|
||||||
active = np.count_nonzero(amp_per_sample, axis=0)
|
|
||||||
chunk = np.sum(amp_per_sample * np.sin(phases), axis=0)
|
|
||||||
|
|
||||||
# Normalize chunk by number of active oscillators to avoid "snow"
|
|
||||||
chunk = np.where(active > 0, chunk / active, 0)
|
|
||||||
samples[start:end] = chunk
|
|
||||||
|
|
||||||
# Final normalization
|
|
||||||
samples /= np.max(np.abs(samples) + 1e-8)
|
|
||||||
|
|
||||||
# Convert to int16 for wav
|
|
||||||
wav_samples = (samples * 32767).astype(np.int16)
|
|
||||||
write(out_wav, sample_rate, wav_samples)
|
|
||||||
print(f"Audio saved to {out_wav}")
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
input_file = ''
|
|
||||||
output_file = ''
|
|
||||||
duration = 10
|
|
||||||
|
|
||||||
try:
|
|
||||||
opts, args = getopt.getopt(sys.argv[1:], "hi:o:d:yRes:thresh:")
|
|
||||||
except getopt.GetoptError:
|
|
||||||
print('error: img_to_freq.py -i <input_picture> -o <output_sound> -d <audio_duration>')
|
|
||||||
|
|
||||||
for opt, arg in opts:
|
|
||||||
if opt == '-h':
|
|
||||||
print('error: img_to_freq.py -i <input_picture> -o <output_sound> -d <audio_duration>')
|
|
||||||
sys.exit(2)
|
|
||||||
elif opt == '-i':
|
|
||||||
input_file = arg
|
|
||||||
elif opt == '-o':
|
|
||||||
output_file = arg
|
|
||||||
elif opt == '-d':
|
|
||||||
duration = arg
|
|
||||||
|
|
||||||
unwrapped_img = unwrap_img(input_file)
|
|
||||||
cv2.imwrite('output.png', unwrapped_img)
|
|
||||||
|
|
||||||
image_to_audio(unwrapped_img, output_file, duration, 44100, 20, 0.1)
|
|
||||||
Binary file not shown.
Binary file not shown.
|
Before Width: | Height: | Size: 19 MiB |
1
python/README.md
Normal file
1
python/README.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
git repo for art num
|
||||||
1
references/README.md
Normal file
1
references/README.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
git repo for art num
|
||||||
1
upython/README.md
Normal file
1
upython/README.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
git repo for art num
|
||||||
Reference in New Issue
Block a user