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

A More Kompleet (and less redundant) Ingglish Alfabet Song in duet harmony.

2 views
Skip to first unread message

Bohgosity BumaskiL

unread,
Nov 15, 2009, 8:32:39 AM11/15/09
to
' This source is slightly better than:
' http://ecn.ab.ca/~brewhaha/Sound/Kompleet_Ingglish_Alfabet.mp3 32kbps.
' ...even though it contains vibrato harmonies. The two parts here construct
each
' other better, especially during the opening three phrases.
' Delete crosspostings that you do not understand in replies.
DATA 1,8,2,8
' I could adjust those for a particular key, except some of the harmonies in
this
' work are not on the piano, to my knowledge. Most of them are.
' When I went to post this. I saw three octave harmonies in a row that work
' much better as unison, and when I went to make them manually (after doing
' some other trials, the easy way being to make an eight, above, into a
sixteen),
' I saw some other tweaks to make. The recording is better than it was with
' simple (parallel perfect fourth) harmony, and it will be better,
' perhaps this morning.
' For a radical change from my usual output, which throws about three
transforms
' on my voice and five on my synth, I will post only dry signal. I will not
even be
' mixing synth with vocals.

' Left, Right, Time
DATA 24,24,8
' unison
DATA 32,48,4
' Perfect fifth.
DATA 40,42,8
' Minor Semitone.
DATA 36,36,4
' Unison
DATA 32,28,6
' Septimal whole tone.
DATA 0,0,3
' Rest for three beats.
DATA 21,36,8
' Septimal major sixth.
DATA 28,38,4
' 19:14 Obscure -- vibrato harmony.
DATA 36,36,8
' Unison
DATA 32,32,4
' Unison
DATA 28,28,6
' Unison
DATA 0,0,3
' Rest
DATA 19,32,9
' Nonadecimal subharmonic. Diminished octave?
DATA 25,36,4
' Classic diminished fifth.
DATA 32,32,8
' Unison
DATA 28,28,4
' Unison
DATA 25,25,9
' Unison
DATA 0,0,2
' Rest
DATA 36,48,12
' Perfect fourth.
DATA 28,25,12
' Middle second.
DATA 0,0,3
DATA 40,24,9
' Major sixth.
DATA 32,40,4
' Major third.
DATA 24,36,8
' Perfect fifth.
DATA 21,32,4
' Wide fifth.
DATA 19,28,9
' Obscure. 20:30 is a perfect fifth.
DATA 0,0,2
DATA 24,42,12
' Jazz Seventh.
DATA 16,32,12
' Octave.
DATA 0, 0, 3
' Rest.
DATA 36,25,8
' Classic diminished fifth.
DATA 28,36,4
' Perfect fifth.
DATA 21,39,8
' http://www.huygens-fokker.org/docs/intervals.html says it's a 16/3-tone
' I think that means it is supposed to be a tritone.
DATA 19,32,4
' 19th subharmonic. Diminished octave?
DATA 18,28,8
' Septimal minor sixth.
DATA 0,0,2
' Rest.
DATA 21,48,12
' Septimal major ninth.
DATA 0,0,1
' Rest indicates staccato. The rest of it is legato.
DATA 18,36,11
' Octave.
DATA 0, 0, 3
DATA 40,48,8
' Minor third.
DATA 32,36,4
' Major second.
DATA 24,42,8
' Jazz Seventh.
DATA 32,48,4
' Perfect fifth.
DATA 36,21,8
' Septimal major sixth.
DATA 32,24,8
' Perfect fouth.
DATA 0,0,34
' Two seconds of tail. (That does not mean how it sounds. ):

OPTION BASE 1
DIM TwoPi AS DOUBLE
DIM pi AS DOUBLE
DIM temp AS DOUBLE
DIM BeatsPerSecond AS DOUBLE
DIM Angle(2) AS DOUBLE
DIM Velocity(2) AS DOUBLE
DIM Acceleration(2) AS DOUBLE
DIM Phase(2) AS DOUBLE
DIM Note(2) AS INTEGER
DIM LastNote(2) AS INTEGER
DIM length AS INTEGER
DIM Harmonics(2) AS SINGLE
DIM Samples AS LONG
DIM t AS LONG
DIM SampleRate AS LONG
DIM k AS INTEGER
DIM g AS INTEGER
DIM amp AS INTEGER
DIM basis AS INTEGER
DIM NumHarmonics AS INTEGER
DIM part(2) AS INTEGER
DIM Sign(2) AS INTEGER
DIM glide AS INTEGER
DIM test AS STRING
DIM TerminalAngle(2) AS DOUBLE
DIM DropAngle(2) AS DOUBLE
DIM PhaseDir(2) AS DOUBLE

PRINT
test = "0"
' I frequently flip that.
NumHarmonics = 2
BeatsPerSecond = 17#
pi = 3.141592653589793#
TwoPi = pi * 2
SampleRate = 8000
LastNote(1) = 0
LastNote(2) = 0

IF test = "0" THEN
OPEN "alfabet.bat" FOR OUTPUT AS #1
OPEN "\sox\alfabet.raw" FOR OUTPUT AS #4
PRINT #1, "e:\progra~1\freebasic\fbc -lang qb d:\basic\alfabet.bas"
PRINT #1, "alfabet.exe"
PRINT #1, "cd \sox"
PRINT #1, "sox -c 2 -r"; SampleRate; " -sw alfabet.raw alfabet.wav
stat"
CLOSE #1, #2
END IF

FOR k = 1 TO NumHarmonics
READ part(k), Harmonics(k)
Note(k) = 0
LastNote(k) = 0
NEXT k

glide = 30
100
FOR g = 1 TO 47
READ Note(1), Note(2), length
' IF g > 0 THEN
' SOUND Note(1) * 8, 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 LastNote(1) = 0 AND Note(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
Samples = SampleRate * length / BeatsPerSecond /
glide
GOSUB 300
Samples = SampleRate * length / BeatsPerSecond
FOR k = 1 TO NumHarmonics
LastNote(k) = Note(k)
NEXT k
GOSUB 300
GOTO 75
END IF
END IF

75 NEXT g
CLOSE #4

END

' *Neat* Silencer -- finishes a wave like 275 starts one.
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) = 1
DropAngle(k) = pi * 2.5
ELSEIF Angle(k) > pi / 2 THEN
TerminalAngle(k) = pi * 2.5
PhaseDir(k) = 0
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 1
IF Angle(k) >= DropAngle(k) THEN
Phase(k) = Phase(k) / 2 + .5
END IF
CASE 0
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
IF part(k) <> 0 THEN
Velocity(k) = TwoPi * LastNote(part(k)) * Harmonics(part(k))
/ SampleRate
Acceleration(k) = (TwoPi * Note(part(k)) *
Harmonics(part(k)) / SampleRate - Velocity(k)) / Samples
ELSE
Velocity(k) = TwoPi * Note(k) * Harmonics(k) / SampleRate
Acceleration(k) = 0
END IF
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
' Calculate constants of change for write loop.
FOR k = 1 TO NumHarmonics
Velocity(k) = TwoPi * LastNote(part(k)) * Harmonics(k) / SampleRate
Acceleration(k) = (TwoPi * Note(part(k)) * Harmonics(k) /
SampleRate - Velocity(k)) / Samples
NEXT k

' Main write loop. Static Phases problem solved at 250.
FOR t = 1 TO Samples
FOR k = 1 TO NumHarmonics
Phase(k) = SIN(Angle(k))
NEXT k

GOSUB 400

FOR k = 1 TO NumHarmonics
Angle(k) = Angle(k) + Velocity(k)
Velocity(k) = Velocity(k) + Acceleration(k)
NEXT k
NEXT t
RETURN

400
' Write a sample.
amp = CINT(Phase(1) * 31700)
PRINT #4, CHR$(amp AND 255);
PRINT #4, CHR$((amp AND 65280) / 256);

amp = CINT(Phase(2) * 31700)
PRINT #4, CHR$(amp AND 255);
PRINT #4, CHR$((amp AND 65280) / 256);
RETURN
' http://ecn.ab.ca/~brewhaha/ BrewJay's Babble Bin


Bohgosity BumaskiL

unread,
Nov 17, 2009, 2:01:55 PM11/17/09
to
http://ecn.ab.ca/~brewhaha/Sound/Kompleet_Ingglish_Alfabet.mp3
Last night, that changed again, and so did my source. Vocals are there, this
time, and they always were, because I uploaded a wave file that I mistook
for an MP3. So, you missed an intermediate version that I announced. I am
determined to make only one more release of the source, and it will again be
a radical change from previous versions, because I will re-write the beat,
and only the beat, to make it easier to sing and listen to.
_______
http://ecn.ab.ca/~brewhaha/ Organized Babble


Bohgosity BumaskiL

unread,
Nov 20, 2009, 2:09:39 AM11/20/09
to
' The beat in this is better. So is the synchronization and my singing.
' It's also easier for anyone else, because it is slower.
' http://ecn.ab.ca/~brewhaha/Sound/Kompleet_Ingglish_Alfabet.mp3
' I will put post-production in sound for a video going with that link.
' Names come from http://www.huygens-fokker.org/docs/intervals.html
' in reduced fractions.
DATA 1,5,2,5
' Part, basis frequency, part, basis frequency.
' Renumbering parts exchanges channels.

DATA 16 ,24 , 8
' Perfect Fifth
DATA 32 ,48 , 8
' Perfect Fifth
DATA 40 ,42 , 6
' Minor Semitone
DATA 36 ,36 , 3
' Unison
DATA 32 ,28 , 9
' Septimal Whole Tone
DATA 0 , 0 , 2
' Rest for two beats of fifteen beats per second.
DATA 14 ,36 , 8
' Obscure 18:7
DATA 28 ,40 , 8
' Euler's Tritone
DATA 36 ,36 , 6
' Unison
DATA 32 ,32 , 3
' Unison
DATA 28 ,28 , 9
' Unison
DATA 0 , 0 , 2
' Rest
DATA 13 ,34 , 8
' Obscure 34:13
DATA 26 ,36 , 8
' Tridecimal Augmented Fourth
DATA 34 ,34 , 6
' Unison
DATA 30 ,28 , 3
' Major Diatonic Semitone
DATA 26 ,24 , 9
' Tridecimal 2/3-tone.
DATA 0 , 0 , 2
' Rest
DATA 36 ,48 , 12
' Perfect Fifth
DATA 30 ,24 , 12
' Major Third
DATA 0 , 0 , 3
' Rest
DATA 40 ,22 , 8
' Large Minor Seventh
DATA 36 ,40 , 8
' Minor Whole Tone
DATA 24 ,36 , 4
' Perfect Fifth
DATA 20 ,34 , 3
' Septendecimal Diminished Seventh
DATA 18 ,30 , 8
' Small Ninth
DATA 24 ,42 ,15
' Obscure 21:12
DATA 16 ,32 ,12
' Octave
DATA 0 , 0 , 3
' Rest
DATA 36 ,24 , 8
' Perfect Fifth
DATA 26 ,36 , 8
' Tridecimal Augmented Fourth
DATA 22 ,40 , 4
' Large Minor Seventh
DATA 20 ,34 , 3
' Septendecimal Diminished Seventh
DATA 18 ,28 , 8
' Septimal Minor Sixth
DATA 22 ,48 ,15
' Obscure 24:11
DATA 18 ,36 ,12
' Octave
DATA 0 , 0 , 3
' Rest
DATA 40 ,48 , 8
' Minor Third
DATA 32 ,36 , 8
' Major Second
DATA 24 ,42 , 4
' Obscure 21:12
DATA 32 ,48 , 3
' Perfect Fifth
DATA 36 ,22 , 8
' Undecimal Neutral Sixth
DATA 32 ,24 , 8
' Perfect Fourth
DATA 0 , 0 ,34
' Two Seconds of Rest

OPTION BASE 1
DIM TwoPi AS DOUBLE
DIM pi AS DOUBLE
DIM temp AS DOUBLE
DIM BeatsPerSecond AS DOUBLE
DIM Angle(2) AS DOUBLE
DIM Velocity(2) AS DOUBLE
DIM Acceleration(2) AS DOUBLE
DIM Phase(2) AS DOUBLE

DIM note(2) AS INTEGER


DIM LastNote(2) AS INTEGER
DIM length AS INTEGER
DIM Harmonics(2) AS SINGLE
DIM Samples AS LONG
DIM t AS LONG
DIM SampleRate AS LONG
DIM k AS INTEGER
DIM g AS INTEGER
DIM amp AS INTEGER
DIM basis AS INTEGER
DIM NumHarmonics AS INTEGER
DIM part(2) AS INTEGER
DIM Sign(2) AS INTEGER
DIM glide AS INTEGER
DIM test AS STRING
DIM TerminalAngle(2) AS DOUBLE
DIM DropAngle(2) AS DOUBLE
DIM PhaseDir(2) AS DOUBLE

PRINT
test = "0"
' I frequently flip that.
NumHarmonics = 2

BeatsPerSecond = 15#


pi = 3.141592653589793#
TwoPi = pi * 2

SampleRate = 12000


LastNote(1) = 0
LastNote(2) = 0

' The following code must be customized for where your "Sound Exchange"
' and FreeBasic, FirstBasic, or QBASIC is installed.


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

FOR k = 1 TO NumHarmonics
READ part(k), Harmonics(k)
note(k) = 0


LastNote(k) = 0
NEXT k

' OPEN "alfabet.bas" FOR APPEND AS #2
' Enable that if you want to make basis frequencies in each channel equal.

glide = 30
100
' Here starts the main loop, counting notes.
FOR g = 1 TO 44
READ note(1), note(2), length
' PRINT USING "DATA ##,##,##"; cint(note(1) / 3); cint(note(2) / 2);
length;
' That is for feeding global changes back into this code.
' The trend for my hand calculations is to raise numbers,
' and with a little tweaking, the lower numbers often work.
' IF g > 0 THEN
' SOUND note(1) * 5, length
' I tend to hear at 2:1 above that, unless they are pure sine waves.
' IF note(2) <> 0 THEN
' PRINT note(2) / note(1);
' END IF


' 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 LastNote(1) = 0 AND note(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


Samples = SampleRate * length / BeatsPerSecond /
glide
GOSUB 300
Samples = SampleRate * length / BeatsPerSecond
FOR k = 1 TO NumHarmonics

LastNote(k) = note(k)


NEXT k
GOSUB 300
GOTO 75
END IF
END IF

75 NEXT g
CLOSE #4

END

' *Neat* Silencer -- finishes a wave like 275 starts one.

' When a wave peaks, then it is biased by half and the amplitude drops to
half.
' An error is probably in it, because it does not always work -- something
to do
' with the difference betweeen > and >=.

' A line break should not be above.
Acceleration(k) = (TwoPi * note(part(k)) *

Harmonics(part(k)) / SampleRate - Velocity(k)) / Samples

' No line break.
ELSE
Velocity(k) = TwoPi * note(k) * Harmonics(k) / SampleRate

Acceleration(k) = (TwoPi * note(part(k)) * Harmonics(k) /

SampleRate - Velocity(k)) / Samples

' NLB.

Bohgosity BumaskiL

unread,
Nov 29, 2009, 1:57:29 PM11/29/09
to
' http://ecn.ab.ca/~brewhaha/Sound/Kompleet_Ingglish_Alfabet.mp3
' Mostly one-off tweaks of my last version. I am surprised at how much
' I can do that without compromising on how well the parts stand alone.
' I was surprised how well this works when it does not start in unison,
' nor end there. If you listen to the parts separately, they're very
similar
' to old versions, and I am using more traditional harmonies, now.

' I've never spent so much time on a duet, before.

' Left Part, basis frequency, Right Part, basis frequency.
DATA 1,9,2,9
' If you like tube distortion, chorusing, and reverb,
' then wait for my video. I make dry signal available for
' performance in person. You can fix it up, and please
' do not release recordings to anyone but me.

' Part 1, Part 2 -- normally left and right, but easily exchangable.


DATA 16 ,24 , 8
' Perfect Fifth
DATA 32 ,48 , 8
' Perfect Fifth
DATA 40 ,42 , 6
' Minor Semitone

DATA 35 ,35 , 3


' Unison
DATA 32 ,28 , 9
' Septimal Whole Tone
DATA 0 , 0 , 2
' Rest for two beats of fifteen beats per second.
DATA 14 ,36 , 8
' Obscure 18:7
DATA 28 ,40 , 8
' Euler's Tritone
DATA 36 ,36 , 6
' Unison
DATA 32 ,32 , 3
' Unison
DATA 28 ,28 , 9
' Unison
DATA 0 , 0 , 2
' Rest

DATA 12 ,32 , 8
' Perfect Eleventh
DATA 24 ,36 , 8
' Perfect Fifth
DATA 32 ,32 , 6
' Unison
DATA 30 ,27 , 3
' Minor Second
DATA 24 ,24 , 9


' Unison
DATA 0 , 0 , 2

' Rest. I was not singing that last phrase,
' and harmony works better this way, so I will learn it.


DATA 36 ,48 , 12
' Perfect Fifth
DATA 30 ,24 , 12
' Major Third
DATA 0 , 0 , 3
' Rest

DATA 40 ,21 , 8
' Acute Major Seventh
DATA 36 ,36 , 8
' Unison
DATA 24 ,32 , 4
' Perfect Fourth
DATA 20 ,30 , 3
' Perfect Fifth
DATA 18 ,27 , 8
' Perfect Fifth
DATA 24 ,40 ,15
' Major Sixth
DATA 16 ,30 ,12
' Classic Major Seventh


DATA 0 , 0 , 3
' Rest
DATA 36 ,24 , 8
' Perfect Fifth

DATA 27 ,36 , 8
' Perfect Fourth


DATA 22 ,40 , 4
' Large Minor Seventh

DATA 20 ,33 , 3
' Obscure 33:20 (Augmented undecimal fifth?)
DATA 18 ,27 , 8
' Perfect Fifth
DATA 22 ,48 ,15
' Obscure 24:11 (Augmented undecimal octave?)


DATA 18 ,36 ,12
' Octave
DATA 0 , 0 , 3
' Rest
DATA 40 ,48 , 8
' Minor Third
DATA 32 ,36 , 8
' Major Second
DATA 24 ,42 , 4

' Jazz Seventh


DATA 32 ,48 , 3
' Perfect Fifth

DATA 36 ,21 , 8
' Septimal Major Sixth


DATA 32 ,24 , 8
' Perfect Fourth

DATA 0 , 0 ,30
' Two Seconds of Rest
' snip source that is essentially the same, except for the following line:

' PRINT #2, USING "DATA ##-,##-,##"; cint(note(1)/2);cint(note(2)/2);
length
' That is for feeding experiments with basis frequencies back into this
code,
' commented out again once the job is done.


Bohgosity BumaskiL

unread,
Jan 11, 2010, 5:52:32 AM1/11/10
to
' left part, basis frequency, right part, fundamental frequency.
DATA 1,4,2,4,3,4,4,4
' I took it to a three part mixed solo with chaynjez in timing,
' then I noticed some one-off errors. In particular, some fifty-sevens
' (instead of fifty-sixes) relate to nineteen at a tritave, the
' harmonic that probably gave the hammond B3 its name.

' Other than that, channel one and four are an octave higher than in
' duets previously in this thread, and my basis frequency is less than
' half, so no *practical* change to the first two parts. The vocals won't
' be at http://ecn.ab.ca/~brewhaha/Sound/Kompleet_Ingglish_Alfabet.mp3
' for at least three and perhaps seventy two hours. In the meantime,
' it will be at 18kbps, and synth only.

' Data: Left Part, Middle parts, Right Part, Length...

DATA 0, 0, 0, 0, 2
DATA 36, 36, 36, 54, 8
DATA 72, 24, 24, 108, 8
DATA 90, 30, 30, 96, 6
DATA 80, 27, 27, 80, 3
DATA 72, 24, 24, 64, 8
DATA 0, 0, 0, 0, 2

DATA 32, 32, 32, 80, 8
DATA 64, 21, 21, 84, 8
DATA 80, 27, 27, 80, 6
DATA 72, 24, 24, 72, 3
DATA 64, 21, 21, 64, 8
DATA 0, 0, 0, 0, 2

DATA 28, 28, 28, 72, 8
DATA 57, 19, 19, 80, 8
DATA 72, 24, 24, 72, 6
DATA 64, 21, 21, 60, 3
DATA 57, 19, 19, 57, 8
DATA 0, 0, 0, 0, 2

DATA 80, 33, 33, 108, 12
DATA 64, 27, 27, 54, 12
DATA 0, 0, 0, 0, 4

DATA 90, 30, 30, 48, 8
DATA 80, 33, 33, 80, 8
DATA 54, 36, 36, 72, 4
DATA 44, 33, 33, 66, 4
DATA 40, 30, 30, 60, 9
DATA 54, 36, 36, 90, 16
DATA 36, 30, 33, 66, 8
DATA 0, 0, 0, 0, 8

DATA 80, 27, 27, 54, 8
DATA 60, 30, 30, 80, 8
DATA 50, 33, 33, 90, 4
DATA 44, 30, 30, 72, 4
DATA 40, 27, 27, 60, 9
DATA 48, 33, 33, 108, 16
DATA 40, 27, 27, 80, 8
DATA 0, 0, 0, 0, 8

DATA 90, 30, 30, 108, 8
DATA 72, 33, 33, 80, 8
DATA 54, 37, 37, 96, 4
DATA 72, 30, 30, 108, 4
DATA 80, 22, 22, 48, 8
DATA 72, 30, 30, 54, 8
DATA 0, 0, 0, 0, 30

OPTION BASE 1
DIM TwoPi AS DOUBLE
DIM pi AS DOUBLE

DIM Temp AS DOUBLE
DIM BeatsPerSecond AS DOUBLE
DIM Angle(4) AS DOUBLE
DIM Velocity(4) AS DOUBLE
DIM Acceleration(4) AS DOUBLE
DIM Phase(4) AS DOUBLE
DIM note(4) AS INTEGER
DIM LastNote(4) AS INTEGER
DIM length AS INTEGER
DIM Harmonics(4) AS SINGLE


DIM Samples AS LONG
DIM t AS LONG
DIM SampleRate AS LONG
DIM k AS INTEGER
DIM g AS INTEGER
DIM amp AS INTEGER
DIM basis AS INTEGER

DIM numharmonics AS INTEGER
DIM part(4) AS INTEGER
DIM Sign(4) AS INTEGER
DIM glide AS INTEGER
DIM GlideTrim AS LONG
DIM test AS STRING
DIM TerminalAngle(4) AS DOUBLE
DIM DropAngle(4) AS DOUBLE
DIM PhaseDir(4) AS DOUBLE

PRINT
test = "0"
' I frequently flip that.

numharmonics = 4


BeatsPerSecond = 15#
pi = 3.141592653589793#
TwoPi = pi * 2

SampleRate = 8000
FOR k = 1 TO numharmonics


LastNote(k) = 0
NEXT k

IF test = "0" THEN


OPEN "alfabet.bat" FOR OUTPUT AS #1

OPEN "\sox\alfabet1.raw" FOR OUTPUT AS #4
OPEN "\sox\alfabet2.raw" FOR OUTPUT AS #5
OPEN "\sox\alfabet3.raw" FOR OUTPUT AS #6


PRINT #1, "e:\progra~1\freebasic\fbc -lang qb d:\basic\alfabet.bas"
PRINT #1, "alfabet.exe"
PRINT #1, "cd \sox"

PRINT #1, "sox -c 2 -r"; SampleRate; " -sw alfabet1.raw alfabet1.wav
stat"
PRINT #1, "pause"
PRINT #1, "sox -c 1 -r"; SampleRate; " -sw alfabet2.raw alfabet2.wav
stat"
PRINT #1, "pause"
PRINT #1, "sox -c 2 -r"; SampleRate; " -sw alfabet3.raw alfabet3.wav

stat"
CLOSE #1, #2
END IF

FOR k = 1 TO numharmonics


READ part(k), Harmonics(k)
note(k) = 0
LastNote(k) = 0
NEXT k

' OPEN "alfabet.bas" FOR APPEND AS #2

glide = 30
100
FOR g = 1 TO 45
READ note(1), note(2), note(3), note(4), length
' PRINT #2, USING "DATA ##-,##-,##-,###-,##"; CINT(note(1));
CINT(note(2));

CINT(note(3)); CINT(note(4) * 2); length


' That is for feeding global changes back into this code.
' The trend for my hand calculations is to raise numbers,

' and with a little tweaking, lower numbers often work.
' IF g > 0 THEN
' SOUND note(2) * 4, length


' I tend to hear at 2:1 above that, unless they are pure sine waves.
' IF note(2) <> 0 THEN
' PRINT note(2) / note(1);
' END IF
' 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 LastNote(1) = 0 AND note(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
Samples = SampleRate * length / BeatsPerSecond /
glide

GlideTrim = Samples
GOSUB 300
Samples = SampleRate * length / BeatsPerSecond -
GlideTrim
FOR k = 1 TO numharmonics


LastNote(k) = note(k)
NEXT k
GOSUB 300
GOTO 75
END IF
END IF

75 NEXT g
CLOSE #4

END

' *Neat* Silencer -- finishes a wave like 275 starts one.

' When it reaches a peak or a trough, then it cuts amplitude in half
' and biases it by half.
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) = 1
DropAngle(k) = pi * 2.5
ELSEIF Angle(k) > pi / 2 THEN
TerminalAngle(k) = pi * 2.5
PhaseDir(k) = 0
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 1
IF Angle(k) >= DropAngle(k) THEN
Phase(k) = Phase(k) / 2 + .5
END IF
CASE 0
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


IF part(k) <> 0 THEN
Velocity(k) = TwoPi * LastNote(part(k)) * Harmonics(part(k))
/ SampleRate

Acceleration(k) = (TwoPi * note(part(k)) *
Harmonics(part(k)) / SampleRate

- Velocity(k)) / Samples


ELSE
Velocity(k) = TwoPi * note(k) * Harmonics(k) / SampleRate
Acceleration(k) = 0
END IF
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
' Calculate constants of change for write loop.

FOR k = 1 TO numharmonics


Velocity(k) = TwoPi * LastNote(part(k)) * Harmonics(k) / SampleRate
Acceleration(k) = (TwoPi * note(part(k)) * Harmonics(k) /
SampleRate - Velocity(k))

/ Samples
NEXT k

' Main write loop. Static Phases problem solved at 250.
FOR t = 1 TO Samples

FOR k = 1 TO numharmonics


Phase(k) = SIN(Angle(k))
NEXT k

GOSUB 400

FOR k = 1 TO numharmonics


Angle(k) = Angle(k) + Velocity(k)
Velocity(k) = Velocity(k) + Acceleration(k)
NEXT k
NEXT t
RETURN

400
' Write a sample.
' Stereo of all three parts.
amp = CINT(Phase(1) * -21600 + Phase(2) * -10800)


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

amp = CINT(Phase(3) * 10800 + Phase(4) * 21600)


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

' Mono of middle part.
amp = CINT(Phase(2) * 32700)
PRINT #5, CHR$(amp AND 255);
PRINT #5, CHR$((amp AND 65280) / 256);

' Stereo of parts one and four.
amp = CINT(Phase(1) * 32700)
PRINT #6, CHR$(amp AND 255);
PRINT #6, CHR$((amp AND 65280) / 256);
amp = CINT(Phase(4) * 32700)
PRINT #6, CHR$(amp AND 255);
PRINT #6, CHR$((amp AND 65280) / 256);
RETURN

' http://ecn.ab.ca/~brewhaha/


0 new messages