This creative coding work draws star-shaped blinking neon lights.
It was made with Processing programming language and Kdenlive video editor.

Thanks to nice music:
No Rocking in the Jazzhands Zone by Peter Gresser
2013/08/15
http://freemusicarchive.org/music/Peter_Gresser/Reimagine_The_Game/No_Rocking_in_the_Jazzhands_Zone

## Processing example code.

I tried to blink the lights with Gaussian distribution and Sigmoid function.

```// Star Lights
// Processing 3.2.1
// 2017.03.12
import processing.opengl.*;
import java.util.Random;

World wd;
Star[] st;
int sline = 16;  // line number of stars
int scolumn = 19; // column number of stars
int divline = 320;
int divcolumn = 280;
int snum = sline * scolumn;

void setup() {
size(1280, 720, OPENGL);
colorMode(HSB, 256, 100, 100, 100);
// blendMode(SCREEN);
// hint(DISABLE_DEPTH_TEST);
smooth();
frameRate(30);

wd = new World();
st = new Star[snum];

// noise for star rotation speed
float nl = random(10);
float nc = random(10);

// star objects
float w = 8; // stroke weight
for (int l = 0; l < sline; l++) {
for (int c = 0; c < scolumn; c++) {
st[l * scolumn + c] = new Star(
(c - scolumn / 2) * divcolumn,
-l * divline,
w,
map(noise(nl, nc), 0, 1, 0, 1.2)
);
nc += 0.08;
}
w = w * 0.9;
nl += 0.08;
}
}

void draw() {

wd.redraw();

for (int i = 0; i < snum; i++) {
if (frameCount % 100 == 0) {
float rand100 = random(1000);
if (rand100 < 15) {
st[i].damaged();
} else if (rand100 < 200) {
st[i].repaired();
}
}
st[i].onoff();
st[i].rolling();
st[i].drawlight();
}

wd.roll();

/*
filter( BLUR, 2 );

saveFrame("frames/####.png");
if (frameCount >= 631) {
exit();
}
*/

}

class World {
float r_X;
float r_Y;
float r_Z;

World() {
r_X = 0;
r_Y = 0;
r_Z = 0;
}

void redraw() {
background(0, 0, 5);
//  translate(width / 2, height / 2, 0);

lightFalloff(1.0, 0.01, 0.00003);
// I have no idea
ambientLight(0, 0, 100, -600, 400, -300);
ambientLight(0, 0, 100,  600, 400, -300);
ambientLight(0, 0, 100, -600, 400, -2000);
ambientLight(0, 0, 100,  600, 400, -2000);

//       camera(100, 200, 800,
//           60, 0, 0,
camera(-100 + r_X,     260 + r_Y, 300 - r_Z,
-30  - r_X / 3, 60  + r_Y, -r_Z,
0, 1, 0);
}

void roll() {
r_X += 0.15;
r_Y += 0.18;
r_Z += 0.20;
}

}

class Star {
int vertex_num;
Random obj_random;
float scolor, ssatur, sbright;
float on_easy, on_curve;
float sx, sz, sweight;
float sroll, slippy_sr, noise_sr;

Star(float x, float z, float w, float s) {
obj_random = new Random();
vertex_num = 10;
scolor = customnoise(35, 38, 3);
ssatur = customnoise(30, 38, 8);
sbright = 0.5;
if (random(100) < 6) {
damaged();
} else {
repaired();
}
sx = x;
sz = z;
sweight = w;
sroll = customnoise(5, 45, 40);
slippy_sr = s;
noise_sr = random(100);
}

void damaged() {
on_easy = random(0.5, 1.0);
on_curve = random(0.8, 1.2);
}

void repaired() {
on_easy = 0.2;
on_curve = 1.0;
}

void onoff() {
sbright = 100 * sigmoid(customnoise(sbright / 100, 1, 1), on_easy, on_curve);
}

void rolling() {
sroll += map(noise(noise_sr), 0, 1, -slippy_sr, slippy_sr);
noise_sr += 0.05;
}

void drawlight() {

// hanging wire
pushMatrix();
translate(sx, -vertex_radius * 5, sz - 2);
noStroke();
fill(
0,
0,
100,
100
);
popMatrix();

// star light
pushMatrix();
translate(sx, 0, sz);
noFill();
strokeWeight(sweight);
stroke(
scolor,
ssatur,
sbright * 0.8,
100
);
starcurve();
popMatrix();

}

void starcurve() {

float vertex_r = 0;

beginShape();
for (int i = 0; i <= vertex_num + 2; ++i) {
if (i%2 == 0) {
} else {
}
curveVertex(
);
}
endShape(CLOSE);
}

// normal distribution
float customnoise(float value, float limit, float divide) {
float seed = value;
float gauss = 0;
gauss = (float) obj_random.nextGaussian() * divide;
seed += gauss;

if (abs(seed) >= limit) {
seed = value * (limit - divide) / limit;
}

return seed;
}

// sigmoid function
float sigmoid(float x, float a, float b) {
float modx = a * (x - 1) + 1;
return (float)(1.0 / (1.0 + Math.exp(-modx * b)));
}

}

/*

This program is free software: you can redistribute it and/or modify