Вверх ↑
Ответов: 1291
Рейтинг: 47
#1: 2024-05-26 02:39:33 ЛС | профиль | цитата
flud, спасибо, если это не шутка, то попробую.. Хорошобы научить его портировать из Си и Дельфи код под Хиасм..

Administrator, конечно, возможно есть ограничения и в них упрусь скоро, но взгляните на этот диалог, это нечто.. Там я ему подсунул свой код, а он его подхватил и продолжил.

Диалог с GPT4


#ChatGPT4 рулит) Ну не может машина так отвечать.. Это уже НЕЧТО большее... Или НЕКТО.. Правда, иногда безумный код выдает с серьезной миной, но чаще вполне рабочий ..

Мой запрос:
Переделай код функции play учетом вот такой функции чтения файла:

class Array
def even_values
values_at(* each_index.select(&dd?))
end
def odd_values
values_at(* each_index.select(&:even?))
end
end def read_wave_file(file)
@left_channel.clear()
@right_channel.clear()

reader = Reader.new(file)
reader.each_buffer do |buffer|
samples = buffer.samples

@left_channel.concat(samples.odd_values)
@right_channel.concat(samples.even_values)
end
end


Ответ ChatGPT:

Хорошо, давайте использовать предоставленную вами функцию чтения файла и изменим метод `play` соответственно. Мы также будем использовать `even_values` и `odd_values` для разделения семплов.

Вот обновленный код:

```ruby
require 'wavefile'

class Array
def even_values
values_at(*each_index.select(&dd?))
end

def odd_values
values_at(*each_index.select(&:even?))
end
end

# Класс для управления воспроизведением
class WavePlayer
include WaveFile

def initialize(filename)
@filename = filename
@left_channel = []
@right_channel = []
@playback_thread = nil
@playing = false
@paused = false
@index = 0
@block_size = 2048
read_wave_file(@filename)
end

def read_wave_file(file)
@left_channel.clear
@right_channel.clear

reader = Reader.new(file)
reader.each_buffer do |buffer|
samples = buffer.samples

@left_channel.concat(samples.odd_values.map { |s| s / 32768.0 })
@right_channel.concat(samples.even_values.map { |s| s / 32768.0 })
end
end

def play
return if @playing && !@paused
@playing = true
@paused = false
@playback_thread ||= Thread.new do
while @playing && @index < @left_channel.size
if @paused
sleep 0.1
next
end

block_end = [@index + @block_size, @left_channel.size].min
left_block = @left_channel[@index...block_end]
right_block = @right_channel[@index...block_end]

# Вывод блока данных на консоль для проверки
left_block.zip(right_block).each do |left_sample, right_sample|
puts "Left: #{left_sample}, Right: #{right_sample}"
end

@index = block_end

sleep(@block_size / (44100.0 * 2)) # Задержка для воспроизведения блока (учет стерео)
end
@playing = false
@playback_thread = nil
end
end

def pause
@paused = true
end

def stop
@playing = false
@paused = false
if @playback_thread
@playback_thread.join
@playback_thread = nil
end
@index = 0
end

def left_channel
@left_channel
end

def right_channel
@right_channel
end
end

# Пример использования
player = WavePlayer.new('path_to_stereo_wave_file.wav')

# Управление воспроизведением
puts "Press 'p' to play, 'a' to pause, 's' to stop, 'q' to quit"
loop do
input = gets.chomp
case input
when 'p'
player.play
when 'a'
player.pause
when 's'
player.stop
when 'q'
player.stop
break
end
end
```

### Объяснение изменений:

1. **Функции `even_values` и `odd_values`**:
- Эти функции теперь используются для разделения семплов на левый и правый каналы в методе `read_wave_file`.

2. **Метод `read_wave_file`**:
- Мы читаем данные из файла и заполняем массивы `@left_channel` и `@right_channel` с преобразованием семплов в диапазон от -1 до 1.

3. **Метод `play`**:
- Воспроизведение аудиоблоков с учетом новой структуры данных. Блоки размером 2048 семплов воспроизводятся с корректной задержкой.
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Редактировалось 2 раз(а), последний 2024-05-26 02:40:58