LINUX.ORG.RU
Ответ на: комментарий от PolarFox

А в каком формате?

То есть в моем примере с синусоидой будет число от -1 до +1, не целое.

А что выводить то?

knotri
() автор топика
Ответ на: комментарий от PolarFox

Немного почитал

Но что то не так, я попробовал вывести например подряд одинаковые значение (и это же не должно ничего модулировать) Но звук есть.

Или может дело в битности? я использую int

knotri
() автор топика

Читай до просвещения man sox.

Anon
()

А вот так это на сях делается!

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <math.h>
#include <sys/time.h>
#include <error.h>

#include <sys/ioctl.h>
#include <sys/soundcard.h>

double dtime(){
	struct timeval ct;
	struct timezone tz;
	gettimeofday(&ct, &tz);
	return (ct.tv_sec + ct.tv_usec/1e6);
}

void play(double freq){
	double time0 = dtime();
	double time = 0.;
	unsigned short int A[2];
	int mask, status;
	int fd = open("/dev/dsp", O_RDWR);
	ioctl(fd, SOUND_MIXER_READ_STEREODEVS, &mask);
	printf("mask: %d\n", mask);
	mask = SOUND_MASK_VOLUME;
	ioctl(fd, SOUND_MIXER_WRITE_RECSRC, &mask);
	mask = AFMT_U16_BE;
	status = ioctl(fd, SNDCTL_DSP_SETFMT, &mask);
	if (status == -1) {
		perror("error from SNDCTL_DSP_SETFMT ioctl");
		exit(4);
	}
	mask = 8000;
	status = ioctl(fd, SOUND_PCM_WRITE_RATE, &mask);
	if (status == -1) {
		perror("error from SOUND_PCM_WRITE_RATE ioctl");
		exit(1);
	}
	ioctl(fd, SOUND_PCM_READ_BITS, &mask);
	printf("Разрядность: %d\n",mask);
	mask = 8;
	status = ioctl(fd, SOUND_PCM_WRITE_BITS, &mask);
	if (status == -1) {
		perror("error from SOUND_PCM_WRITE_BITS ioctl");
		exit(2);
	}
	status = ioctl(fd, SNDCTL_DSP_GETBLKSIZE, &mask);
	if (status == -1) {
		perror("error from SNDCTL_DSP_GETBLKSIZE ioctl");
		exit(3);
	}	
	printf("Размер блока: %d\n",mask);
	// wait for playback to complete before recording again 
		status = ioctl(fd, SOUND_PCM_SYNC, 0); 
		if (status == -1)
			perror("SOUND_PCM_SYNC ioctl failed");
	A[0] = A[1] = 0;
	do{
		time = dtime() - time0;
		A[0]= 0x4000 * (1. +  cos(time * freq * 2. * M_PI));
		write(fd, &A, sizeof(A));
		//usleep(10);
	}
	while( time < 0.5);
}

int main(int argc, char** argv){
	double freq;
	if (argc < 2) freq = 440;
	else freq = atof(argv[1]);
	printf("Playing 2 seconds with freq=%f Hz\n", freq);
	play(freq);
	exit(0);
}

Anon
()
Ответ на: комментарий от knotri

Подозреваю, что у тебя ALSA, а модули snd_pcm_oss и snd_mixer_oss не подгружены!

anonymous
()
Ответ на: комментарий от anonymous

Это явно не то. Так указывалась частота. Мне же наоборот нужно посчитать значение амплитуды от времени

knotri
() автор топика
Ответ на: комментарий от knotri

Тогда юзай или OSS (пример выше я привел) или ALSA (тоже могу дать пример, но альза — жопа та еще, кода будет в 3 раза больше).

Anon
()
Ответ на: комментарий от knotri
echo "while(1>0) s(i++)" | bc -lq | aplay

осталось доработать напильником

mm3 ★★★
()
Ответ на: комментарий от knotri

Одну строчку поменять всего. Программу можно как заготовку использовать. И вообще советую про libao прочитать. Довольно удобная для вывода звука вещь.

anonymous
()

проще всего через sdl

сорри за форматирование, писал прямо в комменте

компилить gcc file.c -lSDL

#include <SDL/SDL.h>
#include <string.h>
SDL_AudioSpec spec;
float phase = 0;
void sdl_callback (void *userdata, Uint8 *stream, int len) {
int i;
for (i = 0; i < len/2; i++) {
((short*)stream)[i] = (short)((phase * 2 - 1)*0x7fff);
phase += 440.f / spec.freq;
if (phase > 1) phase -= 1;}}
int main() {
SDL_AudioSpec obt;
spec.freq = 48000;
spec.format = AUDIO_S16;
spec.channels = 1;
spec.samples = 4096;
spec.callback = sdl_callback;
SDL_OpenAudio(&spec, &obt);
memcpy (&spec, &obt, sizeof (SDL_AudioSpec));
SDL_PauseAudio (0);
for (;;sleep (1));
return 0;}

гы. если повернуть голову на 90 градусов, и смотреть издалека - похоже на анализатор спектра.

waker ★★★★★
()
Последнее исправление: waker (всего исправлений: 1)
Ответ на: комментарий от anonymous

лопухи! Вы сейчас сделали кому-то домашку за ничего. Лол.

как минимум, ему придется ее на c++ переписывать. а это 99% работы :)

waker ★★★★★
()
Ответ на: комментарий от waker

Да какая домашка. Я себе пианино хочу сделать.А началось все с того что я прочитал в книжке с физики математическое описание «музыки».

А по поводу языка мне любой подошел бы. Но вывод звука это только часть, потом все скорее всего будет на Qt.

knotri
() автор топика
Ответ на: комментарий от anonymous

лопухи! Вы сейчас сделали кому-то домашку за ничего. Лол.

меньше людей в теме => меньше конкуренция на рынке => больше профит.

Всё по плану.

dimon555 ★★★★★
()
Ответ на: комментарий от knotri

Не осилю такие исходники.)

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

но это все понадобится если ты не забросишь после первого результата.

waker ★★★★★
()
Ответ на: комментарий от exception13

ты не пианину, ты велосипед делаешь. все уже давно есть http://zynaddsubfx.sourceforge.net/ например.

а как научиться делать то, что делает zasfx если не делать велосипедов?

waker ★★★★★
()
Ответ на: комментарий от knotri

Думал сначала стоит советовать или нет, но раз такое дело, точно стоит использовать только jack. Ибо всё остальное - убогие недоделки, только и годные что для воспроизведения звука. Ну или вовсе на lv2 писать.

Только стоит сначала задуматься, а стоит ли писать «пианино» когда синтезатаров и так полно. Т.е. если знаний и сил хватит, чтобы сделать лучше, то конечно стоит.

anonymous
()
Ответ на: комментарий от knotri

Я себе пианино хочу сделать

И при чем здесь синусоиды? Купи MIDI-клаву, в ЛОРовики я когда-то писал простенькое правило для udev, "автозапускающее" все, что надо, при подключении клавы. Втыкаешь штекер в USB и спокойненько бряцаешь, что угодно. УМВР.

Anon
()
Ответ на: комментарий от Anon

И при чем здесь синусоиды? Купи MIDI-клаву

я до покупки midi-клавы пользовался сначала своей велосипедной софтверной (т.к. звук был через sdl), а после прикрутки midi стал юзать jack-keyboard. потом, конечно, пришлось midi-клаву купить.

а вообще jack и midi не нужны, они фантазию ограничивают. и вообще протокол идиотский из середины прошлого века. их имеет смысл прикручивать только когда уже есть что-то работающее, с чем надо налаживать взаимодействие других программ. если сразу jack прикручивать - весь запал пропадет.

waker ★★★★★
()
Последнее исправление: waker (всего исправлений: 2)
Ответ на: комментарий от quickquest

Для миди-клавы никакого софта не надо, нужен лишь awesfxload, чтобы звуковой банк загрузить. А потом уже звуковушка "сама" по MIDI-командам будет звук синтезировать.

А еще говорят, что мощей современных компьютеров хватает даже для софтового синтеза звука, т.е. для обладателей говнокарт тоже есть выход.

Anon
()
Ответ на: комментарий от Anon

Для миди-клавы никакого софта не надо

фигасе.. а ловить миди-поток, синтезировать и выводить звук будет папа карло?

waker ★★★★★
()
Ответ на: комментарий от waker

Для этого есть ALSA. Тебе нужно лишь правило для udev (я в ЛОР-вики выкладывал), которое aconnect запустит, чтобы MIDI-вход карточки соединить с MIDI-выходом клавы.

УМВР.

Anon
()
Ответ на: комментарий от waker

Или ты не в курсе, что нормальные звуковые карты сами синтезируют звук, им надо лишь указать область памяти, где хранятся банки (это делает sfxload) и подать что-то на MIDI-вход.

Anon
()
Ответ на: комментарий от Anon

Или ты не в курсе, что нормальные звуковые карты сами синтезируют звук, им надо лишь указать область памяти, где хранятся банки (это делает sfxload) и подать что-то на MIDI-вход.

s/нормальные/древние/

fixed that for ya

waker ★★★★★
()
Ответ на: комментарий от waker

fixed that for ya

Сам ты "древние"!

Аппаратный синтез — мегаудобнейшая вещь. А современные говнокарты не то, что аппаратного синтеза не умеют, так у них вообще все обрезано по самые гланды: ни микшера, ни нормального усилка, ни фильтров качественных.

Параша для потребителей легкого поведения, да и только.

Anon
()
Ответ на: комментарий от waker

Дык, то, что последние пару десятилетий мир скатывается к культу потребления — тоже факт! А культ потребления говорит, что товар должен иметь крайне низкое качество и крайне высокую цену. Тогда он будет приносить много прибыли, а т.к. будет часто ломаться, спрос на него будет всегда.

Хомячки не хотят брать? Не беда! Пишем "супер-трупер-бас-бустер-1000Вт-10каналов-100кГц-200дБ-конянаскакуостановит-вгорячуюизбувойдет-ивообщебойбабаанежелезо". Все, ПОПУлярность обеспечена.

Anon
()
Ответ на: комментарий от waker

Я не спорю. А просто мне обидно, что сейчас уже качественное железо перестали делать, выпускают говно какое-то!

А ТС что-то молчит. То ли решил проблему, то ли в запой ушел — ХЗ.

Anon
()
Ответ на: комментарий от Anon

Ладно. Что-то заболтался я тут с вами. А у меня вектора не посчитаны, каустика не построена и выпуклые оболочки я еще не научился по-быстрому натягивать...

Anon
()
Ответ на: комментарий от Anon

дык мне тоже обидно. я ж не утверждаю, что новые звуковухи не говно.

waker ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.