Oculokinetic Nystagmus
Michael Bach has a great selection of optical illusions on his page here. They all have an explanation for how they trick the mind and eyes.
Some of the well known classic effects and a bunch I had not seen before.
Jason.
Anaglyph Mandelbulbs
After some fun and games with getting camera pan and tilt controls working, I managed to get some good looking anaglyph Mandebulbs and Juliabulbs rendered.

More sample images available in my Anaglyphs Set on flickr.
You need a pair of the red and blue glasses to see these. Red lens over the left eye.
Jason.
Video Feedback
Video feedback is an interesting phenomenon. Take a video camera and plug it into the TV so it shows what the video camera is filming. Then point the camera at the screen. You will then see repeating patterns that create some unique fractal like patterns. This also works with a webcam on the PC if you point the webcam at the screen area that shows what it is filming, but using a real video camera an TV gives much more interesting results.
Here are a few examples of real video feedback. Depending on the brand of camera and TV you will always get unique results.
I encourage everyone to try real Video Feedback if you have the equipment. In the past I have shown the process to anyone with a camera and the right cables to connect the camera to their TV, and they all have had a wow moment when seeing it for the first time.
If you are interested in trying it for real, here are a few tips;
1. Do it in a dark room or with minimal lighting. Trying it during daylight seems to cause a “white out” as there is too much background light that bleeds into the image and is amplified repeatedly.
2. Turn the camera upside down (ie 180 degress to the TV image it is filming) as this gives better patterns usually.
3. If your camera has effects for inverting the image, use it. Try all the various filters the camera provides. Adjust the contrast and brightness. Play with all the available controls. Also adjust the TV brightness and contrast.
4. Try slight camera rotations rather than big movements. A nice pattern can be killed with rapid movements of the camera. Same for zooming.
5. If the image dies out, flicking the room lights on and off momentarily can get it working again. Alternatively putting a lighter or candle flame between the camera and TV can get a dead display running again.
A few years back I got into trying to attempt to simulate Video Feedback in software. The results so far are promising. Here is a sample movie of the results.
For more info about the simulation techniques used, see my Video Feedback page.
Jason.
Mandelbulbs and Juliabulbs


Visions Of Chaos now supports raytracing Mandelbulbs and Juliabulbs.
See the Mandelbulb Gallery and Juliabulb Gallery for more sample images.
Here are a few sample animations of Mandelbulbs. Click the movies to watch in full HD.
Jason.
Quaternion Julia Sets
Quaternion Julia Sets are four dimensional fractals. The following 2D image is the result of ray tracing a 3D slice of a 4D fractal.

Thanks to this paper and Keenan Crane I was able to implement the distance estimation formulas and improved the results of ray tracing Quaternion Julia Set images dramatically.
Click here to see some nice high resolution sample results.
The newly improved rendering method is now available in the latest version of Visions Of Chaos.
Jason.
Searching for the true 3d Mandelbrot Set
This forum post has a lot of smart nerds (and I use that as the ultimate compliment) looking for a true 3D version of the Mandelbrot Set. See here for even more ongoing research related to the Mandelbulb and variations.
Some of the results so far are amazing. These sort of images have never been seen before by human eyes. Seeing these images evolve must be similar to the experience of the first people who saw the original 2D Mandelbrot images emerge.

The following page by Daniel White includes further information on the progress so far and many more excellent example pictures.
The Unravelling of the Real 3D Mandelbulb
Jason.
Wada Basins
Wada Basins are fractal patterns that emerge from repeated reflections between closely nested spheres. The simplest and most well known version is to use 4 spheres stacked into a pyramid shape (3 forming the base triangle supporting the 4th sitting on top of them). When you look into one of the gaps you get Wada Basin patterns.
This sort of setup is ideal for ray tracing. I recently started to code up a simple ray tracer and this is the initial result of simulating a Wada Basin setup. 4 reflective spheres colored red, green, blue and white with a single point light source.

Paul Bourke has more information and samples here.
Miqel.com also has some nice images of both real and raytraced Wada Basins here.
Next Christmas, grab 4 sphere shaped ornaments off the tree and make your own fractal patterns.
Jason.
3D Strange Attractors
After some experimenting, I came up with the following 5 new formulas for generating 3D strange attractors. They all use SIN and COS like Cliff Pickover did when he was creating strange attractors.
All of these formulas were found by trial and error of changing and trying new formulas. In the future it would be interesting to use a genetic/evolutionary system of randomizing formulas and trying to find interesting results automatically.
The x,y and z variables are intialized to 0. Newx, newy and newz are temporary variables to hold the new x,y and z values until the new point is calculated. The parameters in italics a to i are floating point values in the range of -1 to +1 that alter/control the resulting image.
These sample images contain up to one billion plotted points to smooth them out. Each pixel is an average of a super sampled 3×3 grid to help remove aliasing (this is similar to rendering the image at 9 times the size and then downsizing it in an image processing application). The first two samples of each formula are rendered using a z-buffer technique to give them a solid appearance. The third sample of each formula is rendered using an accumulation buffer that shades the pixels based on the number of times each pixel is hit which allows you to see the internal structure of the attractor.
Rampe1 Attractor
newx=z*sin(a*x)+cos(b*y)
newy=x*sin(c*y)+cos(d*z)
newz=y*sin(e*z)+cos(f*x)



Rampe2 Attractor
newx=z*sin(a*x)+arccos(b*y)
newy=x*sin(c*y)+arccos(d*z)
newz=y*sin(e*z)+arccos(f*x)



Rampe3 Attractor
newx=x*z*sin(a*x)-cos(b*y)
newy=y*x*sin(c*y)-cos(d*z)
newz=z*y*sin(e*z)-cos(f*x)



Rampe4 Attractor
newx=x*sin(a*x)+cos(b*y)
newy=y*sin(c*y)+cos(d*z)
newz=z*sin(e*z)+cos(f*x)



Rampe5 Attractor
newx=y*sin(a*x)+cos(b*y)+sin(c*z)
newy=z*sin(d*x)+cos(e*y)+sin(f*z)
newz=x*sin(g*x)+cos(h*y)+sin(i*z)



All of the above images were created using Visions Of Chaos.
Jason.
Web Camera Viewer

Web Camera Viewer has been updated. All of the dead cameras have been removed and it now supports the correct theme support under Windows XP, Vista and 7.
Supports creating time lapse movies and other features to easily manage hundreds of webcams.
Jason.
Controlling MIDI Output with Delphi
I found it difficult when I first started trying MIDI programming to get any decent documentation or a simple snippet of code to turn MIDI notes on and off. This Delphi source code allows you to control the Windows MIDI notes from within a Delphi application. Create a new unit _midi.pas and copy and paste the code contents below into it.
This allows single or multiple notes to be played. Using these simple commands (all based on the mmsystem.pas unit that talks to the windows MMSYSTEM.DLL) is how I handled all the MIDI in GBK.
Hopefully this helps anyone who is looking for a simple way to get MIDI support into their Delphi application.
{
Instructions:
1) Call OpenMidiOut before playing any notes
2) Call TurnOnMidiNote to start playing a note
This can be called multiple times for "simultaneous" notes
3) Add some sort of delay for the notes. ie sleep() etc
4) Call TurnOffMidiNote to stop playing all playing note(s)
5) When done, call CloseMidiOut to allow other apps to access the midi port
}
unit _midi;
interface
uses Windows,Messages,SysUtils,Classes,Graphics,Controls,
Forms,Dialogs,StdCtrls,mmsystem,registry;
function MidiAvailable:boolean;
procedure OpenMidiOut(ParentForm:TForm);
procedure TurnOnMidiNote(Note,Instrument,Volume,Channel,Panning:byte);
procedure TurnOffSingleMidiNote(Note,Channel:byte);
procedure TurnOffAllMidiNotes;
procedure CloseMidiOut;
var MidiOutDev:HMIDIOUT; //global handle to midi device
MidiOpen:boolean; //refer to this variable to see if a midi device is currently open
implementation
function MidiAvailable:boolean;
begin
If (midiOutGetNumDevs()=0) then MidiAvailable:=false
else MidiAvailable:=true;
end;
procedure OpenMidiOut(ParentForm:TForm);
begin
midiOutOpen(@MidiOutDev,MIDI_MAPPER,ParentForm.Handle,0,CALLBACK_WINDOW);
MidiOpen:=true;
end;
//note = 0-127 - see table at bottom for values
//inst = 0-127 - see table at bottom for values
//vol = 0-127
//chan = 0-15
//pan = 0-127 0=only left 63=both 127=only right
procedure TurnOnMidiNote(Note,Instrument,Volume,Channel,Panning:byte);
begin
//tell midi device which instrument or patch to use
midiOutShortMsg(MidiOutDev,MAKEWORD($C0 OR Channel,Instrument));
//panning
midiOutShortMsg(midioutdev,strtoint('$'+inttohex(panning,2)+'0AB'+inttohex(channel,1)));
//tell midi device what note to play
midiOutShortMsg(MidiOutDev,MAKELONG(MAKEWORD($90 or Channel,Note),MAKEWORD(Volume,0)));
end;
procedure TurnOffSingleMidiNote(Note,Channel:byte);
begin
//tell midi device what note to play
midiOutShortMsg(MidiOutDev,MAKELONG(MAKEWORD($80 or Channel,Note),MAKEWORD(0,0)));
end;
procedure TurnOffAllMidiNotes;
begin
{Reset the midi device}
midiOutReset(MidiOutDev);
end;
procedure CloseMidiOut;
begin
{Close the midi device so anyone else can use it.}
midiOutClose(MidiOutDev);
MidiOpen:=false;
end;
{
Oct# C C# D D# E F F# G G# A A# B
-1 0 1 2 3 4 5 6 7 8 9 10 11
0 12 13 14 15 16 17 18 19 20 21 22 23
1 24 25 26 27 28 29 30 31 32 33 34 35
2 36 37 38 39 40 41 42 43 44 45 46 47
3 48 49 50 51 52 53 54 55 56 57 58 59
4 60 61 62 63 64 65 66 67 68 69 70 71
5 72 73 74 75 76 77 78 79 80 81 82 83
6 84 85 86 87 88 89 90 91 92 93 94 95
7 96 97 98 99 100 101 102 103 104 105 106 107
8 108 109 110 111 112 113 114 115 116 117 118 119
9 120 121 122 123 124 125 126 127
}
{
Acoustic Grand Piano
Bright Acoustic Piano
Electric Grand Piano
Honky-tonk Piano
Electric Piano 1
Electric Piano 2
Harpsichord
Clavi
Celesta
Glockenspiel
Music Box
Vibraphone
Marimba
Xylophone
Tubular Bells
Dulcimer
Drawbar Organ
Percussive Organ
Rock Organ
Church Organ
Reed Organ
Accordion
Harmonica
Tango Accordion
Acoustic Guitar (nylon)
Acoustic Guitar (steel)
Electric Guitar (jazz)
Electric Guitar (clean)
Electric Guitar (muted)
Overdriven Guitar
Distortion Guitar
Guitar harmonics
Acoustic Bass
Electric Bass (finger)
Electric Bass (pick)
Fretless Bass
Slap Bass 1
Slap Bass 2
Synth Bass 1
Synth Bass 2
Violin
Viola
Cello
Contrabass
Tremolo Strings
Pizzicato Strings
Orchestral Harp
Timpani
String Ensemble 1
String Ensemble 2
SynthStrings 1
SynthStrings 2
Choir Aahs
Voice Oohs
Synth Voice
Orchestra Hit
Trumpet
Trombone
Tuba
Muted Trumpet
French Horn
Brass Section
SynthBrass 1
SynthBrass 2
Soprano Sax
Alto Sax
Tenor Sax
Baritone Sax
Oboe
English Horn
Bassoon
Clarinet
Piccolo
Flute
Recorder
Pan Flute
Blown Bottle
Shakuhachi
Whistle
Ocarina
Lead 1 (square)
Lead 2 (sawtooth)
Lead 3 (calliope)
Lead 4 (chiff)
Lead 5 (charang)
Lead 6 (voice)
Lead 7 (fifths)
Lead 8 (bass + lead)
Pad 1 (new age)
Pad 2 (warm)
Pad 3 (polysynth)
Pad 4 (choir)
Pad 5 (bowed)
Pad 6 (metallic)
Pad 7 (halo)
Pad 8 (sweep)
FX 1 (rain)
FX 2 (soundtrack)
FX 3 (crystal)
FX 4 (atmosphere)
FX 5 (brightness)
FX 6 (goblins)
FX 7 (echoes)
FX 8 (sci-fi)
Sitar
Banjo
Shamisen
Koto
Kalimba
Bag pipe
Fiddle
Shanai
Tinkle Bell
Agogo
Steel Drums
Woodblock
Taiko Drum
Melodic Tom
Synth Drum
Reverse Cymbal
Guitar Fret Noise
Breath Noise
Seashore
Bird Tweet
Telephone Ring
Helicopter
Applause
Gunshot
}
end.
I have been using Delphi for years for programming all the applications on Softology. I highly recommend it to anyone interested in programming. If they would only release a cheap/free entry level version for newcomers to play with.
Jason.
