Важная информация

User Tag List

Страница 1 из 4 1234 ПоследняяПоследняя
Показано с 1 по 10 из 32

Тема: BEEP (freq, ms) для бипера, AY и даже Windows

  1. #1
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,596
    Спасибо Благодарностей отдано 
    2,180
    Спасибо Благодарностей получено 
    137
    Поблагодарили
    103 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию BEEP (freq, ms) для бипера, AY и даже Windows

    Здравия всем.

    Вот, подталкиваемый jerri, я решил таки стряхнуть пыль с болдердаша. В связи с чем возник такой вопрос: в игре используются простые звуки на бипер, притом не в фоне, а занимающие время процессора. Сходу нарисовалось вот такое решение эпохи Hisoft Pascal:
    Код:
    static void BEEPER (unsigned int a, unsigned int b) {
      __asm
        PUSH IX
        LD   IX,#4
        ADD  IX,SP
        LD   E,0(IX)
        LD   D,1(IX)
        LD   L,2(IX)
        LD   H,3(IX)
        CALL #0x3B5
        POP  IX
    __endasm;
    }
    
    void Sound_Beep (unsigned int freq, unsigned int ms) {
    /*
      DE = freq * time        ; freq (Hz), time (sec) = ms/1000
      HL = 437500/freq-30.125
    */
      BEEPER(freq*ms/1000, 437500/freq-30);
    }
    В лоб, быстро, однако работает. Но тянет за собой длинное умножение, длинное деление, от чего хотелось бы избавиться. Есть соображения?

    Также было бы полезно увидеть реализацию BEEP (freq, ms) для AY и даже для Windows (или SDL). Сам я ничего лучше не придумал, чем генерировать в памяти wav'ку и потом воспроизводить.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Master
    Регистрация
    24.05.2005
    Адрес
    г. Запорожье, Украина
    Сообщений
    992
    Спасибо Благодарностей отдано 
    571
    Спасибо Благодарностей получено 
    364
    Поблагодарили
    239 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    и даже для Windows
    https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx

  4. #3
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,596
    Спасибо Благодарностей отдано 
    2,180
    Спасибо Благодарностей получено 
    137
    Поблагодарили
    103 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от krt17 Посмотреть сообщение
    Переделать в beeper(tone, ms), и использовать табличку.
    tone - как я понимаю, это не частота в герцах, а высота звука, подобная ZX-бейсиковскому BEEP? Не, боюсь, мне такое решение не подойдёт. Смотрите как выглядит генерация типичного звука:
    Код:
     unsigned p = 0;
    
     while (1) {
      unsigned m = p, k;
    
      m = ++ p;
      for (k = 0; m; m >>= 1)
       if (m & 1)
        k ++;
      snd (30 + (k << 4), 30);
     }
    Т.е. здесь нужна именно частота. В герцах. В тон такое даже спьяну не конвертирую.

    shurik-ua, начнём с того, что ф-ция винапи Beep пикает именно на встроенный динамик, а на некоторые компы его сейчас даже не устанавливают. До такого решения я и сам бы додумался. Если бы оно меня устраивало...

  5. #4
    Guru Аватар для jerri
    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    4,752
    Спасибо Благодарностей отдано 
    261
    Спасибо Благодарностей получено 
    269
    Поблагодарили
    203 сообщений
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Есть еще вариант использовать процедуру Стива Тернера
    вешается на прерывания занимает 1/7 фрейма
    при этом можно получать довольно сложные звуки

    результат работы можно увидеть в играх
    RanaRama, Quazatron/Magnetron

    вот здесь лежит плеер звуков

    вот здесь лежит редактор звуков

    вызов производится по номеру заранее созданного звука.
    С уважением,
    Jerri / Red Triangle.

  6. #5
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,596
    Спасибо Благодарностей отдано 
    2,180
    Спасибо Благодарностей получено 
    137
    Поблагодарили
    103 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  7. #6
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,596
    Спасибо Благодарностей отдано 
    2,180
    Спасибо Благодарностей получено 
    137
    Поблагодарили
    103 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Тэкс, похоже, задача выглядит слегка не так, как написано в заголовке темы. Тут я чуть поковырялся, и теперь не уверен, что частота должна поступать на вход в герцах. Кто хочет мне помочь со звуками для игры болдердаш? (jerri, между прочим, если твой интерес самый большой, то заканчивай трёп и подключайся). Нужно переписать для ZX такой код с ТурбоСи:
    Код:
    void cdecl sndoff (void)
    {{
     outportb (0x61, inportb (0x61) & 0xFC);
    }}
    
    static unsigned get_timer (void)
    {{
     unsigned z;
    
     outportb (0x43, 0);
     z = inportb (0x40);
     return z = z | (inportb (0x40) << 8);
    }}
    
    void snd (unsigned fr, unsigned ln)
    {{
     unsigned timing = get_timer ();
     long LN = ln;
    
     LN *= fr *= 6;
     outportb (0x43, 0xB6);
     outportb (0x42, ((unsigned char *)&fr)[0]);
     outportb (0x42, ((unsigned char *)&fr)[1]);
     outportb (0x61, inportb (0x61) | 0x3);
     while (LN > 0) {
      unsigned time2 = get_timer ();
    
      LN -= (timing - time2);
      timing = time2;
       }
     sndoff ();
    }}

  8. #7
    Guru Аватар для jerri
    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    4,752
    Спасибо Благодарностей отдано 
    261
    Спасибо Благодарностей получено 
    269
    Поблагодарили
    203 сообщений
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Если хочешь коллекцию звуков для игры вот тебе еще
    https://shiru.untergrund.net/software.shtml#zxspectrum

    ---------- Post added at 18:39 ---------- Previous post was at 18:32 ----------

    мой интерес уже исполнен, я увидел что хотел.
    у меня к конверсии игр подход абсолютно другой.
    С уважением,
    Jerri / Red Triangle.

  9. #8
    Veteran
    Регистрация
    29.12.2010
    Адрес
    Москва
    Сообщений
    1,858
    Спасибо Благодарностей отдано 
    131
    Спасибо Благодарностей получено 
    104
    Поблагодарили
    62 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Наиболее простой способ получения звука определенной длительности и высоты - обратиться к подпрограмме ПЗУ, ответственной за выполнение оператора Бейсика BEEP. Мы уже упоминали о ней в шестой главе, но тем не менее напомним, что располагается она по адресу 949 и требует определения регистровых пар HL и DE. Например:
    LD DE,440
    LD HL,964
    CALL 949
    RET
    Таким способом можно получить звук практически любой высоты и продолжительности - ограничения Бейсика здесь отсутствуют. Однако при этом отсутствуют и удобства, предоставляемые интерпретатором. Чтобы написать даже очень коротенькую музыкальную фразу, придется немало попотеть, рассчитывая значения задаваемых параметров. А рассчитываются они так. В регистровую пару DE заносится число, определяемое как fxt, где f - частота, измеряемая в герцах, а t - время в секундах (при извлечении звука ЛЯ первой октавы, который имеет частоту 440 Гц, длительностью в 1 секунду получится 440x1=440). Пара HL на входе должна содержать число, равное 437500/f-30.125 (если выполнить указанные вычисления, то получим величину 964). Таким образом, приведенная выше программа делает то же самое, что и оператор Бейсика
    BEEP 1,9
    Из книги "Как написать игру на ассемблере".

    Я бы через таблицу сделал, благо нот и длительностей не так много.
    Последний раз редактировалось Andrew771; 26.09.2015 в 20:16.

  10. #9
    Super Moderator Аватар для Alex Rider
    Регистрация
    07.02.2008
    Адрес
    г. Рязань
    Сообщений
    2,908
    Спасибо Благодарностей отдано 
    29
    Спасибо Благодарностей получено 
    89
    Поблагодарили
    31 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Если во время игры BASIC жив, можно попробовать выполнить прямо опертор BEEP по адресу #03f8. Требует параметров на стеке калькулятора, положить можно через #2d3b.

    ---------- Post added at 18:18 ---------- Previous post was at 18:08 ----------

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    BEEP (freq, ms) для AY
    Могу поделиться идеями, но нужны взодные данные:
    1. BEEP нужен блокирующий или нет? Если нет, то есть ли IM2, можно ли подцепиться в обработчик и устроить ли точность в 1/50 секунды?
    2. Можно ли таблицы нот положить в ОЗУ? Если нет, то устроит ли такое оганичение: на 48К + AY или при запуске из 48К-Бейсика будет играть ахинею (можно сделать проверку и не играть совсем).
    ZX Evolution Rev C + ZXM-SoundCard Extreme + NeoGS.

  11. #10
    Activist Аватар для Sergey
    Регистрация
    23.12.2006
    Адрес
    Славный город Самара
    Сообщений
    473
    Спасибо Благодарностей отдано 
    93
    Спасибо Благодарностей получено 
    12
    Поблагодарили
    8 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    в игре используются простые звуки на бипер, притом не в фоне, а занимающие время процессора.
    Процедура из книги "Как написать игру на ассемблере", стр.278.
    Так что, АБСОЛЮТНО, рабочая.
    RET не используется, т.к. последняя в п/п процедура 1016 сама заканчивается RET, а на стэке у нас адрес возврата.

    Semitone - номер полутона, len - длительность в сотых секунды.

    Код:
    void beep(char semitone, char len) __naked
    { semitone, len;
    __asm
    	pop  af
    	pop  bc
    	push bc
    	push af
        ld a,b
        ld b,#0
    	push bc
    	call 11560
    	ld   a,#100
    	call 11560
    	rst 40
    	.db 5, 56
    	pop bc
    	ld  a,c
    	and a
    	jp  m,1$
    	call 11560
    	jp 1016
    
    1$:	neg
    	call 11560
    	rst 40
    	.db  27,56
    	jp  1016
    __endasm;
    }
    Последний раз редактировалось Sergey; 28.09.2015 в 23:35.
    С уважением,
    Gris / Red Triangle.
    _____________________________________
    ZX-EVO/TS-Labs config/NGS/HDD/SD-card
    Amiga A1200/Blizzard 1230@50/32/60GB
    Amiga A1200/Apollo 1260@66/32/60GB
    UnAmiga (C5) AGA GM7123 VideoDAC

Страница 1 из 4 1234 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Усилитель для бипера...
    от Quest в разделе Звук
    Ответов: 17
    Последнее: 29.03.2013, 16:58
  2. MISTER BEEP – Z80
    от breeze в разделе Музыка
    Ответов: 2
    Последнее: 09.01.2012, 13:54
  3. My Beep Song....
    от Voxel в разделе Музыка
    Ответов: 25
    Последнее: 05.07.2010, 11:28
  4. новый трекер для бипера
    от alone в разделе Музыка
    Ответов: 2
    Последнее: 22.09.2009, 04:16
  5. Новости от Mr.Beep !!
    от breeze в разделе Музыка
    Ответов: 3
    Последнее: 29.01.2009, 01:23

Ваши права

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