Теперь в своём профиле там где квадратики вы можете не только писать УХЙ и прочие прелестные слова, но и писать музыку!
Для этого пока кушал супчик (вкусный между прочим) был написан генератор музыки на основе таблицы активности в профиле. Он извлекает зелёную составляющего цвета дня их таблицы и далее по правилам построения мелодии выполняет сборку в виде языка abc.
Таблица проходится с лева на право сверху вниз, тоесть по порядку дней. Сейчас начиная с февраля 2020 до января 2021 включительно.
Если в общих чертах то так
в зависимости от количества сообщений цвет блока имеет 4 градации + пустой блок итого 5 нот из 7 доступно, с понедельника по пятницу включительно каждый день вы выбираете какую ноту сыграть, нота зависит от цвета чем зеленее тем выше по нотам до ре ми фа со без ля си. В суботу вы играете ноту тональность которой определяет то какой тональности будут ноты на следующей неделе,суботняя нота проигрывается в текущей неделе, в воскресенье вы выбираете 1 из 4 типов того как мелодии будут проигрываться на следующей неделе, нота воскресенья также проигрывается в текущей неделе. Итого 5 дней вы нажимаете ноту в день и ещё 2 в субботу и воскресенье, две последние определяют стиль следующей. Нет сообщений стиль сбрасывается на начальный.
Я старался, но не особо подобрать переключение стилей.
Я старался, но не особо в остальном поэтому abc транслятор ругается, ну и пофиг.
Вам нужно:
- 1 установить
cutycapt
для взятия скрина профиля пользователя - 2 установить
abc2midi
для компиляции midi из abc языка - 3 установить gcc
- 4 иметь любую хрень которая умеет играть MIDI (gnome плеер например дефолтный)
- 5 Положить
sсript.sh
иololo.c
в один каталог
Запускать так:
./sсript.sh www.linux.org.ru/people/LINUX-ORG-RU/profile
энтер (с 37 секунды прям уххх)
Тоесть в параметры скрипта передать ссылку на профиль пользователя, честно скажу, музыканты из вас не оч.
В каталоге появится скрин профиля + abc файл + midi файл который можно прослушать.
sсript.sh
#!/usr/bin/env bash
cutycapt --url=$@ --out=lortomidi.tga --javasсript=on --delay=2000 &&
gcc ololo.c && ./a.out lortomidi.tga lortomidi.abc && abc2midi lortomidi.abc -o lortomidi.midi
В коде, мусор и лишнее, но мне лень убирать и править. Всё всем пока. Меня тут не было. И я тут вообще не причём. Оно само.
ololo.c
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
static const int h_bloks = 7;
static const int w_bloks = 6;
static const int blocksize = 10;
static const int num_months= 12;
static const int H = h_bloks;
static const int W = ((w_bloks * (blocksize)) * num_months) / (blocksize) + 1;
static const int num_blocks = H*W;
static struct coord
{ uint16_t x;
uint16_t y;
} * coord2k21 = {NULL};
static struct color
{ uint8_t r;
uint8_t g;
uint8_t b;
} * color2k21 = {NULL};
static struct coord image_size = {800,673};
static struct coord offset_coord = {13, 668};
static struct color color_false_day = {46,52,54};
static struct color color_empty_day = {65,65,65};
enum qlor {Q0,Q1,Q2,Q3,Q4};
/*5 green color gradation == 5 notes of 7*/
static char * abc_language_table[4][5] =
{/* TABLE0 TABLE1 TABLE2 TABLE3 */
[0][0] = "C", [1][0] = "C,", [2][0] = "c", [3][0] = "'c",
[0][1] = "D", [1][1] = "D,", [2][1] = "d", [3][1] = "'d",
[0][2] = "E", [1][2] = "E,", [2][2] = "e", [3][2] = "'e",
[0][3] = "F", [1][3] = "F,", [2][3] = "f", [3][3] = "'f",
[0][4] = "G", [1][4] = "G,", [2][4] = "g", [3][4] = "'g",
/*[0][5] = "A", [1][5] = "A,", [2][5] = "a", [3][5] = "'a",
[0][6] = "B", [1][6] = "B,", [2][6] = "b", [3][6] = "'b",*/
};
enum q_lor_gradation_table
{
COLOR_Q0 = 63, // C or TABLE 0
COLOR_Q1 = 109, // D or TABLE 1
COLOR_Q2 = 143, // E or TABLE 2
COLOR_Q3 = 176, // F or TABLE 3
COLOR_Q4 = 210, // G or TABLE 4
};
enum week_mode{MODER,MODE1,MODE2,MODE3,MODE4};
uint8_t get_table_from_green(uint8_t green)
{
switch(green)
{
case COLOR_Q1: return Q1; break;
case COLOR_Q2: return Q2; break;
case COLOR_Q3: return Q3; break;
case COLOR_Q4: return Q4; break;
}
return Q1;
};
uint8_t get_note_from_green(uint8_t green)
{
switch(green)
{
case COLOR_Q0: return Q0; break;
case COLOR_Q1: return Q1; break;
case COLOR_Q2: return Q2; break;
case COLOR_Q3: return Q3; break;
case COLOR_Q4: return Q4; break;
}
return Q0;
}
uint8_t get_week_mode_from_green(uint8_t green)
{
return get_table_from_green(green);
}
const char * get_note_from_table(uint8_t table, uint8_t note)
{
return abc_language_table[table][note];
}
enum days{Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday};
int generate_week(FILE * file, uint8_t curr_week_data[7],uint8_t pre_week_data[7])
{
uint8_t mode = get_week_mode_from_green(pre_week_data[Saturday]);
uint8_t table = get_table_from_green(pre_week_data[Sunday]);
switch(mode)
{
case MODER:
{
fprintf(file, "\"C\"%s %s %s %s %s %s %s\n",
get_note_from_table(table, get_note_from_green(curr_week_data[Monday ])),
get_note_from_table(table, get_note_from_green(curr_week_data[Tuesday ])),
get_note_from_table(table, get_note_from_green(curr_week_data[Wednesday])),
get_note_from_table(table, get_note_from_green(curr_week_data[Thursday ])),
get_note_from_table(table, get_note_from_green(curr_week_data[Friday ])),
get_note_from_table(table, get_note_from_green(curr_week_data[Saturday ])),
get_note_from_table(table, get_note_from_green(curr_week_data[Sunday ])));
}break;
case MODE1:
{
fprintf(file, "\"%s\" %s%s | \"%s\" %s%s \"%s\" | %s %s %s\n",
get_note_from_table(table, get_note_from_green(pre_week_data [Saturday])),
get_note_from_table(table, get_note_from_green(pre_week_data [Saturday])),
get_note_from_table(table, get_note_from_green(pre_week_data [Saturday])),
get_note_from_table(table, get_note_from_green(curr_week_data[Monday ])),
get_note_from_table(table, get_note_from_green(curr_week_data[Tuesday ])),
get_note_from_table(table, get_note_from_green(curr_week_data[Wednesday])),
get_note_from_table(table, get_note_from_green(curr_week_data[Thursday ])),
get_note_from_table(table, get_note_from_green(curr_week_data[Friday ])),
get_note_from_table(table, get_note_from_green(curr_week_data[Saturday ])),
get_note_from_table(table, get_note_from_green(curr_week_data[Sunday ])));
}break;
case MODE2:
{
fprintf(file, "\"%s\" [%s %s] | \"%s\"[%s %s] | \"%s\" [%s %s] %s\n",
get_note_from_table(table, get_note_from_green(pre_week_data [Saturday])),
get_note_from_table(table, get_note_from_green(pre_week_data [Saturday])),
get_note_from_table(table, get_note_from_green(pre_week_data [Saturday])),
get_note_from_table(table, get_note_from_green(curr_week_data[Monday ])),
get_note_from_table(table, get_note_from_green(curr_week_data[Tuesday ])),
get_note_from_table(table, get_note_from_green(curr_week_data[Wednesday])),
get_note_from_table(table, get_note_from_green(curr_week_data[Thursday ])),
get_note_from_table(table, get_note_from_green(curr_week_data[Friday ])),
get_note_from_table(table, get_note_from_green(curr_week_data[Saturday ])),
get_note_from_table(table, get_note_from_green(curr_week_data[Sunday ])));
}break;
case MODE3:
{
fprintf(file, "\"%s\" [%s %s %s] | \"%s\" [%s %s %s]| \"%s\" %s\n",
get_note_from_table(table, get_note_from_green(pre_week_data [Saturday])),
get_note_from_table(table, get_note_from_green(pre_week_data [Saturday])),
get_note_from_table(table, get_note_from_green(pre_week_data [Saturday])),
get_note_from_table(table, get_note_from_green(curr_week_data[Monday ])),
get_note_from_table(table, get_note_from_green(curr_week_data[Tuesday ])),
get_note_from_table(table, get_note_from_green(curr_week_data[Wednesday])),
get_note_from_table(table, get_note_from_green(curr_week_data[Thursday ])),
get_note_from_table(table, get_note_from_green(curr_week_data[Friday ])),
get_note_from_table(table, get_note_from_green(curr_week_data[Saturday ])),
get_note_from_table(table, get_note_from_green(curr_week_data[Sunday ])));
}break;
case MODE4:
{
fprintf(file, "\"%s\" %s | %s | %s | %s | \"%s\" %s %s %s\n",
get_note_from_table(table, get_note_from_green(pre_week_data [Saturday])),
get_note_from_table(table, get_note_from_green(pre_week_data [Saturday])),
get_note_from_table(table, get_note_from_green(curr_week_data[Monday ])),
get_note_from_table(table, get_note_from_green(curr_week_data[Tuesday ])),
get_note_from_table(table, get_note_from_green(curr_week_data[Wednesday])),
get_note_from_table(table, get_note_from_green(curr_week_data[Thursday ])),
get_note_from_table(table, get_note_from_green(curr_week_data[Friday ])),
get_note_from_table(table, get_note_from_green(curr_week_data[Saturday ])),
get_note_from_table(table, get_note_from_green(curr_week_data[Sunday ])));
}break;
default : return 42;
}
return 0;
}
int calculate_days_abc_midi(struct color * cl,const char * filename)
{
FILE * file = fopen(filename, "w"
if (file == NULL)
{
return 42;
}
fprintf(file,"X:46\nQ:2/8\nM:4/4\nL:1/4\nK:G\n"
uint8_t cur_day[7] = {0};
uint8_t pre_day[7] = {63,63,63,63,63,63,63};
for (uint16_t i=0,day = 0; i < num_blocks; i++)
{
if(cl[i].r == color_false_day.r &&
cl[i].g == color_false_day.g &&
cl[i].b == color_false_day.b )
{
continue;
}
if((day) > 6)
{
generate_week(file,cur_day,pre_day);
for (int i = 0; i < 7; ++i)
{
pre_day[i]=cur_day[i];
};
day=0;
}else{
cur_day[day++]=cl[i].g;
}
}
return 0;
}
static int calculate_days_coord(struct coord ** cr, const char * filename)
{
FILE * file = fopen(filename, "rb"
if (file == NULL)
{
return 42;
}
uint16_t height = 0;
fseek(file, 14, SEEK_SET);
fread(&height, sizeof(uint16_t), 1,file);
fclose(file);
if(height < image_size.y)
{
return 42;
}
cr[0] = malloc(sizeof(struct coord) * (num_blocks));
if(!cr[0])
{
return 42;
}
struct coord new_coord = {0,0};
struct coord new_offset_coord = {offset_coord.x,(height - offset_coord.y)};
for (uint16_t w = 0, c = 0; w < W; ++w)
{
new_coord.x = (blocksize * w) + new_offset_coord.x;
for (uint16_t h = 0; h < H; ++h)
{
new_coord .y = (blocksize * h) + new_offset_coord.y;
cr[0][c++] = new_coord;
}
}
return 0;
}
static int calculate_days_color(struct color ** cl,struct coord * cr,const char * filename)
{
FILE * file = fopen(filename, "rb"
if (file == NULL)
{
return 42;
}
uint16_t width = 0;
uint16_t height = 0;
uint8_t depth = 0;
fseek(file, 12, SEEK_SET);
fread(&width, sizeof(uint16_t),1, file);
fseek(file, 14, SEEK_SET);
fread(&height, sizeof(uint16_t), 1,file);
fseek(file, 16, SEEK_SET);
fread(&depth, sizeof(char),1, file);
if(height*width < image_size.x*image_size.y)
{
return 42;
}
int size = height * width * 4;
unsigned char* image = malloc(sizeof(unsigned char) * size);
fseek(file, 18, SEEK_SET);
fread(image, sizeof(unsigned char) * size, 1,file);
fclose(file);
if (depth != 32)
{
free(image);
return 42;
}
cl[0] = malloc(sizeof(struct color) * (num_blocks));
if(!cl[0])
{
free(image);
free(cl[0]);
return 42;
}
struct color new_color = {0,0,0};
uint16_t d = 0;
for (uint16_t i = 0; i < num_blocks; ++i)
{
new_color.r = image[cr[i].x * 4 + cr[i].y * width * 4 + 2];
new_color.g = image[cr[i].x * 4 + cr[i].y * width * 4 + 1];
new_color.b = image[cr[i].x * 4 + cr[i].y * width * 4 + 0];
cl[0][d++] = new_color;
};
free(image);
return 0;
}
int main(int argc, char *argv[])
{
enum arguments
{ img_in = 1,
abc_out = 2,
};
if(argc < 3)
{
return 42;
}
if(calculate_days_coord(&coord2k21,argv[img_in]) != 0)
{
return 42;
}
if(calculate_days_color(&color2k21,coord2k21,argv[img_in]) != 0)
{
free(coord2k21);
return 42;
}
if(calculate_days_abc_midi(color2k21,argv[abc_out]) != 0)
{
free(coord2k21);
free(color2k21);
return 42;
}
for (int i = 0; i < num_blocks; ++i)
{
printf("%d %d %d\n",coord2k21[i].x,coord2k21[i].y,i);
}
for (int i = 0; i < num_blocks; ++i)
{
printf("%d %d %d %d\n",color2k21[i].r,color2k21[i].g,color2k21[i].b,i);
}
free(coord2k21);
free(color2k21);
return 0;
}
```