Yahoo Groups archive

Casio CZ/ VZ/ FZ - Pro Series

Index last updated: 2026-04-28 22:42 UTC

Message

Re: [CZsynth] Re: Casio XW-P1 virtual analog

2012-01-25 by charlie 'chop' copp

good god!! jose ,

 this is a lifespans worth of material.. thanks

i remmeber c-sound for my atari ,, way back ,

i could be wrong but was the originator of c sound ,
 marc (something)?


i'm going to start browsing

here is small part of babbel head bohgohisty wave maker
in basic

[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
' Names come from (square brackets indicate synthesis):
' http://www.huygens-fokker.org/docs/intervals.html
' Left Channel, Right Channel, Length, Concert Ratio Name

DATA   0 ,  0 , 1, "Jerminal Rest"
DATA 270 ,160 , 6, "Pythagorean Major Sixth"
DATA 240 ,216 , 9, "Minor Second"
DATA 216 ,240 , 9, "Minor Second, tails in"
DATA   0 ,  0 , 3, "Rest"
DATA 180 ,250 , 6, "Classic Augmented Fourth"
DATA 240 ,270 , 6, "Major Second"
DATA 160 ,160 , 9, "Unison"
DATA 180 ,180 , 9, "Unison"
DATA   0 ,  0 , 6, "Rest"
DATA 135 ,270 ,12, "Octave"
DATA 160 ,160 ,12, "Unison"
DATA 216 ,216 ,12, "Unison"
DATA   0 ,  0 ,30, "Terminal Rest"

' The remainder of this message is public domain.

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 DOUBLE
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 Sign(2) AS INTEGER
DIM glide AS INTEGER
DIM GlideTrim AS LONG
DIM test AS STRING
DIM TerminalAngle(2) AS DOUBLE
DIM DropAngle(2) AS DOUBLE
DIM PhaseDir(2) AS DOUBLE
DIM rationame AS STRING

PRINT
test = "0"
' I frequently flip that.
NumHarmonics = 2
BeatsPerSecond = 12#
pi = 3.141592653589793#
TwoPi = pi * 2
SampleRate = 44100

IF test = "0" THEN
        OPEN "\sox\suumoh.raw" FOR OUTPUT AS #4
END IF

' This batch file will compile and view
' if nero waveedit and fbc are in your path.
OPEN "suumoh.bat" FOR OUTPUT AS #1
PRINT #1, "fbc -lang qb c:\basic\suumoh.bas"
PRINT #1, "suumoh.exe"
PRINT #1, "cd \sox"
PRINT #1, "sox -c 2 -r"; SampleRate; " -sw suumoh.raw suumoh.wav stat"
PRINT #1, "waveedit c:\sox\suumoh.wav"
CLOSE #1

' This maps 16 (tonic) to a 12-TET G.
harmonics(1) = (440 / 2 ^ (1 / 12) ^ 26) / 160
harmonics(2) = harmonics(1)
FOR k = 1 TO NumHarmonics
        note(k) = 0
        LastNote(k) = 0
NEXT k

OPEN "con" FOR APPEND AS #2

glide = 30
100
FOR g = 1 TO 14
        READ note(1), note(2), length, rationame
        PRINT #2, USING "DATA ###-,"; note(1);
        PRINT #2, USING "###-,##"; note(2); length;
        PRINT #2, ", "; rationame

' That is for feeding transpositions back into this code, although I
' am using a tuning that maps roughly to 12-TET, so I did not use it.
        IF g > 0 THEN
'                SOUND note(2) * harmonics(2), length * 4 / 3
        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
                        samples = samples / glide
                        GlideTrim = samples
                        GOSUB 300
                        samples = SampleRate * length / BeatsPerSecond
                        samples = samples - 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
        Velocity(k) = TwoPi * LastNote(k) * harmonics(k) / SampleRate
        Acceleration(k) = TwoPi * note(k) * harmonics(k) / SampleRate
        Acceleration(k) = (Acceleration(k) - 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
' Calculate constants of change for write loop.
FOR k = 1 TO NumHarmonics
        Velocity(k) = TwoPi * LastNote(k) * harmonics(k) / SampleRate
        Acceleration(k) = TwoPi * note(k) * harmonics(k) / SampleRate
        Acceleration(k) = (Acceleration(k) - 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) * 32000)
PRINT #4, CHR$(amp AND 255);
PRINT #4, CHR$((amp AND 65280) / 256);

amp = CINT(Phase(2) * 32000)
PRINT #4, CHR$(amp AND 255);
PRINT #4, CHR$((amp AND 65280) / 256);
RETURN
]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
charles


----- Original Message -----
From: "José Ángel Morente" <msxjam@...>
To: <CZsynth@yahoogroups.com>
Sent: Wednesday, January 25, 2012 9:55 AM
Subject: Re: [CZsynth] Re: Casio XW-P1 virtual analog


> On Wed, Jan 25, 2012 at 5:12 PM, charlie 'chop' copp <
> charles.copp@...> wrote:
>
> > **
> >
> >
> > thanks for codejose
> >
> > there are some doubts..
> >
> > like why does the for/next loop conrol variable 'i' also get deducted
from
> > the samplesize?
> >
>
> Variable 'i' simulates the time base...
>
>  samplesize is never defined
> > samplebuffer is not dimensioned
> >
>
> Yeah I know. It's only a draft to show the idea. It is not real code and
> shows only the main concept.
>
>
> >  any method to employ to make a saw ,pulse,square ,triangle
> >
> It is quite easy. To get a square wave just make a function like this:
>
> function squareWave (i,freq)
>    if sin(i*freq) > 0 then squareWave = 1
>       else
>          if sin(i*freq) = 0 then squareWave = 0
>              else
>              if sin(i*freq) <0 then squareWave = 1
> end function
>
> for a sawtooth wave you may use the MOD operator (the modulo or remainer
of
> a division of "i" by frequency, etc.
>
> > where do i find this code on c-sound ?
> > thanks in advance
> > charles
> >
> There exist lots of C-Sound resources on the net, thousands of examples,
> instruments, scores, etc.
> With C-Sound it is an easier task because it has built-in functions for
> oscillators, filters, FM, etc.
>
> Take a look at http://www.adp-gmbh.ch/csound/fm/index.html for some nice
> examples of FM instruments generated with CSound.
>
> Here is a good tutorial to get into Csound:
>
> http://www.csounds.com/tootsother/index.html
>
>
> Cheers.
>
> JaM
>
>
> [Non-text portions of this message have been removed]
>
>
>
> ------------------------------------
>
> Yahoo! Groups Links
>
>
>
>

Attachments

Move to quarantaine

This moves the raw source file on disk only. The archive index is not changed automatically, so you still need to run a manual refresh afterward.