VFS
2 поста
2 поста
23 поста
11 постов
7 постов
8 постов
Увидел у друга на руках часы LiLYGO - захотел такие.
У часов есть лора, вайфай, gps - но делать гаджет для умного дома было скучно и неинтересно. Из желаемого - превратить часы в ультра полезный тренажёр.
Очень хотелось в часы засунуть карточки японских кандзи уровней N5,4,3. Что я и сделал. А ещё мне показалось что тренажёр азбуки морзе будет очень полезен в часах.
Форкнулся с официального репозитория LilyGo T-Watch Ultra
Напомню железо под капотом: ESP32-S3, круглый AMOLED 466×466, тач CST92xx, вибромотор DRV2605, LoRa SX1262, SD-карта, датчик шагов BHI260AP.
Базовые прошивки в examples показывают как работать с датчиками. Всё что нужно - там присутствует. Ну почти всё.
Прошивка AsciiClock (examples/AsciiClock)
Свой форк LilyGo T-Watch Ultra я опубликовал на гитхабе.
Я создал свою прошивку методом копипаста, ии-манки-кода. В лучших традициях так сказать.
Экраны: один `.ino`, много экранов LVGL
Прошивка — ~4500 строк `AsciiClock.ino` плюс модуль `morse_mod.inc` Навигация построена на enum-экранах:
enum Screen : uint8_t {
SCREEN_HOME = 0,
SCREEN_SETTINGS = 1,
SCREEN_ALARM = 2,
SCREEN_ALARM_RING = 3,
SCREEN_REC = 4,
SCREEN_VOLUME = 5,
SCREEN_TOUCH_CAL = 6,
SCREEN_KANJI = 7,
SCREEN_MORSE = 8
};
Каждый экран — отдельный `lv_obj_t *`, создаётся в `setup()`, переключается через `show_screen()`. Отрисовка текста и графики — не стандартные виджеты LVGL, а **собственный рендер в canvas**: цифры часов заданы как 5×5 ASCII-матрицы, иероглифы и морзе-код рисуются поблочно в `lv_draw_buf_t`.
Главный цикл минималистичен — вся логика в poll-функциях:
void loop() {
instance.loop();
feed_gps();
poll_boot_button();
audio_poll();
rec_poll();
morse_poll(millis());
// ... alarm, clock update, lv_timer_handler()
}
`morse_poll()` вызывается **каждый кадр**, даже когда экран морзе скрыт — при уходе с экрана он сбрасывает вибрацию и настройки тача. В режиме включенных экранов CPU поднимается до высокой частоты (`set_cpu_high(true)`), на домашнем экране с погашенным дисплеем — понижается для экономии (40 мегагерц).
Что ещё внутри
Помимо тренажёров: будильник с WAV с SD. Очень тихий. Планирую заменить динамик чтобы орал. Пока тихо шепчет. Диктофон, калибровка громкости, подсчёт шагов, настройки GPS/NFC/LoRa/Wi-Fi. Аудио — свой PCM-плеер на Ultra AudioOutputI2S.cpp тянет legacy I2S-драйвер.
Морзе напевами: мнемоника + вибрация + тач-ключ
Напевы - простой способ выучить морзе: каждой букве соответствует запоминающаяся фраза, слоги которой совпадают с ритмом точек и тире. Данные на SD в `/morse.csv`:
Буквы и цифры,Словесное обозначение,Слоговое обозначение,Код Морзе
А,айда,ай-да,.-
Б,баки текут,ба-ки-те-кут,-...
М,мама,ма-ма,--
Структура в прошивке:
struct MorseGlyph {
char letter[8];
char latin[8];
char verbal[48]; // «айда»
char syllable[48]; // «ай-да»
char code[16]; // «.-»
};
Четыре режима (MorsePage):
| Режим | Что делает |
| Menu| выбор: буквы или слова |
| Tune Learn | показывает мнемонику, проигрывает код вибрацией |
|Tune Train** | пользователь вводит код удержанием пальца |
| Word Train | то же для слов из /words.csv |
Проигрывание и приём
Вибромотор DRV2605 работает в RTP-режиме (real-time playback). Конечный автомат `morse_play_poll()` чередует фазы MARK (вибрация) и GAP (пауза) с таймингами ITU:
static constexpr uint32_t MORSE_DOT_MS = 110; // ~60 знаков/мин
static constexpr uint32_t MORSE_DASH_MS = MORSE_DOT_MS * 3;
static constexpr uint32_t MORSE_CHAR_GAP_MS = MORSE_DOT_MS * 3;
static constexpr uint32_t MORSE_WORD_GAP_MS = MORSE_DOT_MS * 7;
static constexpr uint32_t MORSE_DOT_THRESH_MS = MORSE_DOT_MS * 2;
В режиме Train палец на экране = ключ. Длительность удержания классифицируется: `< 220 мс` — точка, `≥ 220 мс` — тире, `< 25 мс` — шум (игнор), `> 990 мс` — ошибка. При неверном знаке **весь шаблон сбрасывается** — так проще закрепить ритм целиком, а не отдельные элементы.
**1. Тач CST92xx «отпускает» палец.** Контроллер на один кадр (~16 мс) сбрасывает PRESSED, хотя палец на экране. Без обработки длинное тире превращается в две точки. Решение — debounce отпускания 40 мс и сохранение `morse_key_t0` при «ложном» re-press:
static constexpr uint32_t MORSE_RELEASE_DEBOUNCE_MS = 40;
// Continuation of the same hold (touch dropped a frame) — keep t0.
if (morse_key_down && morse_release_at) {
morse_release_at = 0;
morse_vibe_set(true);
return;
}
Конфликт с LVGL. Long-press и scroll тача мешают кодированию. На время Train long-press увеличивается до 2,5 с, scroll limit — до 255 (фактически отключён):
static void morse_indev_tune(bool train) {
if (train && !morse_indev_tuned) {
lv_indev_set_long_press_time(indev, MORSE_LONG_PRESS_MS); // 2500
lv_indev_set_scroll_limit(indev, 255);
morse_indev_tuned = true;
}
// ...
}
Инкрементальная отрисовка.
Каждый введённый знак перерисовывает только свою ячейку (morse_dirty_from), а не весь canvas. Рисовать весь экран долго и медленно.
Тренажёр кандзи: CSV-карточки и атлас глифов на SD
Данные
База — kanji-jlpt-n5-n4-n3.csv (~700 иероглифов уровней N5–N3). Строка содержит уровень, кандзи, онёми/кунёми чтения и три примера слов с переводом. CSV не парсится целиком в RAM — при первом открытии строится индекс смещений строк:
static bool kanji_index_csv() {
while (f.available() && kanji_rows < KANJI_MAX_ROWS) {
kanji_off[kanji_rows] = (uint32_t)f.position();
kanji_read_line(f, line, sizeof(line));
kanji_rows++;
}
}
Карточка подгружается по seek(kanji_off[idx]) — случайный выбор через esp_random.
Навигация свайпом
Восемь «страниц» карточки (`kanji_page` 0…7):
0: инфо (уровень, он/кун)
1–3: примеры слов
4: рисование иероглифа
5–7: рисование слов из карточки
Свайп влево — следующая страница, кнопка shuffle — новая случайная карточка. Позиция последней карточки сохраняется в `/kanji_last.bin`.
Формат kanji_glyphs.bin
Глифы не в прошивке. Python-скрипт gen_kanji_glyphs.py рендерит Noto Sans CJK и пишет бинарный атлас:
Заголовок (24 байта):
magic[8] = "KGLF002\0"
glyph_size = 32 // текстовые глифы
glyph_bytes = 128 // 32×32 1bpp
glyph_count = N
big_size = 96 // крупные кандзи для карточки
big_bpp = 2 // 4 уровня серого
big_bytes = 2304 // 96×96 2bpp
big_count = M
Далее:
uint16_t cps[N] // codepoints текстовых глифов
uint8_t bits[N × 128] // растровые данные
uint16_t big_cps[M]
uint8_t big_bits[M × 2304]
При открытии тренажёра весь файл (~1–2 МБ) загружается в PSRAM одним блоком. Поиск глифа — бинарный по отсортированному массиву codepoints:
uint8_t *blob = (uint8_t *)heap_caps_malloc(sz, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
if (memcmp(blob, "KGLF002", 7) != 0) { /* ошибка */ }
// ...
return kanji_find_in(kanji_cps, kanji_bits, kanji_glyph_count, KANJI_GLYPH_BYTES, cp);
В flash остаётся только `kanji_glyphs.h` — размеры и ASCII-иконка кнопки «漢字» 48×24.
Рисование иероглифов
На страницах 4–7 можно рисовать стилусом. Штрихи пишутся в отдельный ink-буфер (kanji_ink), затем накладываются на canvas с альфа-смешиванием. Линии интерполируются с шагом 0,45 px; перерисовывается только затронутый прямоугольник (lv_obj_invalidate_area). Кнопка Hint показывает эталонный глиф 96×96 поверх ink-слоя. На больших иероглифах точность приемлемая. На маленьких так себе.
UTF-8 парсится вручную (utf8_next), отрисовка посимвольная через собственный kanji_draw_text() — стандартные шрифты LVGL не покрывают CJK на нужном размере без мегабайтных font-файлов.
Калибровка тача: аффинное преобразование
Поскольку тренажёр кандзи содержит ещё экран для их рисования - возникла потребность калибровки тача.
CST92xx на Ultra даёт сырые координаты с заметным смещением и масштабированием. Калибровка — три креста по углам экрана (с отступом 36 px), коэффициенты аффинного преобразования вычисляются через определители 3×3:
// X' = a·rx + b·ry + c
// Y' = d·rx + e·ry + f
touch_cal_a = det3(X0, y0, 1, X1, y1, 1, X2, y2, 1) / D;
// ... остальные коэффициенты
Результат сохраняется на сд карте в /touch_cal.bin (magic `TCA1` + 6 float). Применяется глобально в обработчике тача до передачи координат в LVGL. Без калибровки рисование кандзи и ввод морзе на краях экрана неточны.
Экран калибровки открывается свайпом влево с экрана громкости.
Энергопотребление и периферия
Отложенная инициализация
SD, NFC, GPS и LoRa **не инициализируются при старте** — общая SPI-шина, крупные SD-карты могут зависнуть на `begin()`:
instance.begin(NO_HW_SD | NO_HW_NFC | NO_HW_GPS | NO_HW_LORA);
// ...
set_gps(false);
set_nfc(false);
set_lora(false);
Модули включаются вручную в настройках. При выходе из light sleep restore_peripherals_after_sleep() синхронизирует состояние питания с флагами.
Light sleep
Кнопка BOOT (GPIO0) гасит дисплей и уводит часы в light sleep. Пробуждение — только BOOT или PWR, не тач (иначе ложные пробуждения). Датчик шагов BHI260AP остаётся под питанием (ALDO4), шаги продолжают считаться.
LoRa: задел и планы
На домашнем экране — статус LORA (зачёркнут, если выключен). В настройках переключатель вызывает:
if (lora_on) {
instance.powerControl(POWER_RADIO, true);
instance.initLoRa();
} else {
radio.sleep();
instance.powerControl(POWER_RADIO, false);
}
Пока LoRa — инфраструктура без протокола. Логичное развитие:
1. Полу-дуплексный чат морзе между двумя часами без интернета.
2. Пакетизация — SX1262: payload до 255 байт, но для морзе достаточно передавать посимвольно с тайм-слотами.
3. Синхронизация пауз — приёмник должен знать MORSE_DOT_MS отправителя или согласовывать скорость в handshake.
Для обучения это даст «живую» практику — не только вибрацию на запястье, но и реальный радиоканал.
Как попробовать
1. Прошить `examples/AsciiClock/AsciiClock.ino` на T-Watch Ultra.
2. На SD-карту (корень) положить из репозитория:
- `morse.csv`, `words.csv`
- `kanji-jlpt-n5-n4-n3.csv`, `kanji_glyphs.bin` (сгенерировать: `python3 gen_kanji_glyphs.py`)
3. Откалибровать тач (громкость → свайп влево).
Исходники — в репозитории LilyGoLib, ветка с примером: `examples/AsciiClock`.
В статье частично осталась md разметка - прошу понять и простить.
Сайт не работает. Более информации о ней к сожалению нет.
*** Лишь стоит по прозрачности стекла
Серебряной ладонью провести…
Искусство так рождает зеркала,
– Чтоб каждый мог себя в них обрести.
Мы верим им и тянемся вперед…
Иллюзия скрывает тени зла,
И наш двойник кривит в усмешке рот…
У нас воруют души зеркала,
И так легко порезаться о край,
Об острый край, и остается боль,
И шепчут зеркала: “Не разбивай!…”
– В нас заменяя холодом любовь.
Мир отражений вязок и жесток,
Он рвется из застывшего стекла…
И страшно – вдруг еще придет их срок,
И завладеют нами зеркала,
И вырвется на волю легион
Фальшивых отраженных ими душ,
И мир наполнит звон… Стеклянный звон…
Кто победит?… Оркестр, сыграйте туш…
*** Ты строил в жизни замки из песка? Под флагами иллюзий и мечтаний, Когда казалось – цель совсем близка, И очень скоро гордый замок встанет, И протрубят фанфары, что пора, Пора войти и самому изведать… … Все это сказка… Ложь… Судьбы игра… И ты идешь по призрачному следу… И этот замок легок, словно дым, И лишь коснешься ты его рукою – Растает он, и сказка вместе с ним Уйдет, поиздевавшись надо мною… Но я упорно стены возвожу, Песок скрепляя клочьями надежды… Я знаю, что не сбыться миражу,
Лишь пустота мне подмигнет небрежно…
*** Сны приходят всегда неожиданно… Это – прошлое… пережившее… Тают образы беспечальные – Мимолетные и случайные, Как частички цветной мозаики… Составленьем ее мы заняты, Может – сможем, поймем – для прошлого –
собирая цветное крошево…
*** Мысли – нити разноцветные, Шелк распущен, запутан петлями, Утро темное – утро светлое… Не бывают все утра светлыми. Мысли – листья облетевшие, Покружились – упали, выцвели, И шуршат под шагами спешными, И летят за чужими лицами. Мысли – тонкие, стеклянные, Как осколки – до боли острые, И слова они шепчут странные, И подсказывают – как просто все. Мысли – камни темно-серые, Камнепад – и дорога спрятана, Серый цвет – это цвет неверия, Город он покрывает пятнами. Мысли – ночь. пустота. бессонница. Засыпают минуты быстрые. Все забудется. Все запомнится.
Все смешаю словами чистыми.
*** В мутном зеркала овале Я ловлю свое движенье В рамке треснутой поймали Нас с тобою отраженья И не вырваться, не скрыться, Мир прилип к холодной грани, И смеются наши лица На заплаканном экране. И за тенью зазеркальной Повторяем мы движенья Выпал случай уникальный
Нас поймали отраженья
*** Забытого солнца сегодня не будет. Ушло оно ночью, и время застыло. Светло – это слабость. Темно – это сила. Забытого солнца сегодня не будет. Меняется цвет – бесконечный на серый. Глаза привыкают – и разум привыкнет Идти в темноте, где никто не окликнет. Меняется цвет бесконечный на серый. И звездами капли стекают по крышам. Тоскливую музыку дождь не закончит. Она не нова – исполнитель неточен. И звездами капли стекают по крышам. Минутами ночь переступит – шагами, А мне – удержать бы ее до рассвета. Так тихо в спокойности серого цвета. Минутами ночь переступит – шагами. Слова я твои повторять не устану. Приносит их ночь, рассыпает по мыслям. Ловлю их как счастье, как солнце, как искры. Слова я твои повторять не устану. Не утром. Приносит оно расставанье. Толпа оживает – и время на ветер, На мелочь вопросов не видя ответов –
Не утром. Приносит оно расставанье.
*** Я решил: не могу я БЫТЬ… Я друзей соберу на днях, посидим и пойдем хоронить… А кого хоронить? – меня. Разучились мы пить и петь. Посидим, напьемся, споем… …И в глаза друг другу смотреть… Поглядим – и опять нальем. И послушаем наконец, Как хорош был на свете я, Ничего, я почти мертвец, – Не жалейте похвал, друзья. А когда уж станет темно, И из глаз вместо пьяных слез Потечет в избытке вино, – Мы возьмемся за дело всерьез. Под прозрачный бутылок звон На столе мы поставим гроб Для начала моих похорон – Чтобы я туда в черном лег. А потом отсчитает пульс, Сколько в крышку забьют гвоздей… Так и надо мне! Ну и пусть!
Я ведь сам пригласил ДРУЗЕЙ…
Почему мы уходим куда-то?
Почему? Мне так нужно понять…
Виноваты мы? Не виноваты?
Мы привыкли все время терять…
Без потерь наша жизнь непривычна
– В ощущениях нет остроты…
Боль – обычна, и смерть – обычна,
Все условия очень просты.
Мы привыкли терять любимых,
Обвиняя весь белый свет,
И потери бредут незримо,
Добавляясь к цепочке бед.
Мы теряем друзей и близких
– Забирает их время вдаль,
Дотлевают на сердце искры
– Догорающая печаль.
Мы теряем себя.. Не сразу
– Может, годы берут свое…
Сочиняя пустые фразы,
Беззаботно мы время пьем.
Но воздастся нам всем по вере,
И вопрос будет задан вслед:
Ты виновен в своих потерях? –
И придется давать ответ…
*** Меня не понимают города, Запутывая в улицах бездонных, И их пространством мне не обладать – Мне не постичь их странные законы… Меня не понимают облака – По-своему они калечат души: Их речь заманчива, но очень уж тиха, Их можно видеть, но нельзя послушать… Меня не понимают корабли, Вдаль уходя от моего причала, У ног моих в поднявшейся пылИ Оставив груз прохлады и печали… А люди? Что же думать мне о них? У них – заботы, сны и разговоры.. Лишь ночь со мной. И шепот звезд одних. И этот странный незнакомый город. Бессонница – не страх и не тоска, А просто – молчаливый собеседник. Вдвоем мы строим зАмки из песка И из клочков мечты моей последней. Я снова о тебе ей расскажу, Она мне снова грустно улыбнется И скажет: “Вновь ты веришь миражу…” И снова одиночество вернется, И не смогу я это изменить – По сути, все мы в чем-то одиноки… Бессонница мне скажет: “Надо жить..” –
Твои слова… И голос твой далекий…
*** Отражения, кривляясь, Вырываются на волю, Хладнокровно улыбаясь Или плача – но без боли… Зеркала следят за нами, Научившись даже слушать, Быть и мыслями, и снами, Искажая наши души. Тонут в зеркале желанья, Замедляются движенья… Нас отдали на закланье,
Нас поймали отраженья…
*** Почему мы уходим куда-то? Почему? Мне так нужно понять… Виноваты мы? Не виноваты? Мы привыкли все время терять… Без потерь наша жизнь непривычна – В ощущениях нет остроты… Боль – обычна, и смерть – обычна, Все условия очень просты. Мы привыкли терять любимых, Обвиняя весь белый свет, И потери бредут незримо, Добавляясь к цепочке бед. Мы теряем друзей и близких – Забирает их время вдаль, Дотлевают на сердце искры – Догорающая печаль. Мы теряем себя.. Не сразу – Может, годы берут свое… Сочиняя пустые фразы, Беззаботно мы время пьем. Но воздастся нам всем по вере, И вопрос будет задан вслед: Ты виновен в своих потерях? –
И придется давать ответ…
*** Послушай меня, случайный! Да, ты! Не мечись, как в клетке… Здесь звезды горят свечами, А я вот плачусь в жилетку.. Соленые слезы горя Смешались с дождем и снегом… Унижен, осмеян, болен, У звезд я ищу ночлега… Я брел от беды в тумане, Считал я все пьяным бредом И к другу пришел, изранен… И друг меня просто прЕдал… А ты не предашь, прохожий? – Ведь я от тебя не прячусь… Я верил, любил, и что же? – Теперь вот в жилетку плачусь… И может быть, ты ответишь, Где – истина, где – ошибка? – Зачем нам друзья на свете? –
Чтоб нас предавать с улыбкой?….
*** Новый мир мы придумали сами – Лишь мечтами, игрою и болью… Человек стопроцентно занят – Слишком занят, чтоб быть собою. Кто нас знает и кто нас любит? В паутине людского чувства Бьются крылья заблудших судеб, Не погибнуть там – вот искусство… Мы уже не изменим правил – Нашу жизнь создавало время, Нам условие мир поставил – Мы считаться должны со всеми, Кто в веках создавал и думал, Нам позируя в фас и в профиль – От египетских желтых мумий До создателей философий. Но нашелся – смешно и просто – Этот выход, быть может – ложный: Новый мир, а точнее – остров, НЕпростой, НЕ совсем возможный, НЕпокорный и НЕреальный – Отрицание – наше право! – Этот новый мир виртуальный – Наш наркотик.. беда… отрава… Говорят, что мы все там – в масках: Весельчак… Дон-Кихот… Зануда… Только – может, лишь смыло краски, Что в реале на всех повсюду? И бегут по экрану строчки, Забирая душИ частицы… Мы живем ни днем и ни ночью – Тут у времени нет границы, Тут теряется смысл пространства – Шар земной не такой огромный, И не кажется больше странным, Что мы, разные, все тут – дОма. Пусть нас кто-то ругает, судит, Пусть гадает – кем дальше станем… Может, в детство играют люди? В сны, в которых мы все летаем? В детстве было все так понятно – Тот – герой, тот – подлец ничтожный… Может, мы лишь хотим обратно – В мир, в котором творить возможно, Строить зАмки, тянуться к звездам, Жить во время, что было (будет)? Может, мир этот нами создан, Потому что мы просто люди? Мы идем… Мы уходим сами – В эту жизнь, что зовется сетью… Не рыдайте – “что будет с вами?” –
Мы когда-нибудь вам ответим…
*** Ночь укроет город тишиной как одеялом… Только что-то шепчет свет забытых фонарей. Улыбнется город странный и уснет устало, И не будет шума улиц, хлопанья дверей. Тихо – это значит пусто, мир как нарисован, Карандашный прочерк, акварельные следы, Уголь полустертый – был художник сонный, Рисовал он город только красками воды… И на той картине темной я добавлю строчку – Время остановится и молча подождет – Дождь рассыплет капли по дорогам ночью –
Напишу твое я имя на стекле дождем…
*** Отражение сна как загадка – Отгадаешь – шагнешь – не споткнешься… Улетит белой птицей тетрадка, Где написана правда о прошлом. Отражение сна как удача: Не поймаешь – не жди – не догонишь… Может, вечер напрасно потрачен, Потому что его ты не помнишь. Отражение сна – как разлука, Выцветает застиранным память… Тишина. Ни единого звука.
Тишина приглашает на танец.
*** Ты грустишь. Это дождь виновен. По стеклу оставляя след, Эти капли дают не новый, А знакомый уже ответ: Это, кажется, небо плачет – То ли в шутку, то ли всерьез… Это, кажется, просто значит,
Что кому-то не хватит слез.
*** Дождь все идет, идет, Очередная осень… Тает за годом год, Вдаль суету уносит.. С неба бежит вода, Тонут в воде рассветы.. Ты не придешь сюда – Я понимаю это… Небо свели с землей Тонкие нити-струны… Губы мои золОй Метит осколок лунный… Где ты сейчас живешь? – Капли ловлю в ладони.. Лишь бесконечный дождь Ветки деревьев клонит… Дождь все идет, звеня Тихо о край бокала… Выпей-ка за меня – Я тебя так искала… Дождь убежит домой, Каплями боль остудит… Встретимся мы с тобой..
Правда ведь – это будет?..
*** Ты грустишь – и мне тоже грустно… Я прошу тебя – не грусти… Это тоже души искусство – Сквозь пространство печаль навести.. Ты грустишь – я переживаю И смотрю на тебя в окно… Далеко ты – я это знаю, Ну и пусть… Я смотрю все равно… Ты грустишь… Это дождь виновен… По стеклу оставляя след, Эти капли дают не новый, А знакомый уже ответ: Это, кажется, небо плачет, Или в шутку, или всерьез, Это, кажется, просто значит, Что кому-то не хватит слез… Не грусти, я прошу, не надо… За окном все еще темно… Этот дождь – он со мною рядом, Он устало стучит в окно, Но все тише и тише, тише Льется эта вода с небес… С убегающим небом – слышишь? –
Свой привет я пришлю тебе…
*** И именно завтра забудется лето – С осенним дождем утекут его краски, Все меньше останется летнего цвета, Все больше от жизни – и меньше от сказки… И утром уже не останется зноя, Который к полудню дрожит над домами, Все меньше тепла и дневного покоя, И облачность ниже, и меньше мы сами. И звезды несчитаны будут под вечер. Уходят улыбки, и лица все строже. Нас ветер растреплет и дождь не излечит.
Все меньше поэзии – падаем в прозу…
*** Пыльный город, забытый свет – И асфальт хранит не твои следы… Я ищу тебя – а тебя тут нет… В этом городе солнца нет воды… Ты придешь с дождем – надо ждать. Я смотрю в окно и молчу, молчу… И ладонью к стеклу – прижать Убегающий призрачный дождь хочу. Листья выбелит солнца дым. Нарисованы мелом чужие сны. За лучом я тоскливо слежу прямым – Он стирает линии со стены. Пыльный город, мой тяжкий крест. Вкус лимона – как горечь сна. Среди тысячи тысяч дождливых мест В пыльном городе этом сижу одна. Не придуман еще вопрос – А ответов все больше дает толпа. Это место скоро уйдет под снос.
Все впустую. Надежда всегда глупа.
*** По сонному городу снова текут ручьи, По сонному городу снова идут дожди… И эха не будет, поэтому промолчи, Меня не зови, я прошу тебя лишь – дождись… Здесь не зазвенит разбитое стекло, Здесь не прозвучит веселый детский смех… Ну что ж – нам с тобою вот так не повезло, И город ловушкой служит не для всех. Стеклянные люди заснут унылым сном, И дождь до прозрачности зальет дома… Найдешь – не найдешь ты нужный сонный дом, Где от тишины я давно схожу с ума?… Тут шорох воды как шепот тысяч губ, Они говорят мне: “Тишшше…тишшше…тишь… ” И я их не слушать больше не могу, Ты опоздаешь, если не поспешишь… И время тут вязкое, чтобы задержать, И дождь все поет единственный куплет, Стеклянные тени по городу кружАт – Тебя приглашают в танец на стекле… История эта стара, как наша жизнь, Кого-то в ловушку поймает снова дождь…. И город нашептывать будет: “Откажись!” –
И я вдруг пойму, что ты уже не придешь…
Отражения, кривляясь, Вырываются на волю, Хладнокровно улыбаясь Или плача, но без боли. Зеркала следят за нами, Научившись даже слушать, Быть и мыслями и снами, Искажая наши души. Тонут в зеркале желанья, Замедляются движенья, Нас отдали на закланье –
Нас поймали отраженья.
Отражения повсюду, Зеркала нас убивают. Вокруг нас уже не люди – Это тени их гуляют. И потеряна реальность, В зеркалах мы утонули. Сделав домом виртуальность,
Мы себя же обманули.
Я хотел найти бы выход – С глубины подъем на волю, Отражения разрушить, Зеркала разбить рукою, И, застыв в оцепененьи, В проводах под напряженьем Мы лишь только отраженья,
Отраженья, отраженья…