|
import gradio as gr |
|
import requests |
|
import json |
|
from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline |
|
import torch |
|
import random |
|
|
|
|
|
MODEL_NAME = "microsoft/DialoGPT-small" |
|
|
|
|
|
try: |
|
code_generator = pipeline( |
|
"text-generation", |
|
model=MODEL_NAME, |
|
tokenizer=MODEL_NAME, |
|
torch_dtype=torch.float16, |
|
device_map="auto" if torch.cuda.is_available() else None, |
|
trust_remote_code=True |
|
) |
|
except Exception as e: |
|
print(f"Error loading model: {e}") |
|
|
|
code_generator = pipeline( |
|
"text-generation", |
|
model=MODEL_NAME, |
|
tokenizer=MODEL_NAME, |
|
device_map=None |
|
) |
|
|
|
|
|
WORKING_PATTERNS = { |
|
"techno": [ |
|
"""stack( |
|
s("bd*4").gain(0.9), |
|
s("~ hh ~ hh").gain(0.6), |
|
n("0 ~ 3 ~").s("sawtooth").octave(2).lpf(1200).gain(0.8), |
|
s("~ ~ rim ~").slow(2).gain(0.5) |
|
).scale("a:minor")""", |
|
|
|
"""stack( |
|
s("bd bd ~ bd, ~ rim ~ rim").bank("RolandTR909").gain(0.9), |
|
s("[hh ch]*4").degradeBy(0.1).gain(0.5), |
|
n("[0 3 5 7]*2").s("square").octave(2).cutoff(sine.range(400,1600).slow(8)).gain(0.7), |
|
n("7 9 7 4").s("triangle").octave(4).delay(0.25).room(0.4).gain(0.5) |
|
).scale("d:minor")""", |
|
|
|
"""stack( |
|
s("bd*4, [~ rim]*2, hh*8").bank("RolandTR909").speed(0.95).gain(0.8), |
|
n("0 0 3 3").s("sawtooth").octave(2).lpf(2000).lpq(8).gain(0.8), |
|
n("[7 9]*4").s("square").octave(4).room(0.5).cutoff(1800).gain(0.4), |
|
s("~ ~ ~ clap").slow(2).gain(0.6).room(0.3) |
|
).scale("g:minor")""", |
|
|
|
"""stack( |
|
s("bd*4").sometimes(fast(2)).gain(0.9), |
|
s("hh*8").degradeBy(0.2).gain(0.4), |
|
n("[0 3 [5 0] 7]*2").s("sawtooth").octave(2).lpf(sine.range(600,2400).slow(4)).gain(0.8), |
|
n("0 7 4 2").s("triangle").octave(5).delay(0.125).room(0.6).gain(0.5) |
|
).scale("e:minor")""" |
|
], |
|
|
|
"house": [ |
|
"""stack( |
|
s("bd ~ ~ ~ bd ~ ~ ~").gain(0.8), |
|
s("~ hh ~ hh").gain(0.5), |
|
n("0 2 4 7").s("sine").octave(3).room(0.6).gain(0.7), |
|
s("~ ~ ~ clap").gain(0.6) |
|
).scale("c:major")""", |
|
|
|
"""stack( |
|
s("bd ~ [~ bd] ~").sometimes(fast(2)).gain(0.8), |
|
s("[~ ch ~ hh]*2").pan(sine.slow(4)).gain(0.4), |
|
n("[0 4 7]*2").s("sawtooth").octave(2).lpf(1500).gain(0.8), |
|
n("0 7 4 2").s("triangle").octave(4).delay(0.125).room(0.5).gain(0.5) |
|
).scale("f:major")""", |
|
|
|
"""stack( |
|
s("bd ~ ~ ~ bd ~ ~ ~").gain(0.8), |
|
n("[0 2] [4 7] [2 4] [7 0]").s("sine").octave(2).lpf(2000).gain(0.7), |
|
s("hh*8").degradeBy(0.3).pan(cosine.slow(6)).gain(0.4), |
|
s("~ ~ clap ~").room(0.4).gain(0.6) |
|
).scale("g:major")""", |
|
|
|
"""stack( |
|
s("bd ~ [bd ~] [~ bd] ~").gain(0.8), |
|
s("~ hh ~ [hh ch]").gain(0.5), |
|
n("0 4 7 9").s("sawtooth").octave(2).sometimes(add(note(12))).lpf(1800).gain(0.7), |
|
n("[2 4]*4").s("triangle").octave(4).delay(0.25).gain(0.4) |
|
).scale("d:major")""" |
|
], |
|
|
|
"ambient": [ |
|
"""stack( |
|
s("~ ~ ~ rim").slow(4).gain(0.3).room(0.9), |
|
n("[0 2 4]/3").s("sine").octave(3).slow(8).room(0.9).lpf(800).gain(0.6), |
|
n("[7 9 11]/5").s("triangle").octave(4).slow(12).delay(0.5).room(0.8).gain(0.4), |
|
n("[0 4]/7").s("sawtooth").octave(2).slow(16).lpf(400).gain(0.3) |
|
).scale("d:minor")""", |
|
|
|
"""stack( |
|
n("0 2 4 7").s("sine").octave(2).slow(16).room(0.9).lpf(600).gain(0.5), |
|
n("[4 7 9]/7").s("triangle").octave(4).slow(12).delay(0.75).room(0.9).gain(0.4), |
|
s("~ ~ rim ~").slow(8).gain(0.2).room(0.9), |
|
n("[11 14]/11").s("sine").octave(5).slow(20).gain(0.3) |
|
).scale("a:minor")""", |
|
|
|
"""n("[0 4 7 11]/4").s("sine").octave(3).slow(12).room(0.9).lpf(perlin.range(400,1200).slow(8)).gain(0.7).scale("e:minor")""", |
|
|
|
"""stack( |
|
n("[0 2]/5").s("sine").octave(2).slow(16).room(0.9).gain(0.4), |
|
n("[4 7]/7").s("triangle").octave(4).slow(20).delay(1).room(0.9).gain(0.3), |
|
s("~ ~ ~ [rim vinyl]").slow(8).gain(0.2).room(0.9) |
|
).scale("f:major")""" |
|
], |
|
|
|
"breakbeat": [ |
|
"""stack( |
|
s("[bd sn]*2").sometimes(rev).speed(0.9).gain(0.9), |
|
s("[hh ch]*4").degradeBy(0.3).gain(0.6), |
|
n("0 4 7 0").s("square").octave(2).cutoff(1000).gain(0.8), |
|
s("~ [perc:0 perc:1] ~").gain(0.4) |
|
).scale("a:minor")""", |
|
|
|
"""stack( |
|
s("bd [sn sn] bd sn").speed(0.85).gain(0.9), |
|
n("[0 ~ 7] [3 5]").s("sawtooth").octave(2).lpf(1500).gain(0.7), |
|
s("hh*8").sometimes(fast(2)).degradeBy(0.2).gain(0.5), |
|
s("~ ~ [perc:2 perc:3] ~").gain(0.5) |
|
).scale("d:minor")""", |
|
|
|
"""stack( |
|
s("[bd ~ sn ~]*2").sometimes(rev).gain(0.9), |
|
s("[hh ch oh]*3").degradeBy(0.4).pan(perlin.slow(2)).gain(0.5), |
|
n("[0 7 4 2]*2").s("square").octave(2).cutoff(rand.range(600,1800)).gain(0.7) |
|
).scale("g:minor")""" |
|
], |
|
|
|
"experimental": [ |
|
"""stack( |
|
s("[bd rim]*3").degradeBy(0.5).speed(perlin.range(0.8,1.2)).gain(0.8), |
|
n("[0 3 7]/5").s("square").octave(2).cutoff(perlin.range(400,2000)).gain(0.7), |
|
s("~ [hh hh] ~").pan(sine.slow(3)).degradeBy(0.6).gain(0.5), |
|
s("[noise:0]/16").gain(0.2).hpf(2000) |
|
).scale("g:minor")""", |
|
|
|
"""stack( |
|
s("bd ~ [perc:0 perc:1]").speed(rand.range(0.7,1.3)).gain(0.8), |
|
n("0 [2 5] 7").s("sawtooth").octave(2).sometimes(add(note(12))).cutoff(sine.range(300,1500)).gain(0.7), |
|
s("[ch oh]*5").degradeBy(0.7).pan(cosine.slow(2)).gain(0.4), |
|
n("[9 11]/9").s("triangle").octave(5).delay(0.75).gain(0.3) |
|
).scale("f#:minor")""", |
|
|
|
"""stack( |
|
s("[bd ~ rim]*2").rev().degradeBy(0.4).gain(0.8), |
|
n("[0 4 7]/7").s("square").octave(2).cutoff(perlin.range(200,2000)).sometimes(fast(4)).gain(0.6), |
|
s("~ [vinyl:0 vinyl:1]/8").gain(0.3).hpf(1500) |
|
).scale("bb:minor")""" |
|
], |
|
|
|
"hiphop": [ |
|
"""stack( |
|
s("bd ~ sn ~").gain(0.9), |
|
s("hh ~ hh hh ~ hh ~ hh").gain(0.5), |
|
n("0 0 3 5").s("sawtooth").octave(1).lpf(1000).gain(0.8), |
|
s("~ ~ ~ [clap clap]").slow(2).gain(0.6) |
|
).scale("c:minor")""", |
|
|
|
"""stack( |
|
s("bd ~ [bd sn] ~").gain(0.9), |
|
s("[hh ch]*4").degradeBy(0.1).gain(0.5), |
|
n("[0 3 5]*2").s("sine").octave(1).lpf(800).gain(0.9), |
|
n("0 3 5 7").s("square").octave(3).lpf(1200).gain(0.4), |
|
s("~ ~ clap ~").room(0.3).gain(0.7), |
|
s("~ [perc:0]/4 ~ [perc:1]/4").gain(0.4) |
|
).scale("a:minor")""", |
|
|
|
"""stack( |
|
s("bd ~ sn [~ bd]").sometimes(fast(2)).gain(0.9), |
|
s("hh*8").degradeBy(0.2).gain(0.4), |
|
n("0 ~ 3 ~").s("sawtooth").octave(1).lpf(1200).gain(0.9), |
|
n("[0 3 5 7]*2").s("triangle").octave(3).gain(0.5), |
|
s("~ ~ [clap rim] ~").gain(0.6).room(0.4) |
|
).scale("d:minor")""", |
|
|
|
"""stack( |
|
s("[bd bd] ~ sn ~").gain(0.9), |
|
s("~ hh ~ [hh ch hh]").gain(0.5), |
|
n("[0 3] [5 0] [7 3] [5 0]").s("sine").octave(1).lpf(1500).gain(0.8), |
|
n("0 7 4 2").s("square").octave(3).delay(0.125).gain(0.4), |
|
s("~ ~ clap ~").delay(0.125).gain(0.7) |
|
).scale("g:minor")""" |
|
] |
|
} |
|
|
|
def get_random_working_pattern(genre, complexity="moderate"): |
|
"""Get a random working pattern from our curated collection""" |
|
patterns = WORKING_PATTERNS.get(genre, WORKING_PATTERNS["techno"]) |
|
|
|
if complexity == "simple": |
|
|
|
simple_patterns = { |
|
"techno": 's("bd*4, hh*8").gain(0.8)', |
|
"house": 's("bd ~ ~ ~ bd ~ ~ ~, ~ hh ~ hh").gain(0.7)', |
|
"ambient": 'n("[0 2 4]/3").s("sine").octave(3).slow(8).room(0.9).gain(0.6).scale("d:minor")', |
|
"breakbeat": 's("[bd sn]*2, hh*8").speed(0.9).gain(0.8)', |
|
"experimental": 's("bd ~ [perc:0 perc:1]").degradeBy(0.4).speed(rand.range(0.8,1.2)).gain(0.7)', |
|
"hiphop": 's("bd ~ sn ~, hh ~ hh hh ~ hh ~ hh").gain(0.8).add(n("0 0 3 5").s("sine").octave(1).gain(0.8))' |
|
} |
|
return simple_patterns.get(genre, simple_patterns["techno"]) |
|
|
|
return random.choice(patterns) |
|
|
|
def create_variations(base_pattern, genre): |
|
"""Create variations of a working base pattern""" |
|
variations = [] |
|
|
|
|
|
variations.append(base_pattern) |
|
|
|
|
|
if "stack(" in base_pattern: |
|
variations.append(base_pattern.replace(").scale(", ").sometimes(fast(2)).scale(")) |
|
variations.append(base_pattern.replace(").scale(", ").slow(2).scale(")) |
|
|
|
|
|
if ".gain(0.8)" in base_pattern: |
|
variations.append(base_pattern.replace(".gain(0.8)", ".gain(0.8).room(0.4)")) |
|
|
|
|
|
scales = ["a:minor", "d:minor", "g:minor", "c:major", "f:major", "e:minor", "bb:minor", "f#:minor"] |
|
for scale in scales: |
|
if scale not in base_pattern: |
|
new_pattern = base_pattern |
|
for old_scale in scales: |
|
if old_scale in base_pattern: |
|
new_pattern = base_pattern.replace(old_scale, scale) |
|
break |
|
if new_pattern != base_pattern: |
|
variations.append(new_pattern) |
|
break |
|
|
|
return random.choice(variations) |
|
|
|
def generate_working_strudel_code(prompt, genre="techno", complexity="moderate"): |
|
"""Generate guaranteed working Strudel code - ALWAYS RANDOM""" |
|
|
|
|
|
base_pattern = get_random_working_pattern(genre, complexity) |
|
|
|
|
|
base_pattern = create_variations(base_pattern, genre) |
|
|
|
|
|
if any(word in prompt.lower() for word in ["fast", "speed", "quick", "rapid", "energetic"]): |
|
if "sometimes(fast(2))" not in base_pattern: |
|
base_pattern = base_pattern.replace(".gain(", ".sometimes(fast(2)).gain(") |
|
|
|
if any(word in prompt.lower() for word in ["slow", "chill", "ambient", "relaxed", "calm"]): |
|
if ".slow(" not in base_pattern: |
|
base_pattern = base_pattern.replace(".gain(", ".slow(2).gain(") |
|
|
|
if any(word in prompt.lower() for word in ["reverb", "space", "room", "hall", "spacious"]): |
|
if ".room(" not in base_pattern: |
|
base_pattern = base_pattern.replace(".gain(", ".room(0.7).gain(") |
|
|
|
if any(word in prompt.lower() for word in ["delay", "echo", "repeat", "dub"]): |
|
if ".delay(" not in base_pattern: |
|
base_pattern = base_pattern.replace(".gain(", ".delay(0.25).gain(") |
|
|
|
if any(word in prompt.lower() for word in ["filter", "sweep", "cutoff", "lpf", "filtered"]): |
|
if ".lpf(" not in base_pattern and ".cutoff(" not in base_pattern: |
|
base_pattern = base_pattern.replace(".gain(", ".lpf(sine.range(400,1600).slow(8)).gain(") |
|
|
|
if any(word in prompt.lower() for word in ["glitch", "degraded", "broken", "corrupt", "dirty"]): |
|
if ".degradeBy(" not in base_pattern: |
|
base_pattern = base_pattern.replace(".gain(", ".degradeBy(0.4).gain(") |
|
|
|
if any(word in prompt.lower() for word in ["pan", "stereo", "wide", "spatial"]): |
|
if ".pan(" not in base_pattern: |
|
base_pattern = base_pattern.replace(".gain(", ".pan(sine.slow(4)).gain(") |
|
|
|
|
|
import time |
|
timestamp = int(time.time() * 1000) % 10000 |
|
|
|
|
|
comment_line = f"// {prompt[:50]}{'...' if len(prompt) > 50 else ''} #{timestamp}" |
|
|
|
return f"{comment_line}\n{base_pattern}" |
|
|
|
def create_visual_code(style="reactive", genre="techno"): |
|
"""Create working visual code with genre-appropriate randomization""" |
|
|
|
|
|
genre_visuals = { |
|
"techno": [ |
|
"""osc(12, 0.1, 0.8) |
|
.color(2, 0.5, 1.5) |
|
.kaleid(4) |
|
.rotate(0, 0.1) |
|
.out()""", |
|
"""shape(4, 0.5, 0.01) |
|
.repeat(4, 3) |
|
.color(1.8, 0.8, 2) |
|
.kaleid(6) |
|
.out()""", |
|
"""osc(16, 0.05, 1) |
|
.pixelate(24, 18) |
|
.color(2, 1, 0.8) |
|
.contrast(1.8) |
|
.out()""" |
|
], |
|
"house": [ |
|
"""osc(6, 0.1, 1.2) |
|
.color(1.5, 1.8, 0.8) |
|
.modulate(noise(2), 0.2) |
|
.kaleid(8) |
|
.out()""", |
|
"""shape(6, 0.4, 0.02) |
|
.repeat(3, 2) |
|
.rotate(0, 0.05) |
|
.color(1.2, 1.5, 1.8) |
|
.out()""", |
|
"""noise(2, 0.1) |
|
.color(1.8, 1.2, 1.5) |
|
.modulate(osc(3, 0.08), 0.3) |
|
.kaleid(4) |
|
.out()""" |
|
], |
|
"ambient": [ |
|
"""noise(3, 0.05) |
|
.color(0.8, 1.5, 1.8) |
|
.modulate(osc(1, 0.1), 0.4) |
|
.contrast(1.2) |
|
.out()""", |
|
"""osc(4, 0.02, 1.5) |
|
.color(1.2, 1.8, 1.5) |
|
.modulate(noise(1), 0.5) |
|
.kaleid(3) |
|
.out()""", |
|
"""shape(8, 0.2, 0.005) |
|
.repeat(2, 2) |
|
.color(0.8, 1.8, 1.2) |
|
.rotate(0, 0.02) |
|
.out()""" |
|
], |
|
"breakbeat": [ |
|
"""osc(20, 0.2, 0.5) |
|
.pixelate(16, 12) |
|
.color(2, 1.5, 0.5) |
|
.contrast(2) |
|
.out()""", |
|
"""shape(3, 0.8, 0.05) |
|
.repeat(6, 4) |
|
.color(1.8, 2, 1) |
|
.kaleid(5) |
|
.out()""", |
|
"""noise(4, 0.3) |
|
.color(2, 1.8, 0.8) |
|
.modulate(osc(8, 0.1), 0.6) |
|
.pixelate(20, 15) |
|
.out()""" |
|
], |
|
"experimental": [ |
|
"""noise(5, 0.4) |
|
.color(2, 0.8, 1.8) |
|
.modulate(osc(15, 0.3), 0.8) |
|
.pixelate(8, 6) |
|
.contrast(2.5) |
|
.out()""", |
|
"""osc(25, 0.4, 0.2) |
|
.color(1.8, 2, 0.5) |
|
.kaleid(12) |
|
.rotate(0, 0.2) |
|
.out()""", |
|
"""shape(7, 0.9, 0.1) |
|
.repeat(8, 6) |
|
.color(2, 1, 2) |
|
.modulate(noise(6), 0.7) |
|
.out()""" |
|
], |
|
"hiphop": [ |
|
"""osc(8, 0.1, 1) |
|
.color(1.8, 1.5, 0.8) |
|
.pixelate(32, 24) |
|
.contrast(1.6) |
|
.out()""", |
|
"""shape(4, 0.6, 0.02) |
|
.repeat(4, 3) |
|
.color(2, 1.8, 1) |
|
.kaleid(4) |
|
.out()""", |
|
"""noise(3, 0.2) |
|
.color(1.5, 1.8, 0.8) |
|
.modulate(osc(4, 0.1), 0.3) |
|
.pixelate(28, 20) |
|
.out()""" |
|
] |
|
} |
|
|
|
|
|
visuals = genre_visuals.get(genre, genre_visuals["techno"]) |
|
return random.choice(visuals) |
|
|
|
def create_complete_strudel_code(generated_code, include_visuals=True, genre="techno"): |
|
"""Create complete, working Strudel code with random visuals""" |
|
|
|
visual_code = "" |
|
if include_visuals: |
|
visual_code = f"""// Hydra visuals |
|
await initHydra({{feedStrudel:5}}) |
|
|
|
{create_visual_code("random", genre)} |
|
|
|
""" |
|
|
|
|
|
if not generated_code.startswith("$:"): |
|
generated_code = f"$: {generated_code}" |
|
|
|
complete_code = f"""{visual_code}{generated_code}""" |
|
|
|
return complete_code |
|
|
|
|
|
def generate_interface(prompt, genre, complexity, include_visuals, use_ai): |
|
"""Main interface function that generates working code""" |
|
|
|
if not prompt.strip(): |
|
return "Please enter a description of the music you want to create." |
|
|
|
if use_ai: |
|
|
|
import time |
|
random_seed = int(time.time() * 1000) % 1000 |
|
|
|
system_prompt = f"""Generate working Strudel live coding pattern for: {prompt} |
|
Genre: {genre}, Complexity: {complexity}, Variation: {random_seed} |
|
|
|
Example Strudel patterns: |
|
s("bd*4, hh*8").gain(0.8) |
|
stack(s("bd ~ sn ~"), n("0 2 4").s("sine").octave(3).gain(0.7)) |
|
n("[0 3 5 7]*2").s("sawtooth").octave(2).lpf(1200).gain(0.8).scale("a:minor") |
|
|
|
Generate a unique {complexity} {genre} pattern:""" |
|
|
|
try: |
|
outputs = code_generator( |
|
system_prompt, |
|
max_length=len(system_prompt.split()) + 80, |
|
temperature=random.uniform(0.7, 1.2), |
|
do_sample=True, |
|
top_p=random.uniform(0.8, 0.95), |
|
num_return_sequences=1 |
|
) |
|
|
|
generated_text = outputs[0]['generated_text'] |
|
strudel_code = generated_text[len(system_prompt):].strip() |
|
|
|
|
|
lines = strudel_code.split('\n') |
|
clean_lines = [] |
|
for line in lines[:8]: |
|
line = line.strip() |
|
|
|
if line and (line.startswith('s(') or line.startswith('n(') or line.startswith('stack(') or |
|
'.gain(' in line or '.s(' in line or '.octave(' in line or '.scale(' in line or |
|
line.endswith(')') or line.endswith(',') or '.lpf(' in line): |
|
clean_lines.append(line) |
|
|
|
elif any(stop_word in line.lower() for stop_word in ['function', 'var ', 'let ', 'const ', 'import', '//']): |
|
break |
|
|
|
if clean_lines: |
|
strudel_code = '\n'.join(clean_lines) |
|
strudel_code = f"// AI Generated: {prompt} #{random_seed}\n{strudel_code}" |
|
else: |
|
|
|
strudel_code = generate_working_strudel_code(prompt, genre, complexity) |
|
except Exception as e: |
|
|
|
print(f"AI generation failed: {e}") |
|
strudel_code = generate_working_strudel_code(prompt, genre, complexity) |
|
else: |
|
|
|
strudel_code = generate_working_strudel_code(prompt, genre, complexity) |
|
|
|
|
|
complete_code = create_complete_strudel_code(strudel_code, include_visuals, genre) |
|
|
|
return complete_code |
|
|
|
|
|
with gr.Blocks(title="Working Strudel Generator", theme=gr.themes.Soft()) as app: |
|
gr.Markdown(""" |
|
# π΅ CODEL: AI Strudel Code Generator |
|
|
|
Generate high-quality Strudel live coding patterns! |
|
|
|
β
**Premium curated patterns** - professional quality sounds |
|
ποΈ **Real Strudel syntax** - copy & paste ready |
|
π¨ **Random genre-specific visuals** - different every time! |
|
π΅ **6 genres** with authentic patterns |
|
|
|
|
|
**Usage:** Describe music β Generate β Copy to [strudel.cc](https://strudel.cc) β Play! |
|
""") |
|
|
|
with gr.Row(): |
|
with gr.Column(): |
|
prompt_input = gr.Textbox( |
|
label="πΌ Describe your music", |
|
placeholder="e.g., 'Fast techno with reverb', 'Chill ambient with delay', 'Glitchy breakbeat'", |
|
lines=3 |
|
) |
|
|
|
with gr.Row(): |
|
genre_dropdown = gr.Dropdown( |
|
choices=["techno", "house", "ambient", "breakbeat", "experimental", "hiphop"], |
|
value="techno", |
|
label="π΅ Genre" |
|
) |
|
|
|
complexity_dropdown = gr.Dropdown( |
|
choices=["simple", "moderate", "complex"], |
|
value="moderate", |
|
label="βοΈ Complexity" |
|
) |
|
|
|
with gr.Row(): |
|
include_visuals = gr.Checkbox( |
|
label="π¨ Include visuals", |
|
value=True |
|
) |
|
|
|
use_ai = gr.Checkbox( |
|
label="π€ Use AI (slower)", |
|
value=False |
|
) |
|
|
|
generate_btn = gr.Button("Generate Code", variant="primary", size="lg") |
|
|
|
with gr.Column(): |
|
output_code = gr.Code( |
|
label="β
Premium Strudel Code (Ready to Copy)", |
|
language="javascript", |
|
lines=18 |
|
) |
|
|
|
gr.Markdown(""" |
|
**π― Instructions:** |
|
1. **Copy** all the code above |
|
2. **Go to** [strudel.cc](https://strudel.cc) |
|
3. **Paste** and **click the play button** βΆοΈ |
|
|
|
**π§ Pro Tips:** |
|
- Change `.gain()` values (0.1 to 1.0) to balance levels |
|
- Try different scales: "a:minor", "c:major", "d:minor" |
|
- Use `.sometimes()` for variation: `.sometimes(fast(2))` |
|
- Add effects: `.room()`, `.delay()`, `.lpf()`, `.degradeBy()` |
|
""") |
|
|
|
|
|
gr.Markdown("### πͺ Premium Examples (Pro Quality)") |
|
with gr.Row(): |
|
working_examples = [ |
|
["Techno with filter sweeps", "techno", "complex"], |
|
["Deep house with swing", "house", "moderate"], |
|
["Ethereal ambient soundscape", "ambient", "complex"], |
|
["Crunchy hip-hop beat", "hiphop", "moderate"], |
|
["Glitchy experimental textures", "experimental", "complex"], |
|
] |
|
|
|
for example_text, example_genre, example_complexity in working_examples: |
|
btn = gr.Button(f"π₯ {example_text}", size="sm") |
|
btn.click( |
|
lambda t=example_text, g=example_genre, c=example_complexity: (t, g, c), |
|
outputs=[prompt_input, genre_dropdown, complexity_dropdown] |
|
) |
|
|
|
|
|
generate_btn.click( |
|
generate_interface, |
|
inputs=[ |
|
prompt_input, |
|
genre_dropdown, |
|
complexity_dropdown, |
|
include_visuals, |
|
use_ai |
|
], |
|
outputs=output_code |
|
) |
|
|
|
|
|
if __name__ == "__main__": |
|
app.launch() |