Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Re: Splayn.bas

2 views
Skip to first unread message

Bohgosity BumaskiL

unread,
Nov 10, 2010, 6:04:38 PM11/10/10
to
' http://ecn.ab.ca/~brewhaha/Sound/Splayn.mp3
' -CC- Released in a creative commons
' -BY- Attribution requested wherever you can see my work in yours
' -NC- Some commercial re-transmissions require another license
' -ND- You may not use or embed my tune in another file. Please link to it.

' In order of panning...
' parallel harmonic on left, then right...
DATA 8, 12, 16, 24, 36, 48, 54, 36, 27, 18, 12, 9

DATA 0,0,1,0

DATA 50,50,9,0
' 25:19 (no name in http://www.huygens-fokker.org/docs/intervals.html)
DATA 38,38,6,0
' [38:25]
DATA 25,25,9,0
' [38:25]
DATA 38,38,6,0
' Rest.
DATA 0, 0,6,0

DATA 45,45,9,0
' [45:34] 45=15*3:34=17*2
DATA 34,34,6,0
' Some kind of fifth -- 57=19*3:34=17*2
DATA 57,57,9,0
' Undevicimal ditone. First ratio in this tune with a name.
DATA 45,45,6,0
DATA 0, 0,6,0

DATA 42,42,9,0
' Narrow Fourth
DATA 32,32,6,0
' 53:32 (fifty-three is prime, and haz "no musical harmonics". 8-)
DATA 53,53,9,0
' One prime to another.
DATA 47,47,12,0
DATA 0, 0,3,0
' Someone out there thinks that 42 is the answer to everything;
' makes a nice ending for this.
DATA 42,42,12,0
' Two seconds of terminal rest.
DATA 0,0,34,0

' The following is public domain.
' I would be sorry to be using it if I did not trust it.

OPTION BASE 1
DIM harmonics(12) AS DOUBLE
DIM chanamp(2, 12) AS DOUBLE
DIM Velocity(12) AS DOUBLE
DIM Acceleration(12) AS DOUBLE
DIM Angle(12) AS DOUBLE
DIM Phase(12) AS DOUBLE
DIM TerminalAngle(12) AS DOUBLE
DIM DropAngle(12) AS DOUBLE
DIM PhaseDir(12) AS INTEGER
DIM sign(12) AS INTEGER
DIM BeatsPerSecond AS DOUBLE
DIM ampleft AS DOUBLE
DIM ampright AS DOUBLE
DIM temp AS DOUBLE
DIM TwoPi AS DOUBLE
DIM SampleRate AS LONG
DIM amp AS LONG
DIM lastnote(12) AS DOUBLE
DIM note(12) AS DOUBLE
DIM length, glide AS INTEGER
DIM k, g, t, samples, numharmonics AS INTEGER
DIM Test AS STRING

Test = "0"
numharmonics = 12
pi = 3.141592653589793#
TwoPi = pi * 2
SampleRate = 44100
BeatsPerSecond = 17#
lastnote(1) = 0
lastnote(2) = 0

OPEN "\sox\splayn.raw" FOR OUTPUT AS #2
OPEN "splayn.bat" FOR OUTPUT AS #1
PRINT #1, "e:\progra~1\freebasic\fbc -lang qb splayn.bas"
PRINT #1, "splayn.exe"
PRINT #1, "cd \sox"
PRINT #1, "sox -c 2 -r"; SampleRate; " -sw splayn.raw splayn.wav stat"
CLOSE #1

FOR k = 1 TO numharmonics
READ harmonics(k)
NEXT k

ampleft = 150000
ampright = 125000
temp = temp - temp
DropAngle(1) = 1 / numharmonics
k = 1
FOR k = 1 TO numharmonics
chanamp(1, k) = ampleft / harmonics(k) * temp
chanamp(2, k) = ampright / harmonics(k) * (1 - temp)
IF k MOD 2 = 0 THEN
chanamp(1, k) = -chanamp(1, k)
ELSE
chanamp(2, k) = -chanamp(2, k)
END IF
temp = temp + DropAngle(1)
NEXT k

100
FOR g = 1 TO 18
READ note(1), note(2), length, glide
FOR k = 3 TO numharmonics STEP 2
note(k) = note(1) * harmonics(k)
note(k + 1) = note(2) * harmonics(k + 1)
NEXT k
note(1) = note(1) * harmonics(1)
note(2) = note(2) * harmonics(2)

IF g > 0 THEN
' SOUND note(1), length
END IF
IF Test = "0" THEN
IF note(1) = 0 AND lastnote(1) = 0 THEN
samples = SampleRate * length / BeatsPerSecond
GOSUB 300
GOTO 75
END IF
IF note(1) = 0 AND lastnote(1) <> 0 THEN
GOSUB 250
FOR k = 1 TO numharmonics
lastnote(k) = note(k)
NEXT k
samples = SampleRate * length / BeatsPerSecond
GOSUB 300
GOTO 75
END IF
IF note(1) <> 0 AND lastnote(1) = 0 THEN
FOR k = 1 TO numharmonics
lastnote(k) = note(k)
NEXT k
samples = SampleRate * length / BeatsPerSecond
GOSUB 275
GOTO 75
END IF
IF note(1) <> 0 AND lastnote(1) <> 0 THEN
IF glide > 0 THEN
samples = SampleRate * length /
BeatsPerSecond /

glide
GOSUB 300
samples = SampleRate * length /
BeatsPerSecond -

samples
ELSE
samples = SampleRate * length /
BeatsPerSecond
END IF
FOR k = 1 TO numharmonics
lastnote(k) = note(k)
NEXT k
GOSUB 300
GOTO 75
END IF
END IF
75 NEXT g

IF Test = "1" THEN END

CLOSE #2
END

250
FOR k = 1 TO numharmonics
temp = Angle(k) / TwoPi
Angle(k) = (temp - FIX(temp)) * TwoPi
IF Angle(k) > pi * 3 / 2 THEN
TerminalAngle(k) = pi * 3.5
PhaseDir(k) = 2
DropAngle(k) = pi * 2.5
ELSEIF Angle(k) > pi / 2 THEN
TerminalAngle(k) = pi * 2.5
PhaseDir(k) = 1
DropAngle(k) = pi * 3 / 2
ELSE
TerminalAngle(k) = pi * 3 / 2
PhaseDir(k) = -1
DropAngle(k) = pi / 2
END IF
NEXT k

260
FOR k = 1 TO numharmonics
Phase(k) = SIN(Angle(k))
SELECT CASE PhaseDir(k)
CASE 2
IF Angle(k) >= DropAngle(k) THEN
Phase(k) = Phase(k) / 2 + .5
END IF
CASE 1
IF Angle(k) >= DropAngle(k) THEN
Phase(k) = Phase(k) / 2 - .5
END IF
CASE -1
IF Angle(k) >= DropAngle(k) THEN
Phase(k) = Phase(k) / 2 + .5
END IF
END SELECT
IF Angle(k) < TerminalAngle(k) THEN
Angle(k) = Angle(k) + Velocity(k)
ELSE
Angle(k) = TerminalAngle(k)
END IF
NEXT k
GOSUB 400

FOR k = 1 TO numharmonics
IF Angle(k) < TerminalAngle(k) THEN GOTO 260
NEXT k
FOR k = 1 TO numharmonics
Angle(k) = Angle(k) - Angle(k)
NEXT k

RETURN

275
' This starts a wave from zero, using half the amplitude, a start
' from where sin(angle) = -1, and a bias of half. This cuts
' a leading click that I can hear on some equipment with some tunes.
FOR k = 1 TO numharmonics
Velocity(k) = TwoPi * lastnote(k) / SampleRate
Acceleration(k) = (TwoPi * note(k) / SampleRate - Velocity(k)) /
samples
PhaseDir(k) = 1
Angle(k) = 3 / 2 * pi
NEXT k

280
FOR k = 1 TO numharmonics
IF PhaseDir(k) = 1 THEN
Phase(k) = SIN(Angle(k)) / 2 + .5
ELSE
Phase(k) = SIN(Angle(k))
END IF
Angle(k) = Angle(k) + Velocity(k)
Velocity(k) = Velocity(k) + Acceleration(k)
NEXT k
samples = samples - 1
GOSUB 400

FOR k = 1 TO numharmonics
IF PhaseDir(k) = 1 THEN
Phase(k) = (Phase(k) - .5) * 2
END IF
IF Phase(k) > SIN(Angle(k)) THEN
PhaseDir(k) = -1
END IF
NEXT k

FOR k = 1 TO numharmonics
IF PhaseDir(k) = 1 GOTO 280
NEXT k

300
FOR k = 1 TO numharmonics
Velocity(k) = TwoPi * lastnote(k) / SampleRate
Acceleration(k) = (TwoPi * note(k) / SampleRate - Velocity(k)) /
samples
NEXT k

FOR t = 1 TO samples
FOR k = 1 TO numharmonics
Velocity(k) = Velocity(k) + Acceleration(k)
Angle(k) = Angle(k) + Velocity(k)
Phase(k) = SIN(Angle(k))
NEXT k
GOSUB 400
NEXT t
RETURN

400
ampleft = ampleft - ampleft
ampright = ampright - ampright
FOR k = 1 TO numharmonics
ampleft = ampleft + Phase(k) * chanamp(1, k)
ampright = ampright + Phase(k) * chanamp(2, k)
NEXT k

amp = CINT(ampleft)
PRINT #2, CHR$(amp AND 255); CHR$((amp AND 65280) / 256);
amp = CINT(ampright)
PRINT #2, CHR$(amp AND 255); CHR$((amp AND 65280) / 256);

RETURN


Bohgosity BumaskiL

unread,
Nov 12, 2010, 9:25:25 AM11/12/10
to
' http://ecn.ab.ca/~brewhaha/Sound/Splayn.mp3
' -CC- Released in a creative commons
' -BY- Attribution requested wherever you can see my work in yours
' -NC- Some commercial sources require another license

' -ND- You may not use or embed my tune in another file. Please link to it.

' In order of panning...
' parallel harmonic on left, then right...
DATA 8, 12, 16, 24, 36, 48, 54, 36, 27, 18, 12, 9

' Looking at my numbers carefully, I found that it makes more sense
' to put my ending at the begining. I also adjusted a few numbers,
' so that ALL of the ratios are named.
' Notes, prepared for complex harmony, where left and right differ.
' Left, Right, Length, 1/portion of note to glide from last note...
DATA 0, 0, 1,0

DATA 35,35, 6,0
DATA 0, 0, 1,0
' Septimal Whole Tone
DATA 40,40, 4,0
' Minor Semitone
DATA 42,42, 6,0
' Major Diatonic Semitone
DATA 45,45, 4,8
' Minor Diatonic Semitone
DATA 0, 0, 2,0

DATA 48,48, 9,0
DATA 0, 0, 1,0
' Perfect Fourth
DATA 36,36, 6,0
' Perfect Fifth
DATA 24,24, 9,8
DATA 0, 0, 2,0
' Perfect Fifth
DATA 36,36, 6,0
' Rest.
DATA 0, 0, 4,0

DATA 45,45, 9,0
' Septimal Major Third
DATA 35,35, 6,0
' Something near a major sixth.
DATA 57,57, 9,0
' Undevicimal ditone.
DATA 45,45, 6,8
DATA 0, 0, 4,0

DATA 42,42, 9,0
' Narrow Fourth
DATA 32,32, 6,0
' Pythagorean Major Sixth
DATA 54,54, 9,0
' Major Second
DATA 48,48,12,8
DATA 0, 0, 2,0
' Septimal Whole Tone


DATA 42,42,12,0
' Two seconds of terminal rest.

DATA 0, 0,37,0
' Designed to loop -- two seconds are usually here.
' This is three more beats, so I cut two seconds
' out of what my post-processing filters jenerate
' at the end of a file, then mixed it with the beginning.

OPEN "\sox\left.raw" FOR OUTPUT AS #2
OPEN "\sox\right.raw" FOR OUTPUT AS #3
OPEN "\sox\splayn.raw" FOR OUTPUT AS #4


OPEN "splayn.bat" FOR OUTPUT AS #1
PRINT #1, "e:\progra~1\freebasic\fbc -lang qb splayn.bas"
PRINT #1, "splayn.exe"
PRINT #1, "cd \sox"
PRINT #1, "sox -c 2 -r"; SampleRate; " -sw splayn.raw splayn.wav stat"

PRINT #1, "sox -c 1 -r"; SampleRate; " -sw left.raw left.wav stat"
PRINT #1, "sox -c 1 -r"; SampleRate; " -sw right.raw right.wav stat"
CLOSE #1

FOR k = 1 TO numharmonics
READ harmonics(k)
NEXT k

ampleft = 160000
ampright = 120000


temp = temp - temp
DropAngle(1) = 1 / numharmonics
k = 1
FOR k = 1 TO numharmonics
chanamp(1, k) = ampleft / harmonics(k) * temp
chanamp(2, k) = ampright / harmonics(k) * (1 - temp)
IF k MOD 2 = 0 THEN
chanamp(1, k) = -chanamp(1, k)
ELSE
chanamp(2, k) = -chanamp(2, k)
END IF
temp = temp + DropAngle(1)
NEXT k

100
FOR g = 1 TO 26

CLOSE #2
END

RETURN

amp = CINT(ampleft)
PRINT #4, CHR$(amp AND 255); CHR$((amp AND 65280) / 256);


PRINT #2, CHR$(amp AND 255); CHR$((amp AND 65280) / 256);
amp = CINT(ampright)

PRINT #4, CHR$(amp AND 255); CHR$((amp AND 65280) / 256);
PRINT #3, CHR$(amp AND 255); CHR$((amp AND 65280) / 256);

RETURN

' http://ecn.ab.ca/~brewhaha/ BrewJay's Babble Bin


0 new messages