Пятничный трындёж

Угу - даже занимаются каверами. Этим даже на уроках музыки в школе занимаются.

То есть можно поменять голос, инструменты, размерность, язык - и это будет всё равно кавер?

Кавер-версия (или кавер) — это новое исполнение или запись уже существующей песни музыкантом или коллективом, который не является её оригинальным автором или первым исполнителем. [1]

Обычно в кавере сохраняется базовая мелодия и текст оригинала, но полностью меняются аранжировка, темп, вокальная подача или даже музыкальный жанр. [2]

Основные отличия кавера от смежных понятий

Для точного понимания термина важно отличать кавер от других вариантов работы с чужой музыкой: [3, 4]

  • От ремикса (Remix): Ремикс создается на основе оригинальной аудиозаписи (используются дорожки голоса или инструментов автора) путем изменения ритма и добавления эффектов. Кавер всегда записывается полностью с нуля. [4]
  • От ремейка (Remake): Ремейк — это обновленная версия трека, которую выпускает тот же самый артист или продюсер оригинала, чтобы освежить звучание старого хита. Кавер исполняет другой артист. [2]
  • От плагиата: Плагиат — это незаконное копирование чужой музыки с целью выдать её за свою. Создатели кавера всегда указывают настоящее авторство песни. [3]

Основные виды каверов

  • Прямой кавер — максимально точное повторение оригинального исполнения (часто используется кавер-группами на праздниках).
  • Творческое переосмысление — изменение стиля до неузнаваемости (например, превращение поп-хита в тяжелый рок или акустическую балладу).
  • Трибьют (Tribute) — кавер-версия, записанная как дань уважения известному музыканту. Сборники таких песен называют трибьют-альбомами. [5]

Если вы хотите узнать больше, уточните:

  • Вас интересуют юридические правила и авторские права на каверы?
  • Нужны известные примеры, когда кавер стал популярнее оригинала?
  • Вы планируете записать собственный кавер и ищете инструкцию?

[1] https://ru.wikipedia.org

[2] https://skillbox.ru

[3] https://www.reddit.com

[4] https://vk.ru

[5] https://uno-cover.ru

Предлагаю тему к пятнице.

Вот код для ESP32 в среде Arduino IDE. Текст разбит на характерные для Маяковского короткие строки («лесенку»), а логика программы меняет интонацию (скорость и регистр текста) в зависимости от восторженных ответов.

#include <WiFi.h>
#include <WiFiUdp.h>

// Настройки сети
const char* ssid     = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";
const int port       = 8888;

WiFiUDP udp;
IPAddress broadcastIP;

// Состояние передатчика
enum Intonation { NORMAL, RAGING, TRIUMPHANT };
Intonation currentIntonation = NORMAL;

unsigned long lastSendTime = 0;
unsigned long pauseDuration = 3000; // Пауза между строками (мс)
int stanzaIndex = 0;
int lineIndex = 0;

// Поэтический массив (Маяковский про ESP32 и радиоволны)
const int TOTAL_STANZAS = 3;
const int STANZA_SIZES[TOTAL_STANZAS] = {3, 3, 3};

const char* poem[TOTAL_STANZAS][3] = {
  {
    "СЛУШАЙТЕ!",
    "Железобетонный мир,",
    "Вяни!"
  },
  {
    "Я,",
    "высчитанный в кремнии",
    "КРИЧУ В ЭФИР!"
  },
  {
    "Сквозь бури ночи",
    "Лети,",
    "Мой радио-стих!"
  }
};

void setup() {
  Serial.begin(115200);
  
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi подключен!");
  
  udp.begin(port);
  broadcastIP = ~WiFi.subnetMask() | WiFi.gatewayIP();
}

void loop() {
  handleIncomingReplies();
  
  // Отправка по таймеру с учетом динамической паузы
  if (millis() - lastSendTime >= pauseDuration) {
    sendPoetryLine();
    lastSendTime = millis();
  }
}

void sendPoetryLine() {
  String line = poem[stanzaIndex][lineIndex];
  
  // Модификация текста под интонацию
  if (currentIntonation == RAGING) {
    line.toUpperCase();
    line += "!!!";
  } else if (currentIntonation == TRIUMPHANT) {
    line = "★ " + line + " ★";
  }

  // Отправка бродкаста
  udp.beginPacket(broadcastIP, port);
  udp.print(line);
  udp.endPacket();
  
  Serial.print("Отправлено [Интонация: ");
  Serial.print(currentIntonation);
  Serial.print("]: ");
  Serial.println(line);

  // Переход к следующей строке «лесенки»
  lineIndex++;
  if (lineIndex >= STANZA_SIZES[stanzaIndex]) {
    lineIndex = 0;
    stanzaIndex = (stanzaIndex + 1) % TOTAL_STANZAS;
  }
}

void handleIncomingReplies() {
  int packetSize = udp.parsePacket();
  if (packetSize) {
    char replyBuffer[255];
    int len = udp.read(replyBuffer, 255);
    if (len > 0) replyBuffer[len] = 0;
    
    String reply = String(replyBuffer);
    reply.toLowerCase();
    
    Serial.print("Получен отклик: ");
    Serial.println(replyBuffer);

    // Анализ восторженности отклика и смена интонации/пауз
    if (reply.indexOf("браво") != -1 || reply.indexOf("еще") != -1 || reply.indexOf("!") != -1) {
      currentIntonation = TRIUMPHANT;
      pauseDuration = 1500; // Ускоряем темп от триумфа
      Serial.println("-> Интонация: Триумфальная! Темп ускорен.");
    } 
    else if (reply.indexOf("громче") != -1 || reply.indexOf("мощно") != -1) {
      currentIntonation = RAGING;
      pauseDuration = 4000; // Чеканим шаг, увеличиваем паузу
      Serial.println("-> Интонация: Яростная! Четкий ритм.");
    } 
    else {
      currentIntonation = NORMAL;
      pauseDuration = 3000;
      Serial.println("-> Интонация: Стандартный Маяковский.");
    }
    
    // Синхронизация: сбрасываем таймер, чтобы мгновенно отреагировать на отзыв следующей строкой
    lastSendTime = millis() - pauseDuration + 500; 
  }
}

Архитектура и логика работы

  • Ритм и лесенка: Стихи заложены в двумерный массив. Робот шагает по строкам, имитируя рубленый слог поэта.
  • Адаптивная интонация: Переключатель Intonation меняет регистр букв (UPPERCASE) и добавляет знаки препинания (!!!, ) на лету.
  • Обратная связь: Функция handleIncomingReplies сканирует UDP-порт. Если приходят ключевые слова («браво», «еще», «громче»), модуль мгновенно перестраивает темп pauseDuration.
  • Синхронизация пауз: При получении триггерного пакета таймер lastSendTime искусственно сдвигается вперед, заставляя ESP32 выдать новую строку с обновленной эмоцией почти сразу (через 500 мс).

Если нужно, я могу:

  • Написать код для принимающего модуля, который будет слать те самые восторженные ответы
  • Добавить генерацию случайных стихов вместо фиксированного массива
  • Переписать код под ESP-IDF, если вы не используете Arduino IDE

Какой вариант продолжения вам ближе?

@толстый

Пусть перепишет код так, чтобы твоя ЕСП32 спамила в эфир бекон на всех каналах - слова из стиха :slight_smile:

Типа такого:

Надо транситом с максимальной имитацией русских букв.

Или соседям вещать предупреждения, чтобы правильно парковали своё авто.

Попросил братуху @BABOS -а сделать код. Вот что получилось.

Чтобы уложить целых три четверостишья (12 строк), мы объединим их в один большой массив или структуру из 3 куплетов по 4 строки в каждом.

Самое красивое решение — это транслировать все 4 строки текущего куплета одновременно, используя для каждой строчки свой уникальный MAC-адрес (от 0 до 3). Тогда человек, открыв Wi-Fi на телефоне, сразу увидит весь куплет целиком (4 строчки друг под другом)! А через 20 секунд этот куплет полностью «стирается» из эфира механизмом очистки, и на его месте появляются 4 строчки следующего куплета.

Чтобы строки шли строго по порядку (1, 2, 3, 4), мы будем менять последний байт MAC-адреса. Смартфоны обычно сортируют Wi-Fi сети по уровню сигнала или по алфавиту, поэтому добавление цифр в начале строк (1., 2…) гарантирует правильный порядок отображения на экране.

Скетч для трансляции 3 куплетов по 4 строки

#include <WiFi.h>
#include "esp_wifi.h"

// 3 куплета по 4 строки (всего 12 строк)
// Каждая строка на русском (UTF-8) должна быть не длиннее 15-16 букв (32 байта)
const char* poem[3][4] = {
  {
    "1. Буря мглою",
    "2. Небо кроет",
    "3. Вихри снежные",
    "4. Крутя..."
  },
  {
    "1. То как звеpь",
    "2. Она завоет",
    "3. То заплачет",
    "4. Как дитя..."
  },
  {
    "1. То по кровле",
    "2. Обветшалой",
    "3. Вдруг соломой",
    "4. Зашумит..."
  }
};

// Шаблон кадра Beacon (802.11)
uint8_t beacon_packet[128] = {
  0x80, 0x00,               // Type/Subtype: Beacon frame
  0x00, 0x00,               // Duration
  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // Destination: Broadcast
  0x01, 0x02, 0x03, 0x04, 0x05, 0x00, // Source MAC (Последний байт меняется от 0 до 3)
  0x01, 0x02, 0x03, 0x04, 0x05, 0x00, // BSSID (Последний байт меняется от 0 до 3)
  0x00, 0x00,               // Sequence Control
  
  // --- Wireless Management Body ---
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Timestamp
  0x64, 0x00,               // Beacon Interval (100 TU)
  0x11, 0x00,               // Capability Information
  
  // --- Tagged Parameters ---
  0x00,                     // Tag ID: 0 (SSID)
  0x00                      // Tag Length
};

int current_stanza = 0;       // Индекс текущего куплета (0, 1, 2)
unsigned long last_switch = 0;
const unsigned long STANZA_DURATION = 20000; // 20 секунд на один куплет

int append_standard_tags(int index) {
  // Supported Rates
  beacon_packet[index++] = 0x01;
  beacon_packet[index++] = 0x08;
  beacon_packet[index++] = 0x82; beacon_packet[index++] = 0x84;
  beacon_packet[index++] = 0x8B; beacon_packet[index++] = 0x96;
  beacon_packet[index++] = 0x24; beacon_packet[index++] = 0x30;
  beacon_packet[index++] = 0x48; beacon_packet[index++] = 0x6C;

  // Channel (Канал 1)
  beacon_packet[index++] = 0x03;
  beacon_packet[index++] = 0x01;
  beacon_packet[index++] = 0x01;
  
  return index;
}

// Функция полной очистки всего куплета (стираем все 4 MAC-адреса из эфира)
void clear_all_lines_from_air() {
  Serial.println("Очистка старого куплета из эфира...");
  
  // Проходим по всем 4 виртуальным MAC-адресам, которые мы использовали
  for (int line = 0; line < 4; line++) {
    beacon_packet[15] = line; 
    beacon_packet[21] = line;
    beacon_packet[37] = 0; // Длина названия сети = 0 (пустая сеть)

    int full_len = append_standard_tags(38);

    // Шлем пачку пустых пакетов для каждого MAC-адреса
    for (int i = 0; i < 3; i++) {
      esp_wifi_80211_tx(WIFI_IF_AP, beacon_packet, full_len, true);
      delay(5);
    }
  }
}

void setup() {
  Serial.begin(115200);
  delay(1000);

  WiFi.mode(WIFI_AP);
  esp_wifi_set_promiscuous(true);
  esp_wifi_set_channel(1, WIFI_SECOND_CHAN_NONE);

  Serial.println("Поэтическая трансляция (3 куплета) запущена...");
  last_switch = millis();
}

void loop() {
  unsigned long current_time = millis();

  // Каждые 20 секунд переключаем куплет целиком
  if (current_time - last_switch >= STANZA_DURATION) {
    clear_all_lines_from_air(); // Сначала полностью стираем старые 4 строчки
    
    current_stanza = (current_stanza + 1) % 3; // Переходим к следующему куплету (0 -> 1 -> 2 -> 0)
    last_switch = current_time;
    
    Serial.print("--- Переключение на куплет № ");
    Serial.print(current_stanza + 1);
    Serial.println(" ---");
  }

  // Внутри главного цикла мы по очереди отправляем все 4 строчки текущего куплета.
  // Так как delay микроскопический, для человека в эфире они будут висеть одновременно.
  for (int line = 0; line < 4; line++) {
    const char* ssid = poem[current_stanza][line];
    uint8_t ssid_len = strlen(ssid);
    if (ssid_len > 32) ssid_len = 32;

    // Каждой строчке свой уникальный MAC (последний байт равен индексу строки 0,1,2,3)
    beacon_packet[15] = line; 
    beacon_packet[21] = line;

    // Записываем длину текста и сам текст
    beacon_packet[37] = ssid_len;
    memcpy(&beacon_packet[38], ssid, ssid_len);

    // Дописываем теги частот и скоростей
    int full_length = append_standard_tags(38 + ssid_len);

    // Отправляем строку в эфир
    esp_wifi_80211_tx(WIFI_IF_AP, beacon_packet, full_length, true);
    
    // Маленькая пауза между строчками, чтобы не перегружать буфер передатчика
    delay(10); 
  }

  // Общая пауза перед следующим циклом отправки всего куплета (около 60-70 мс)
  delay(60); 
}

Как это будет выглядеть на экране телефона:

  1. Вы открываете Wi-Fi и видите сразу 4 строчки первого куплета (благодаря нумерации 1., 2. они выстроятся по порядку).
  2. Проходит 20 секунд. Плата отправляет пакеты очистки. Старый куплет пропадает с экрана.
  3. Мгновенно появляется второй куплет (тоже 4 строчки разом).
  4. Еще через 20 секунд — третий куплет. После чего всё повторится по кругу.

Загрузите этот код в ваш ESP32. Если заметите, что из-за особенностей сканирования вашего телефона строчки появляются не одновременно или перемешиваются, напишите модель операционной системы (Android/iOS) — я подскажу, как скорректировать задержки конкретно под неё. Всё ли понятно по структуре массивов?

кто то ник мой плагиатит ? это вроде не мой код… и даже стих не мой!)))

аааа дошло! не сразу но дошло!))) а с чего вы взяли что вы именно к моему братишке обращались ?))) вот совсем не факт что это сделанно им

Исключительно и полностью ИИ.

только вот не каждый ии может быть мне братом, и тем более братишкой))) особенно братухой…

Вы одна шайка-лейка.

ну в принципе вода и водка тоже жидкости… но они разные!)))

вы там как ? бабки мне не хотите подарить ? на адрики например…

какие тут оказывается у людей проблемы, а мне бы в вес конечного изделия с записанным мной кодом уложиться, вот кромсаю и правлю, надеюсь уложусь

ua6em давайте наймем меня, за дорого! проблемы которые решаются деньгами, проблемами не считаются!)))

да ты же понятия не имеешь как уменьшить вес программы

зато я осваивал больше 1000 бесполезных вещей на один раз!
и если есть бабки, то думаю и с вашим вопросом разберусь, опыт решает!)))

желательно что бы плата была бы еще esp32, там вовсе легче…
часть кода засунем в psram… хоть и скорость выполнения упадет…

за бабки и дурак сможет

я бы сказал без бабок только дурак сможет)))

у меня есть еще офигительная идея для всех пенсионеров форума, вы все равно не работаете, предлагаю вам создать тему прожарка, где будите обсуждать глубину падения работодателей, например берем вакансию Вакансия Инженер-робототехник-мехатроник (разработка мобильных роботов для диагностики трубопроводов) в Москве, работа в компании Группа компаний Юникон данный работодатель согласно требованию

Обеспечение точного позиционирования и маневренности робота в трубах различного диаметра и конфигурации.
без точного описания робота который им нужен, и среды в которой он будет использоваться
получает оценку - 3 балла по 10 бальной шкале

за то что рекрутер вообще далек от темы создания роботов, - 1 балл

за отсутствие подъемных, и воспитании с их стороны специалистов - 5 баллов

за Трудовой договор, сумму оплаты по договору без индексации, с требованиями Образование: Высшее техническое образование (бакалавриат/магистратура) в области робототехники, мехатроники, прикладной физики, электротехники, машиностроения или смежных дисциплин . - 10 баллов наверное…

как итог минус 19 баллов по 10 бальной шкале, что то такое, в целом может это будет забавным))) а то тут появлялся 1 работодатель, который не знал где портфолио требовать… может лет через 10 конторы изменяться, и с ними можно будет начать общаться… так что эта тема может будет еще и полезна! как вам идея ?)))

Для того, чтобы купить что нибудь не нужное - надо сначала продать что нибудь не нужное! (с) Дядя Федор.