Версия не триальная.
У тебя мысли путаются потому что ты уже весь ими (мыслями) в поглощении алкоголя, или просто не знаешь как с темы свалить?
не знаешь как с темы свалить?
Не. Просто вы (похоже) изначальную мысль потеряли.
Для доступа в публичные места лицензия не нужна. Поэтому привел лицензию на браузер, которым пользуюсь.
Вопросы есть?
Чё сразу такой то? Каждый имеет право просрать свою жизнь как ему хочется.
Почему? Скорее не люблю окна с рекламой.
Ну вот, а говоришь
Несостыковочка.
Почему. Все логично. Лицензия на браузер, чтобы посещать.
Не не не. Твои слова:
???
Или деда Мазая?
Таки слился.
Тогда анекдот: _vk.com/clip-228092100_456255444
Я вот всё время считал, что я плохо слышу. Во первых всегда свою переспрашиваю, соседей и тд. На днях был внук в гостях, сказал - «проверим». Включил генератор сигнал (как я понял) на планшете (даже не на самом планшете, а онлайн сайт какой-то). Чтобы не мешать всему семейству закрылись на кухне и взяли наушники (а наушники у меня китайские - honor). Так вот при 20кГц он сказал что что-то слышит, но тихо и не понятно (я ничего). При 17кГц - он сказал что отчетливо слышит писк (я как бы шум, возможно давление
). При 15кГц я тоже начал слышать писк (слабый).
Вопрсов четыре:
- Так ли хороши наушники?
- Действительно ли внук слышал те частоты что указаны ?
- Действительно ли в наушники выдавалась указанная частота?
- Получается, я слышу хорошо, просто другие не умеют говорит разборчиво?
У уха резонанс на частоте около 1кГц. Поэтому очень низкие частоты человек слышит костями, а высокие зарезает ухо. Верхний порог у людей разный. Вы бы включили на верхних динамик планшета и посмотрели на кошку, если таковая есть.
Я в детстве слышал трели летучих мышей. Сейчас не слышу
Сдается мне, частоты здесь не играют, иначе слуховые аппараты не помогали бы
Немой в публичном доме))
_vk.com/clip-224508715_456244992
Ну и «работа сми» ))
_vk.com/clip-225197892_456246551
а вы знаете что разные частоты могут изменить звучание ? вам вовсе может послышаться совершенно другое)))
так иногда вроде даже делают при записи треков, и говорят эти звуки не слышит человек, но его сознание воспринимает)))
#include <Arduino.h>
#include <driver/i2s.h>
// ============ НАСТРОЙКИ ПО УМОЛЧАНИЮ ============
#define DEFAULT_SAMPLE_RATE 96000
#define I2S_PORT I2S_NUM_0
// Пины I2S
#define I2S_BCLK 26
#define I2S_LRC 25
#define I2S_DOUT 33
// ============ ПОДКЛЮЧАЕМ ВСЕ ФАЙЛЫ ============
#include "sounddata.h" // hilo.wav
#include "sounddata2.h" // horner.wav
#include "sounddata3.h" // K1.wav
//#include "sounddata4.h" // K2.wav
//#include "sounddata5.h" // manual.wav
//#include "sounddata6.h" // phaser.wav
//#include "sounddata7.h" // wail.wav
//#include "sounddata8.h" // yelp.wav
// ============ ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ ============
int SAMPLE_RATE = DEFAULT_SAMPLE_RATE; // ТЕПЕРЬ ЭТО ПЕРЕМЕННАЯ!
// Структура трека
struct AudioTrack {
const char* name;
const char* rawData;
size_t rawSize;
int16_t* samples;
size_t numSamples;
bool converted;
};
// Массив ВСЕХ треков
AudioTrack tracks[] = {
{"hilo", data1, sizeof(data1), NULL, 0, false},
{"horner", data2, sizeof(data2), NULL, 0, false},
{"K1", data3, sizeof(data3), NULL, 0, false},
{"K2", data4, sizeof(data4), NULL, 0, false},
{"manual", data5, sizeof(data5), NULL, 0, false},
{"phaser", data6, sizeof(data6), NULL, 0, false},
{"wail", data7, sizeof(data7), NULL, 0, false},
{"yelp", data8, sizeof(data8), NULL, 0, false}
};
#define NUM_TRACKS (sizeof(tracks) / sizeof(tracks[0]))
// Состояние плеера
struct PlaybackState {
int16_t* currentData;
size_t currentPosition;
size_t totalSamples;
bool isPlaying;
int currentTrackIndex;
bool loop; // зацикливание текущего трека
} state;
// ============ ФУНКЦИЯ ВВОДА ЧАСТОТЫ ============
void inputSampleRate() {
Serial.println("\n=================================");
Serial.println(" ВЫБОР ЧАСТОТЫ ДИСКРЕТИЗАЦИИ");
Serial.println("=================================");
Serial.println("Доступные частоты:");
Serial.println(" 1 - 8000 Гц (телефонное качество)");
Serial.println(" 2 - 11025 Гц (низкое)");
Serial.println(" 3 - 16000 Гц (среднее)");
Serial.println(" 4 - 22050 Гц (ваши файлы)");
Serial.println(" 5 - 32000 Гц (хорошее)");
Serial.println(" 6 - 44100 Гц (CD качество)");
Serial.println(" 7 - 48000 Гц (DVD качество)");
Serial.println(" 8 - 96000 Гц (High-Res)");
Serial.println(" 0 - ввести вручную");
Serial.println(" Enter - оставить 96000 Гц");
Serial.print("\nВаш выбор: ");
// Ждем ввод
unsigned long timeout = millis() + 30000; // 30 секунд таймаут
while (!Serial.available() && millis() < timeout) {
delay(10);
}
if (!Serial.available()) {
Serial.println("\nТаймаут! Использую частоту по умолчанию.");
return;
}
String input = Serial.readStringUntil('\n');
input.trim();
if (input.length() == 0) {
Serial.println("96000 Гц (по умолчанию)");
return;
}
int choice = input.toInt();
switch(choice) {
case 1: SAMPLE_RATE = 8000; break;
case 2: SAMPLE_RATE = 11025; break;
case 3: SAMPLE_RATE = 16000; break;
case 4: SAMPLE_RATE = 22050; break;
case 5: SAMPLE_RATE = 32000; break;
case 6: SAMPLE_RATE = 44100; break;
case 7: SAMPLE_RATE = 48000; break;
case 8: SAMPLE_RATE = 96000; break;
case 0:
Serial.print("Введите частоту в Гц (1000-384000): ");
while (!Serial.available()) delay(10);
input = Serial.readStringUntil('\n');
input.trim();
SAMPLE_RATE = input.toInt();
if (SAMPLE_RATE < 1000) SAMPLE_RATE = 1000;
if (SAMPLE_RATE > 384000) SAMPLE_RATE = 384000;
break;
default:
Serial.println("Неверный выбор! Использую 96000 Гц");
SAMPLE_RATE = 96000;
}
Serial.printf("\nУстановлена частота: %d Гц\n", SAMPLE_RATE);
}
// ============ ИНИЦИАЛИЗАЦИЯ I2S ============
bool initI2S() {
Serial.printf("\nИнициализация I2S с частотой %d Гц...\n", SAMPLE_RATE);
static bool i2sInstalled = false;
if (i2sInstalled) {
i2s_stop(I2S_PORT);
i2s_driver_uninstall(I2S_PORT);
delay(100);
}
i2s_config_t i2s_config = {
.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX),
.sample_rate = SAMPLE_RATE,
.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
.channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
.communication_format = I2S_COMM_FORMAT_I2S,
.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
.dma_buf_count = 8,
.dma_buf_len = 128,
.use_apll = false,
.tx_desc_auto_clear = true,
.fixed_mclk = 0
};
i2s_pin_config_t pin_config = {
.bck_io_num = I2S_BCLK,
.ws_io_num = I2S_LRC,
.data_out_num = I2S_DOUT,
.data_in_num = I2S_PIN_NO_CHANGE
};
esp_err_t err = i2s_driver_install(I2S_PORT, &i2s_config, 0, NULL);
if (err != ESP_OK) {
Serial.printf("Ошибка установки I2S: %d\n", err);
return false;
}
err = i2s_set_pin(I2S_PORT, &pin_config);
if (err != ESP_OK) {
Serial.printf("Ошибка установки пинов: %d\n", err);
return false;
}
i2s_zero_dma_buffer(I2S_PORT);
i2sInstalled = true;
Serial.println("I2S готов!");
return true;
}
// ============ ПРЕОБРАЗОВАНИЕ ТРЕКА ============
bool convertTrack(int trackIndex) {
AudioTrack* track = &tracks[trackIndex];
if (track->converted) return true;
Serial.printf("Преобразование %s... ", track->name);
track->numSamples = track->rawSize / 2;
size_t dataSize = track->numSamples * 2;
// Пробуем PSRAM
if (psramFound()) {
track->samples = (int16_t*)ps_malloc(dataSize);
} else {
track->samples = (int16_t*)malloc(dataSize);
}
if (!track->samples) {
Serial.println("ОШИБКА ПАМЯТИ!");
return false;
}
// Копируем данные
memcpy(track->samples, track->rawData, track->rawSize);
track->converted = true;
Serial.printf("OK (%d сэмплов)\n", track->numSamples);
return true;
}
// ============ ПРЕОБРАЗОВАНИЕ ВСЕХ ТРЕКОВ ============
void convertAllTracks() {
Serial.println("\n=== ПРЕОБРАЗОВАНИЕ ТРЕКОВ ===");
for (int i = 0; i < NUM_TRACKS; i++) {
convertTrack(i);
delay(5);
}
// Итог
size_t total = 0;
for (int i = 0; i < NUM_TRACKS; i++) {
if (tracks[i].converted) {
total += tracks[i].rawSize;
}
}
Serial.printf("\nВсего памяти: %d байт (%.2f МБ)\n",
total, total / 1048576.0);
}
// ============ ВОСПРОИЗВЕДЕНИЕ ТРЕКА ============
void playTrack(int trackIndex, bool loop = true) {
if (trackIndex >= NUM_TRACKS || !tracks[trackIndex].converted) {
Serial.println("Ошибка: трек недоступен");
return;
}
AudioTrack* track = &tracks[trackIndex];
Serial.printf("\n▶ %s\n", track->name);
Serial.printf(" Частота: %d Гц\n", SAMPLE_RATE);
Serial.printf(" Сэмплов: %d\n", track->numSamples);
Serial.printf(" Длительность: %.2f сек\n",
(float)track->numSamples / SAMPLE_RATE);
state.currentData = track->samples;
state.totalSamples = track->numSamples;
state.currentPosition = 0;
state.currentTrackIndex = trackIndex;
state.loop = loop;
state.isPlaying = true;
}
// ============ КОМАНДЫ УПРАВЛЕНИЯ ============
void processCommands() {
if (!Serial.available()) return;
char cmd = Serial.read();
switch(cmd) {
case ' ': // Пробел - пауза/продолжить
state.isPlaying = !state.isPlaying;
Serial.println(state.isPlaying ? "▶ Продолжение" : "⏸ Пауза");
break;
case 'n': // n - следующий трек
case 'N':
{
int next = (state.currentTrackIndex + 1) % NUM_TRACKS;
Serial.printf("➡ Следующий: %s\n", tracks[next].name);
playTrack(next, true);
}
break;
case 'p': // p - предыдущий трек
case 'P':
{
int prev = state.currentTrackIndex - 1;
if (prev < 0) prev = NUM_TRACKS - 1;
Serial.printf("⬅ Предыдущий: %s\n", tracks[prev].name);
playTrack(prev, true);
}
break;
case '+': // + увеличить частоту
case '=':
SAMPLE_RATE += 1000;
if (SAMPLE_RATE > 192000) SAMPLE_RATE = 192000;
Serial.printf("Частота: %d Гц\n", SAMPLE_RATE);
initI2S(); // Переинициализация с новой частотой
break;
case '-': // - уменьшить частоту
case '_':
SAMPLE_RATE -= 1000;
if (SAMPLE_RATE < 8000) SAMPLE_RATE = 8000;
Serial.printf("Частота: %d Гц\n", SAMPLE_RATE);
initI2S();
break;
case 'r': // r - показать информацию
case 'R':
Serial.printf("\nТекущий трек: %s\n", tracks[state.currentTrackIndex].name);
Serial.printf("Частота: %d Гц\n", SAMPLE_RATE);
Serial.printf("Позиция: %d/%d (%.1f%%)\n",
state.currentPosition, state.totalSamples,
(float)state.currentPosition * 100 / state.totalSamples);
Serial.printf("Состояние: %s\n", state.isPlaying ? "ИГРАЕТ" : "ПАУЗА");
break;
case 'h': // h - помощь
case 'H':
case '?':
Serial.println("\n=== КОМАНДЫ ===");
Serial.println(" пробел - пауза/продолжить");
Serial.println(" n - следующий трек");
Serial.println(" p - предыдущий трек");
Serial.println(" + - увеличить частоту на 1 кГц");
Serial.println(" - - уменьшить частоту на 1 кГц");
Serial.println(" r - показать информацию");
Serial.println(" h - эта помощь");
break;
}
}
// ============ LOOP ============
void loop() {
static uint32_t lastDebug = millis();
processCommands();
if (!state.isPlaying) {
delay(10);
return;
}
// Отправка данных в I2S
const size_t blockSize = 256;
size_t samplesToSend = blockSize;
if (state.currentPosition + samplesToSend > state.totalSamples) {
if (state.loop) {
// Зацикливание
state.currentPosition = 0;
} else {
samplesToSend = state.totalSamples - state.currentPosition;
}
}
if (samplesToSend > 0) {
size_t bytesWritten;
i2s_write(I2S_PORT,
(uint8_t*)(state.currentData + state.currentPosition),
samplesToSend * 2,
&bytesWritten,
portMAX_DELAY);
state.currentPosition += samplesToSend;
}
// Если трек закончился и не зациклен, переключаем на следующий
if (!state.loop && state.currentPosition >= state.totalSamples) {
int next = (state.currentTrackIndex + 1) % NUM_TRACKS;
playTrack(next, true);
}
// Информация каждые 5 секунд
if (millis() - lastDebug > 5000) {
lastDebug = millis();
int percent = (state.currentPosition * 100) / state.totalSamples;
Serial.printf("%s: %d%% (%d Гц)\n",
tracks[state.currentTrackIndex].name,
percent, SAMPLE_RATE);
}
delay(1);
}
// ============ SETUP ============
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("\n========================================");
Serial.println(" I2S АУДИО ПЛЕЕР С РЕГУЛИРОВКОЙ");
Serial.println("========================================\n");
// Информация о системе
Serial.printf("Модель: %s\n", ESP.getChipModel());
Serial.printf("Свободно RAM: %d KB\n", ESP.getFreeHeap() / 1024);
if (psramFound()) {
Serial.printf("PSRAM: %d MB\n", ESP.getPsramSize() / 1048576);
}
// Выбор частоты
inputSampleRate();
// Преобразование треков
convertAllTracks();
// Инициализация I2S
initI2S();
// Инструкция
Serial.println("\n=== УПРАВЛЕНИЕ ===");
Serial.println("Нажмите 'h' для списка команд");
// Запуск первого трека
playTrack(0, true);
}
как пример можно взять звук из танков, есть пробитие… и поиграться с частотой, даже наверное через сайт онлайн…
Исправил, не благодари ![]()
там может герцы это скорость… в коде, и это максимум!))) https://zvukipro.com/games/2310-zvuki-iz-igry-world-of-tanks.html кому интересно может скачать файл есть пробитие, конвектировать в код и послушать… начните с 96000 и уменьшайте на 1к, и звук превратится в непонятно что))) я его слышу примерно как ‘‘если да‘
а вот это чекните, и скажите как эффект ?))) https://weekend.rambler.ru/read/47563356-kak-rabotaet-zvukovaya-illyuziya-kotoraya-udivila-vseh/
