 		}
 }
 
+
+void blindsScene(bool changed) {
+		if (changed) {
+				TV.bitmap(BMP_X, BMP_Y, getRandomSymbol());
+				screenToBackBuffer();
+				TV.clear_screen();
+		}
+
+		for (int i = 0; i < HEIGHT; i++) {
+				for (int j = 0; j < WIDTH / 8; j++) {
+						backBuffer[i][j] += 1;
+				}
+		}
+
+		backBufferToScreen();
+
+		checkSceneEnded(10);
+}
+
+void fadeInScene(bool changed) {
+		if (changed) {
+				TV.bitmap(BMP_X, BMP_Y, getRandomSymbol());
+				screenToBackBuffer();
+				TV.clear_screen();
+		}
+
+		int x = random(WIDTH);
+		int y = random(HEIGHT);
+
+		if (backBufferGet(x, y)) {
+				TV.set_pixel(x, y, 1);
+		}
+
+		if (checkSceneEnded(20)) {
+				TV.delay(1000);
+		}
+}
+
 void loop() {
 		bool changed = false;
 		if (currentScene != lastScene) {

unsigned char steps[STEP_COUNT][4] = { 0 };
bool rewinding = false;
int stepIdx = 0;
char *shiftSymbol = NULL;
void symbolShiftScene(bool changed) {
		if (changed) {
				rewinding = false;
				stepIdx = 0;

				if (random(2) == 0) {
						shiftSymbol = getSignSymbol(random(SIGN_COUNT));
				} else {
						shiftSymbol = getPlanetSymbol(random(PLANET_COUNT));
				}

				TV.bitmap(BMP_X, BMP_Y, shiftSymbol);
				TV.delay(1000);

unsigned long startTime = 0;
bool sequentialMode = true;
unsigned int sceneCounter = 0;

unsigned char backBuffer[HEIGHT][WIDTH / 8] = { 0 };

unsigned char inline backBufferGet(int x, int y) {
		return (backBuffer[y][x / 8] >> (7 - (x % 8))) & 0x01;
}

void backBufferSet(int x, int y, unsigned char c) {
		if (c == 1) {
				backBuffer[y][x / 8] |= (0x01 << (7 - (x % 8)));
		} else {
				backBuffer[y][x / 8] &= ~(0x01 << (7 - (x % 8)));
		}
}

void screenToBackBuffer() {
		for (int i = 0; i < WIDTH; i++) {
				for (int j = 0; j < HEIGHT; j++) {
						backBufferSet(i, j, TV.get_pixel(i, j));
				}
		}
}

void backBufferToScreen() {
		for (int i = 0; i < WIDTH; i++) {
				for (int j = 0; j < HEIGHT; j++) {
						TV.set_pixel(i, j, backBufferGet(i, j));
				}
		}
}

const unsigned char* getPlanetSymbol(int i) {
		switch (i) {
