This commit is contained in:
aprilnightk 2025-09-15 19:23:03 +03:00
parent 0d1de1b39e
commit c3756c4bd9
5 changed files with 60 additions and 34 deletions

View file

@ -1,24 +1,30 @@
import random
class PianoString:
def __init__(self, s, note):
def __init__(self, s, note, i):
self.s = s
self.basefreq = self.s.note(note)
self.primary_gain = 0.4
self.mod = self.s.node()
self.node = self.s.node()
self.node.setpos(0, -10.0+i, 0, 0)
self.node.setbasefreq(0, self.basefreq)
self.node.setgain(0, self.primary_gain)
self.mod.setbasefreq(0, 10)
self.mod.setgain(0, 0.8)
self.mod.sine(0, self.s.end)
self.node.fmsetup(0, self.basefreq, 0.009)
self.node.fm(0, self.s.end)
self.node.setskew(0, 0.3)
self.node.setadsrgain(0, 1)
self.node.setadsrsustain(0, 0.2)
self.s.wire(self.mod, self.node)
self.s.air(self.node, [self.s.left, self.s.right])
@ -28,34 +34,52 @@ class PianoString:
def play(self, starttick, endtick):
self.node.slidegain(starttick, endtick, self.primary_gain, 0)
self.node.sine(starttick, endtick, 0.5)
self.node.skewsine(starttick, endtick)
self.node.square(starttick, endtick, 0.2)
self.node.triangle(starttick, endtick, 0.4)
keyhold_endtick = endtick
endtick += self.s.sec(0.3)
self.node.adsr(starttick, endtick,
self.s.sec(0.03),
self.s.sec(0.03),
self.s.sec(0.36),
keyhold_endtick - starttick,
keyhold_endtick - starttick + self.s.sec(0.3))
#self.mod.sine(starttick, endtick)
#self.node.fm(starttick, endtick)
self.node.sine(starttick, endtick, 0.2)
self.node.skewsine(starttick, endtick, 0.3)
self.node.square(starttick, endtick, 0.04)
self.node.adsr(starttick, endtick,
self.s.sec(0.067),
self.s.sec(0.07),
self.s.sec(0.09),
self.s.sec(0.1),
self.s.sec(0.2))
self.node.whitenoise(starttick, endtick, 0.01)
self.node.triangle(starttick, endtick, 0.2)
def playsec(self, start, end):
self.play(self.s.sec(start), self.s.sec(end))
s.setup(s.sec(4))
"""
S = PianoString(s, "E4")
S.playsec(0,1)
notes = 'CDEFGAB'
octaves = '345'
S2 = PianoString(s, "C#4")
S2.playsec(1,2)
gamma = []
"""
n = s.node()
n.setgain(0, 0.4)
#n.whitenoise(0, s.sec(2), 0.8924587, 0.3)
for o in octaves:
for n in notes:
gamma.append(n+o)
s.setup(s.sec(len(gamma)+2))
for i in range(0, len(gamma)):
note = gamma[i]
S = PianoString(s, note, i)
S.playsec(i, i+1.4)
n.setadsrgain(0, 1)
n.setadsrsustain(0, 0.4)
n.adsr(0, s.sec(2), s.sec(0.03), s.sec(0.04), s.sec(0.3), s.sec(1.3), s.sec(2))
n.sine(0, s.sec(2), 0.3)
n.triangle(0, s.sec(2))
s.wire(n, [s.left, s.right])

View file

@ -1,7 +1,8 @@
from .sonnum import Sonnum
from .activity import Activity
import random
class SonnumCompiler:
def __init__(self):

View file

@ -81,7 +81,7 @@ class SoundNode:
def mute(self, start_tick, end_tick):
self.act('mute', start_tick, end_tick, self, None, [])
def whitenoise(self, start_tick, end_tick, seed = 0.259624856928, gainmult = 0.0):
def whitenoise(self, start_tick, end_tick, gainmult = 0.0, seed = 0.259624856928):
self.act('whitenoise', start_tick, end_tick, self, None, [seed, gainmult])
def setadsrgain(self, start_tick, adsrgain):

View file

@ -584,8 +584,9 @@ pub const Activity = struct {
pub fn adsr(self: *Activity) !void {
const current_tick: f64 = @floatFromInt(self.soundnode.fab.current_tick);
const real_current_tick: f64 = @floatFromInt(self.soundnode.fab.current_tick);
const start_tick: f64 = @floatFromInt(self.start_tick);
const current_tick = real_current_tick - start_tick;
var adsrgain = self.soundnode.g("adsrgain");
const adsrsustain = self.soundnode.g("adsrsustain");
@ -603,15 +604,15 @@ pub const Activity = struct {
var gain: f64 = 0;
if (current_tick <= start_tick + attack_tick) {
if (current_tick <= attack_tick) {
gain = adsrgain * current_tick / attack_tick;
} else if (current_tick <= start_tick + hold_tick) {
} else if (current_tick <= hold_tick) {
gain = adsrgain;
} else if (current_tick <= start_tick + decay_tick) {
} else if (current_tick <= decay_tick) {
gain = ((current_tick-hold_tick)*(adsrsustain-adsrgain)/(decay_tick - hold_tick)) + adsrgain;
} else if (current_tick <= start_tick + sustain_tick) {
} else if (current_tick <= sustain_tick) {
gain = adsrsustain;
} else if (current_tick <= start_tick + release_tick) {
} else if (current_tick <= release_tick) {
gain = (adsrsustain * (current_tick - sustain_tick) / (sustain_tick - release_tick)) + adsrsustain;
}

View file

@ -26,7 +26,7 @@ pub fn main() !void {
// Creating a list of soundnodes
var soundnodes = ArrayList(*SoundNode).init(allocator);
defer soundnodes.deinit();
// Determining length of resulting audio in ticks
const start_tick: u32 = 0;
var end_tick: u32 = 44100 * 10;