#include <Adafruit_ILI9341.h>

#define TFT_CS   9
#define TFT_DC   10
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);

#define WIDTH 320
#define HEIGHT 240

uint8_t sinus[1024];

void setup(void) {
  tft.begin();
  tft.setRotation(1);
  for (int i = 0; i < 1024; i++)
    sinus[i] = 127.5f + 127.5f * sinf(i * 2.f * 3.1415927f / 1024.f);
}

void loop() {
  uint16_t line_buffer[WIDTH];
  uint16_t scale[6], accu[6];
  for (byte i = 0; i < 6; i++) {
    scale[i] = rand() >> 6;
    if (rand() < RAND_MAX / 2)
      scale[i] = -scale[i];
    accu[i] = rand();
  }

  for (uint16_t y = 0; y < HEIGHT; y++) {
    for (byte i = 0; i < 3; i++) {
      accu[i] += scale[i];
      accu[i+3] = accu[i];
    }
    uint16_t *line = line_buffer;

    for (uint16_t x = 0; x < WIDTH; x++) {
      for (byte i = 3; i < 6; i++)
        accu[i] += scale[i];
      uint8_t r, g, b;
      r = sinus[((accu[3] + 20 * sinus[((accu[0] + x * 3 - y * 5) >> 4) % 1024]) >> 6) % 1024] >> 3;
      g = sinus[((accu[4] + 24 * sinus[((accu[1] - x * 6 + y * 7) >> 4) % 1024]) >> 6) % 1024] >> 2;
      b = sinus[((accu[5] + 18 * sinus[((accu[2] + x * 7 - y * 3) >> 4) % 1024]) >> 6) % 1024] >> 3;
      uint16_t rgb565 = b | (g << 5) | (r << 11);
      *line++ = rgb565;
    }
    tft.drawRGBBitmap(0, y, line_buffer, WIDTH, 1);
  }
}