diff --git a/oscope-of/src/ofApp.cpp b/oscope-of/src/ofApp.cpp index c605625..7b8bc5b 100644 --- a/oscope-of/src/ofApp.cpp +++ b/oscope-of/src/ofApp.cpp @@ -674,7 +674,11 @@ void ofApp::initDemos() { {"ROSACE", 20.0f, polSpe(), SS::Wavy3D, " K=5 PETALS POLAR ROSE EACH PETAL A KICK ", "H", BgKind::Rose3d}, - {"COMEDOWN", 25.0f, starsWave(), SS::Mirror, + {"ATARI", 18.0f, polSpe(), SS::Rainbow, + " *** ATARI 2600 *** PRINT FROM 1977 " + " THE FIRST PIXEL TRIPS WERE HERE ", "A", + BgKind::ImgAtari}, + {"COMEDOWN", 22.0f, starsWave(), SS::Mirror, " AND SOFTLY BACK TO EARTH " " THE 303 SLEEPS IN ITS CIRCUIT ", "J", BgKind::Caustics}, }}; @@ -694,7 +698,10 @@ void ofApp::initDemos() { " A NEVER ENDING TORUS " " GREETINGS TO ANDROMEDA AND CONSPIRACY ", "E", BgKind::TorusMesh}, - {"OPENING", 30.0f, all(), SS::Rainbow, + {"NEXT CUBE",30.0f, polSpe(), SS::Chrome, + " THE NEXT CUBE APPEARS OBJC SMALLTALK 1989 " + " THE OS THAT BIRTHED OS X ", "F", BgKind::ImgNeXT}, + {"OPENING", 25.0f, all(), SS::Rainbow, " THE TUNNEL OPENS UP EVERYTHING APPEARS " " PURE LIGHT BEYOND THE WALLS ", "F", BgKind::Tunnel}, }}; @@ -718,7 +725,14 @@ void ofApp::initDemos() { {"HOPF", 25.0f, polSpe(), SS::Wavy3D, " HOPF FIBRATION SPHERES INSIDE SPHERES " " HARMONIC DECOMPOSITION VISUAL ", "B", BgKind::Hopf}, - {"FULL", 25.0f, all(), SS::Rainbow, + {"LOTUS", 22.0f, polSpe(), SS::Cascade, + " LOTUS 1-2-3 THE FIRST KILLER APP " + " SPREADSHEET MEETS SPECTRUM ", "Q", BgKind::ImgLotus}, + {"SPHERE", 25.0f, polSpe(), SS::Wavy3D, + " THE SPECTRUM AS A SPHERE " + " EACH LONGITUDE A FREQUENCY EACH LATITUDE A TIME ", "Q", + BgKind::SphereWave}, + {"FULL", 22.0f, all(), SS::Rainbow, " EVERY BAND ALIVE NOW THE SPECTRUM IS COMPLETE " " FROM SUBSONIC TO ULTRASONIC ", "Q", BgKind::Voronoi}, }}; @@ -742,6 +756,9 @@ void ofApp::initDemos() { {"CRASH", 20.0f, all(), SS::Glitch, " KERNEL PANIC BUT THE BEAT GOES ON ", "Q", BgKind::PlasmaC64}, + {"OS/2 WARP", 20.0f, polSpe(), SS::Glitch, + " OS/2 WARP THE BLUE SCREEN OF DESPAIR " + " BUT THE WARP CONTINUES ", "Q", BgKind::ImgOS2}, {"REBOOT", 18.0f, polSpe(), SS::Cascade, " SYSTEM REINITIALIZING NEW REALITY LOADING ", "Q", BgKind::Vortex}, @@ -764,7 +781,10 @@ void ofApp::initDemos() { {"ENNEPER", 25.0f, polSpe(), SS::Mirror, " A MINIMAL SURFACE LEAST AREA POSSIBLE " " GREETINGS TO ASD AND CONSPIRACY ", "S", BgKind::Enneper}, - {"RETURN", 25.0f, starsWave(), SS::Mirror, + {"APPLE", 18.0f, polSpe(), SS::Mirror, + " THE APPLE RAINBOW 1977 - 1998 " + " SIX BANDS OF GENTLE NOSTALGIA ", "J", BgKind::ImgApple}, + {"RETURN", 22.0f, starsWave(), SS::Mirror, " AND BACK TO THE STARS REMEMBER THIS QUIET " " YOU WERE HERE YOU LISTENED ", "J", BgKind::Starfield}, }}; @@ -789,7 +809,10 @@ void ofApp::initDemos() { " BURN THIS PLACE DOWN 180 BPM ETERNAL FLAME " " GREETINGS TO HARDCODE TITAN ANARCHY ", "T", BgKind::Fire}, - {"AFTER", 25.0f, polSpe(), SS::Mirror, + {"WIN95", 18.0f, all(), SS::Glitch, + " WINDOWS 95 START.WAV BRIAN ENO 6 SECONDS " + " PLUG AND PRAY ", "Q", BgKind::ImgWin95}, + {"AFTER", 20.0f, polSpe(), SS::Mirror, " THE BEAT IS GONE THE WALLS STILL SHAKE " " YOUR HEART STILL THINKS IT IS RAVING ", "Q", BgKind::PlasmaFbm}, @@ -910,7 +933,10 @@ void ofApp::initDemos() { " THE FRACTAL HAS NO END " " GREETINGS TO INIGO QUILEZ AND KNIGHTY ", "L", BgKind::Kifs}, - {"COLLAPSE", 20.0f, polSpe(), SS::Mirror, + {"WIN 1.0", 18.0f, polSpe(), SS::Bouncy, + " WINDOWS 1.0 1985 LEAKED PIXELS BLOCK BY BLOCK " + " GEOMETRY BEFORE GUI ", "O", BgKind::ImgWin1}, + {"COLLAPSE", 18.0f, polSpe(), SS::Mirror, " AND THE FUNCTION RESETS BACK TO X = 0 Y = 0 ", "J", BgKind::Starfield}, }}; @@ -960,7 +986,10 @@ void ofApp::initDemos() { {"VAPOR ROAD", 25.0f, all(), SS::Mirror, " THE ROAD BECOMES MEMORY " " GHOSTS OF FUTURES PAST ", "R", BgKind::PlasmaFbm}, - {"HORIZON", 20.0f, starsWave(), SS::Mirror, + {"WIN 3.11", 18.0f, all(), SS::Glitch, + " WINDOWS 3.11 NT THE PRE-START-MENU AGE " + " PROGRAM MANAGER RULES ", "R", BgKind::ImgWin311}, + {"HORIZON", 18.0f, starsWave(), SS::Mirror, " AND THE ENGINE FADES INTO THE NIGHT " " UNTIL TOMORROW WE RIDE AGAIN ", "U", BgKind::Starfield}, @@ -985,7 +1014,13 @@ void ofApp::initDemos() { {"CASCADE", 25.0f, all(), SS::Wavy3D, " EUCLIDEAN SPACE COLLAPSES THE CUBES SCATTER ", "Q", BgKind::TunnelCubes}, - {"ZERO", 20.0f, polSpe(), SS::Mirror, + {"ZX", 20.0f, polSpe(), SS::Rainbow, + " SINCLAIR ZX SPECTRUM 7 ATTRIBUTES OF GLORY " + " UK SCENE FOREVER ", "Q", BgKind::ImgZX}, + {"IRIX", 20.0f, polSpe(), SS::Chrome, + " SGI IRIX WORKSTATION 9 SQUARES OF POWER " + " JURASSIC PARK MAGIC ", "V", BgKind::ImgIrix}, + {"ZERO", 18.0f, polSpe(), SS::Mirror, " BACK TO ORIGIN DIMENSION COLLAPSED ", "J", BgKind::Starfield}, }}; diff --git a/oscope-of/src/visualizers/SphereWaveVis.cpp b/oscope-of/src/visualizers/SphereWaveVis.cpp index a694cdb..1759a23 100644 --- a/oscope-of/src/visualizers/SphereWaveVis.cpp +++ b/oscope-of/src/visualizers/SphereWaveVis.cpp @@ -97,11 +97,12 @@ void SphereWaveVis::draw(int x, int y, int w, int h) { ofEnableDepthTest(); ofEnableLighting(); - // Camera orbite - const float orbitR = 7.0f; - const float orbitA = t_ * 0.25f; + // Camera orbite plus dramatique : varie le rayon avec kick, hauteur + // suit treble, angle accéléré par bpm. + const float orbitR = 7.0f - kick_ * 2.0f; + const float orbitA = t_ * (0.35f + bpm_ * 0.0008f); camera_.setPosition(std::cos(orbitA) * orbitR, - std::sin(t_ * 0.18f) * 2.0f, + std::sin(t_ * 0.27f) * (2.0f + treble_ * 2.0f), std::sin(orbitA) * orbitR); camera_.lookAt(ofVec3f(0, 0, 0)); light_.setPosition(std::sin(t_ * 0.7f) * 5.0f, @@ -110,7 +111,7 @@ void SphereWaveVis::draw(int x, int y, int w, int h) { light_.enable(); camera_.begin(ofRectangle(0, 0, w, h)); - // Couleur cycle hue + audio + // Sphère solide centrale — couleur cycle hue + audio ofColor col; col.setHsb(static_cast(std::fmod(t_ * 25.0f, 255.0f)), 180, @@ -118,17 +119,44 @@ void SphereWaveVis::draw(int x, int y, int w, int h) { material_.setDiffuseColor(col); material_.setSpecularColor(ofFloatColor(1.0f, 0.9f, 0.8f)); material_.setShininess(48.0f); - - // Solid pass ofSetColor(col); material_.begin(); sphere_.drawFaces(); material_.end(); - // Wireframe par-dessus - ofSetColor(255, 240, 200, 140); + // Wireframe par-dessus (intérieur) + ofSetColor(255, 240, 200, 180); sphere_.drawWireframe(); + // Sphère wireframe EXTÉRIEURE concentrique — scaled 1.4x avec rotation + // inversée pour un effet de coque tournante + ofPushMatrix(); + ofRotateRad(-t_ * 0.4f, 0, 1, 0); + ofRotateRad(t_ * 0.25f, 1, 0, 0); + ofScale(1.4f + bass_ * 0.2f); + ofSetColor(120, 220, 255, 80); + sphere_.drawWireframe(); + ofPopMatrix(); + + // Sphère wireframe INTÉRIEURE — scaled 0.6x pulsée par kick + ofPushMatrix(); + ofRotateRad(t_ * 0.6f, 0, 1, 0); + ofRotateRad(-t_ * 0.4f, 1, 0, 0); + ofScale(0.6f + kick_ * 0.3f); + ofSetColor(255, 100, 200, 200); + sphere_.drawWireframe(); + ofPopMatrix(); + + // Pôles : 2 sphères wireframe small en haut/bas pour repère + for (float py : {-3.5f, 3.5f}) { + ofPushMatrix(); + ofTranslate(0, py, 0); + ofScale(0.3f + treble_ * 0.2f); + ofSetColor(255, 220, 100, 140); + sphere_.drawWireframe(); + ofPopMatrix(); + } + camera_.end(); light_.disable(); ofDisableLighting();