Все Тут Online
Все Тут Online
Новые сообщения
Все сообщения за последних 24 часа
Все сообщения за последнюю неделю
Расширенный Поиск

   
Меню сайта:
Главная
Форум
Чат
- Online приложения:
- Игры
- Выбор стиля:
- FAQ
- Для начинающих

Вернуться   Все Тут Online > Оцифровки ВИНИЛА пользователей нашего форума > В гостях у Вячеслава (ник bobrovich) > Раздел собственных оцифровок с винила (выполненные фонокорректором Prophetmaster Audio)
 
 
Опции темы Опции просмотра
Старый 14.09.2025, 20:40   #9
Дмитрий
Администратор
 
Аватар для Дмитрий
 
Турниров выиграно: 1

Регистрация: 12.12.2008
Адрес: Москва прошлого тысячелетия.
Сообщений: 209,922
Сказал(а) спасибо: 45,583
Поблагодарили 272,378 раз(а) в 102,870 сообщениях
Дмитрий репутация неоспоримаДмитрий репутация неоспоримаДмитрий репутация неоспоримаДмитрий репутация неоспоримаДмитрий репутация неоспоримаДмитрий репутация неоспоримаДмитрий репутация неоспоримаДмитрий репутация неоспоримаДмитрий репутация неоспоримаДмитрий репутация неоспоримаДмитрий репутация неоспорима
По умолчанию

Подход с автоматизацией Python...

Шаблон CUE: Формирует структурированный текст, проверяя синтаксис (на основе стандарта CUE Sheet).

Данные: Использует наши тайминги (11:40:00, 03:42:00) и метаданные (композиторы, жанр). Если данных нет, может парсить из Discogs/MusicBrainz через API.

Для автоматизации таймингов используется librosa для поиска пауз (тишина ниже 30 дБ), что устраняет ручную разметку.

Доработанный скрипт (анализирует паузы, парсит метаданные из Discogs):

Код:
import librosa
import os
import discogs_client

def create_cue(side1_wav, side2_wav, output_cue):
    # Discogs API для метаданных
    try:
        d = discogs_client.Client('MyApp/1.0', user_token='YOUR_DISCOGS_TOKEN')  # Замените на ваш токен
        release = d.release(249504)  # Zoolook ID
        metadata = {
            "genre": release.genres[0] if release.genres else "Electronic",
            "date": release.year,
            "comment": "ОЦИФРОВКА 20.08.25, Polydor-POLH 15, UK",
            "composer": "Denis Vanzetto, Pierre Mourey, Jean-Michel Jarre",
            "performer": release.artists[0].name,
            "title": release.title
        }
    except:
        metadata = {
            "genre": "Electronic",
            "date": "1984",
            "comment": "ОЦИФРОВКА 20.08.25, Polydor-POLH 15, UK",
            "composer": "Denis Vanzetto, Pierre Mourey, Jean-Michel Jarre",
            "performer": "Jean-Michel Jarre",
            "title": "Zoolook"
        }

    # Анализ пауз
    def get_timings(wav_file, track_count):
        y, sr = librosa.load(wav_file)
        silences = librosa.effects.split(y, top_db=30)  # Порог тишины 30 дБ
        timings = [0] + [start / sr for start, _ in silences[:track_count-1]]  # Начало треков
        return timings

    # Треки
    track_list_side1 = [("Ethnicolor", None), ("Diva", None)]
    track_list_side2 = [("Zoolook", None), ("Wooloomooloo", None), ("Zoolookologie", None),
                        ("Blah-Blah-Cafe", None), ("Ethnicolor II", None)]

    # Автозаполнение таймингов
    timings_side1 = get_timings(side1_wav, len(track_list_side1))
    timings_side2 = get_timings(side2_wav, len(track_list_side2))
    track_list_side1 = [(title, time) for (title, _), time in zip(track_list_side1, timings_side1)]
    track_list_side2 = [(title, time) for (title, _), time in zip(track_list_side2, timings_side2)]

    with open(output_cue, 'w', encoding='utf-8') as f:
        f.write(f'REM GENRE {metadata["genre"]}\n')
        f.write(f'REM DATE {metadata["date"]}\n')
        f.write(f'REM COMMENT "{metadata["comment"]}"\n')
        f.write(f'REM COMPOSER "{metadata["composer"]}"\n')
        f.write(f'PERFORMER "{metadata["performer"]}"\n')
        f.write(f'TITLE "{metadata["title"]}"\n')

        f.write(f'FILE "{os.path.basename(side1_wav)}" WAVE\n')
        for i, (title, time) in enumerate(track_list_side1, 1):
            mm = int(time // 60)
            ss = int(time % 60)
            f.write(f'  TRACK {i:02d} AUDIO\n')
            f.write(f'    TITLE "{title}"\n')
            f.write(f'    PERFORMER "{metadata["performer"]}"\n')
            if i > 1:
                gap_time = time - 2
                gap_mm = int(gap_time // 60)
                gap_ss = int(gap_time % 60)
                f.write(f'    INDEX 00 {gap_mm:02d}:{gap_ss:02d}:00\n')
            f.write(f'    INDEX 01 {mm:02d}:{ss:02d}:00\n')

        f.write(f'FILE "{os.path.basename(side2_wav)}" WAVE\n')
        for i, (title, time) in enumerate(track_list_side2, len(track_list_side1) + 1):
            mm = int(time // 60)
            ss = int(time % 60)
            f.write(f'  TRACK {i:02d} AUDIO\n')
            f.write(f'    TITLE "{title}"\n')
            f.write(f'    PERFORMER "{metadata["performer"]}"\n')
            if i > len(track_list_side1) + 1:
                gap_time = time - 2
                gap_mm = int(gap_time // 60)
                gap_ss = int(gap_time % 60)
                f.write(f'    INDEX 00 {gap_mm:02d}:{gap_ss:02d}:00\n')
            f.write(f'    INDEX 01 {mm:02d}:{ss:02d}:00\n')

# Вызов
create_cue("1 СТОРОНА.wav", "2 СТОРОНА.wav", "zoolook.cue")
__________________
О нас думают плохо лишь те, кто хуже нас. А те, кто лучше нас, им просто не до нас.
--Омар Хайям

Обновления по запросу — на Я.Ди. «Мэйл-облако» для тех, кто помогает нашему интернет-проекту, и для тех, кто хотел бы это делать, но пока не знает, как.

Помогая форуму ВТО, вы прежде всего помогаете себе! А не делаете что-то абстрактное для «других», совершенно незнакомых и безразличных вам людей.
Дмитрий вне форума   Ответить с цитированием
 

Закладки


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +3, время: 23:26.


Powered by vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd. Перевод: zCarot
Rambler's Top100 Республика Татарстан - Каталог сайтов