bool SaveAsBmp(til::Image& image, const _TCHAR *file_name)
	{
		if (image.GetBitDepth() != til::Image::BPP_32B_R8G8B8) return false;

		std::ofstream bmp_out(file_name, std::ios::binary);
		if (!bmp_out.is_open()) return false;

		bitmap_info_header bitmap_info	= { 0x00 }; 
		bitmap_info.biSize				= sizeof(bitmap_info_header);
		bitmap_info.biWidth				= image.GetWidth();
		bitmap_info.biHeight			= -static_cast<til::int32>(image.GetHeight());
		bitmap_info.biPlanes			= 1;
		bitmap_info.biBitCount			= 24;
		bitmap_info.biCompression		= 0;	// BI_RGB;
		bitmap_info.biXPelsPerMeter		= 4000;
		bitmap_info.biYPelsPerMeter		= 4000;

		bitmap_file_header bitmap_header	= { 0x00 };
		bitmap_header.bfType				= 0x4D42;   // "BM"
		bitmap_header.bfOffBits				= sizeof(bitmap_file_header) + bitmap_info.biSize;

		std::vector<til::byte> bitmap_data;

		unsigned long *pixel_data = reinterpret_cast<unsigned long*>(image.GetPixels());
		for (std::size_t i = 0, max_i = image.GetHeight(); i < max_i; ++i)
		{
			std::size_t max_j = image.GetWidth();
			for (std::size_t j = 0; j < max_j; ++j)
			{
				unsigned long pixel_value = pixel_data[i * max_j + j];
				bitmap_data.push_back(RED(pixel_value));
				bitmap_data.push_back(GREEN(pixel_value));
				bitmap_data.push_back(BLUE(pixel_value));
			}
			bitmap_data.insert(bitmap_data.end(), max_j % 4, 0x00);
		}

		bitmap_header.bfSize = bitmap_header.bfOffBits + bitmap_data.size();

		bmp_out.write(reinterpret_cast<char*>(&bitmap_header), sizeof(bitmap_file_header));
		bmp_out.write(reinterpret_cast<char*>(&bitmap_info), sizeof(bitmap_info_header));
		bmp_out.write(reinterpret_cast<char*>(bitmap_data.begin()._Ptr), bitmap_header.bfSize - bitmap_header.bfOffBits);

		bmp_out.close();

		return true;
	}
Beispiel #2
0
int
main(int argc, char *argv[])
{
  double **sound, **image;
  int i;

  char path[MUT_MAX_PATH_LEN], name[MUT_MAX_NAME_LEN], ext[MUT_MAX_NAME_LEN];

  //=============================
  // parse command line arguments
  //=============================

  if (! mut_parse_cmd_line(argc, argv, arglist, NULL))
  {
    fprintf(stderr, "ASPERES %s\n", version);
    fprintf(stderr, "%s:\n%s.\n", err_1, mut_errmsg(mut_last_error()));
    return 1;
  }

  //==================================
  // check for help or version request
  //==================================
  
  if (help_req)
  {
    print_help();
    return 1;
  }

  if (vers_req)
  {
    print_version();
    return 1;
  }

  //===============
  // set up logging
  //===============

  mut_set_logname(logname);
  mut_setlog(1);
  unlink(logname);
  mut_get_date(date);
  message("ASPERES version %s (%s)", version, date);

  //=================
  // read config file
  //=================

  if (read_config_file(config_file) < 0)
  {
    message("%s %s", err_4, config_file);
    return 1;
  }

  //===============================
  // process command line arguments
  //===============================

  //======= program operation mode =======

  if (prog_mode_s[0] == 0)
  {
    message("%s", err_2);
    return 1;
  }

  if (strcmp(prog_mode_s, "anal") == 0)
    prog_mode = MODE_ANAL;
  else if (strcmp(prog_mode_s, "sine") == 0)
    prog_mode = MODE_SINE_SYNTH;
  else if (strcmp(prog_mode_s, "noise") == 0)
    prog_mode = MODE_NOISE_SYNTH;
  else
  {
    message("%s (%s)", err_3, prog_mode_s);
    return 1;
  }

  //======= file names =======

  if (input_file[0] == 0)
  {
    message("%s", err_5);
    return 1;
  }
      
  if (! mut_fname_split(input_file, path, name, ext))
  {
     message("%s", err_16);
     return 1;
  }

  if (prog_mode == MODE_ANAL)
  {
     if (strcmp(ext, ".wav") != 0)
     {
       message("%s", err_17);
       return 1;
     }
  }
  else
  {
     if (strcmp(ext, ".bmp") != 0)
     {
       message("%s", err_18);
       return 1;
     }
  }
  
  if (output_file[0] == 0) 
  {
    strcpy(output_file, path);
    strcat(output_file, name);
    strcat(output_file, "~");
    
    if (prog_mode == MODE_ANAL)
      strcat(output_file, ".bmp");
    else
      strcat(output_file, ".wav");
  }
 
  //======= WAV sample rate =======

  if (wav_rate_s[0] != 0)
  {
    if (! mut_stoi(wav_rate_s, MUT_BASE_DEC, &wav_rate))
    {
      message("%s '%s'", err_7, wav_rate_s);
      return 1;
    }
  }

  i = 0;
  while (std_wav_rates[i] != -1)
  {
    if (std_wav_rates[i] == wav_rate)
      break;
    else
      i++;
  }
    
  if (std_wav_rates[i] == -1)
  {
    message("'%s' %s", wav_rate_s, err_8);
    return 1;
  }

  //======= frequency limits =======

  if (low_freq_s[0] != 0)
  {
    if (! mut_stof(low_freq_s, &low_freq))
    {
      message("%s '%s'", err_7, low_freq_s);
      return 1;
    }
  }
      
  if (low_freq < MIN_LOW_FREQ || low_freq > MAX_LOW_FREQ)
  {
    message("%s", err_9);
    return 1;
  }

  if (high_freq_s[0] != 0)
  {
    if (! mut_stof(high_freq_s, &high_freq))
    {
      message("%s '%s'", err_7, high_freq_s);
      return 1;
    }
  }

  if (high_freq < MIN_HIGH_FREQ || high_freq > MAX_HIGH_FREQ)
  {
    message("%s", err_10);
    return 1;
  }
      
  //======= resolutions =======

  if (band_per_oct_s[0] != 0)
  {
    if (! mut_stof(band_per_oct_s, &band_per_oct))
    {
      message("%s '%s'", err_7, band_per_oct_s);
      return 1;
    }
  }
      
  if (band_per_oct < MIN_BPO || band_per_oct > MAX_BPO)
  {
    message("%s", err_11);
    return 1;
  }

  if (pix_per_sec_s[0] != 0)
  {
    if (! mut_stof(pix_per_sec_s, &pix_per_sec))
    {
      message("%s '%s'", err_7, pix_per_sec_s);
      return 1;
    }
  }

  if (pix_per_sec < MIN_PPS || pix_per_sec > MAX_PPS)
  {
    message("%s", err_12);
    return 1;
  }
      
  //======= brightness control =======

  if (gamma_corr_s[0] != 0)
  {
    if (! mut_stof(gamma_corr_s, &gamma_corr))
    {
      message("%s '%s'", err_7, gamma_corr_s);
      return 1;
    }
  }

  if (gamma_corr < MIN_GAMMA || gamma_corr > MAX_GAMMA)
  {
    message("%s", err_13);
    return 1;
  }

  //======= image dimensions =======

  if (img_width_s[0] != 0)
  {
    if (! mut_stoi(img_width_s, MUT_BASE_DEC, &img_width))
    {
      message("%s '%s'", err_7, img_width_s);
      return 1;
    }
  }

  if (img_height_s[0] != 0)
  {
    if (! mut_stoi(img_height_s, MUT_BASE_DEC, &img_height))
    {
      message("%s '%s'", err_7, img_height_s);
      return 1;
    }
  }

  //======= miscellaneous parameters =======

  if (use_linear)
    logbase = 1;
  else
    logbase = 2;

  //====================
  // open & create files
  //====================

  infile = fopen(input_file, "rb");
  if (infile == NULL)
  {
    message("%s", err_14);
    return 1;
  }

  outfile = fopen(output_file, "wb");
  if (outfile == NULL)
  {
    fclose(infile);
    message("%s", err_15);
    return 1;
  }

  //===================================
  // perform the requested operation(s)
  //===================================

  srand(time(NULL));

  if (prog_mode == MODE_ANAL)
  {
    message("Sound '%s' to spectrogram '%s'", input_file, output_file);
    sound = wav_in(infile, &channels, &samplecount, &wav_rate);
    setup
    (
      &img_height, samplecount, &wav_rate, &low_freq, &high_freq,
      &pix_per_sec, &band_per_oct, img_width, 0
    );

    start_time = gettime();
    image = anal
            (
              sound[0], samplecount, wav_rate,
              &img_width, img_height, band_per_oct, pix_per_sec, low_freq
            );

    if (gamma_corr != 1.0)
      brightness_control(image, img_height, img_width, 1.0 / gamma_corr);

    bmp_out(outfile, image, img_height, img_width);
  }

  if (prog_mode == MODE_SINE_SYNTH || prog_mode == MODE_NOISE_SYNTH)
  {
    message("Image '%s' to sound '%s'", input_file, output_file);
    sound = calloc(1, sizeof(double *));
    image = bmp_in(infile, &img_height, &img_width);

    setup
    (
      &img_height, samplecount, &wav_rate, &low_freq, &high_freq,
      &pix_per_sec, &band_per_oct, img_width, 1
    );

    if (gamma_corr != 1.0)
      brightness_control(image, img_height, img_width, gamma_corr);

    start_time = gettime();

    if (prog_mode == MODE_SINE_SYNTH)
      sound[0] = synt_sine
                 (
                   image, img_width, img_height, &samplecount, wav_rate,
                   low_freq, pix_per_sec, band_per_oct
                 );
    else
      sound[0] = synt_noise
                 (
                   image, img_width, img_height, &samplecount, wav_rate,
                   low_freq, pix_per_sec, band_per_oct
                 );

    wav_out(outfile, sound, 1, samplecount, wav_rate, WAV_FORMAT);
  }

  end_time = gettime();
  message("Processing time: %.3f s", (double) (end_time - start_time) / 1000.0);

  return 0;
}
Beispiel #3
0
int main(int argc, char *argv[])
{
	log_file("Starting arss ...");
	test_fft();

	FILE *fin;
	FILE *fout;
	int32_t  i;
	double **sound, **image, basefreq=0, maxfreq=0, pixpersec=0, bpo=0, brightness=1;
	int32_t channels, samplecount=0, samplerate=0, Xsize=0, Ysize=0, format_param=0;
	int32_t clockb;
	char mode=0, *in_name=NULL, *out_name=NULL;

	// initialisation of global using defaults defined in dsp.h
	pi=PI_D;
	LOGBASE=LOGBASE_D;
	LOOP_SIZE_SEC=LOOP_SIZE_SEC_D;
	BMSQ_LUT_SIZE=BMSQ_LUT_SIZE_D;
	#ifdef QUIET
	quiet=1;
	#else
	quiet=0;
	#endif

	printf("The Analysis & Resynthesis Sound Spectrograph %s\n", version);

	srand(time(NULL));

	for (i=1; i<argc; i++)
	{
		if (strcmp(argv[i], "/?")==0)	// DOS friendly help
		{
			argv[i][0] = '-';
			argv[i][1] = 'h';
		}

		if (argv[i][0] != '-')				// if the argument is not a function
		{
			if (in_name==NULL)			// if the input file name hasn't been filled in yet
				in_name = argv[i];
			else
				if (out_name==NULL)		// if the input name has been filled but not the output name yet
					out_name = argv[i];
				else				// if both names have already been filled in
				{
					fprintf(stderr, "You can only have two file names as parameters.\nRemove parameter \"%s\".\nExiting with error.\n", argv[i]);
					exit(EXIT_FAILURE);
				}
		}
		else						// if the argument is a parameter
		{
			if (strcmp(argv[i], "--analysis")==0	|| strcmp(argv[i], "-a")==0)
				mode=1;

			if (strcmp(argv[i], "--sine")==0	|| strcmp(argv[i], "-s")==0)
				mode=2;

			if (strcmp(argv[i], "--noise")==0	|| strcmp(argv[i], "-n")==0)
				mode=3;

			if (strcmp(argv[i], "--quiet")==0	|| strcmp(argv[i], "-q")==0)
				quiet=1;

			if (strcmp(argv[i], "--linear")==0	|| strcmp(argv[i], "-l")==0)
				LOGBASE=1.0;

			if (strcmp(argv[i], "--sample-rate")==0	|| strcmp(argv[i], "-r")==0)
				if (str_isnumber(argv[++i]))
						samplerate = atoi(argv[i]);
				else
				{
					fprintf(stderr, MSG_NUMBER_EXPECTED, argv[i-1]);
					exit(EXIT_FAILURE);
				}

			if (strcmp(argv[i], "--min-freq")==0	|| strcmp(argv[i], "-min")==0)
				if (str_isnumber(argv[++i]))
				{
					basefreq = atof(argv[i]);
					if (basefreq==0)
							basefreq = DBL_MIN;	// Set it to this extremely close-to-zero number so that it's considered set
				}
				else
				{
					fprintf(stderr, MSG_NUMBER_EXPECTED, argv[i-1]);
					exit(EXIT_FAILURE);
				}

			if (strcmp(argv[i], "--max-freq")==0	|| strcmp(argv[i], "-max")==0)
				if (str_isnumber(argv[++i]))
						maxfreq = atof(argv[i]);
				else
				{
					fprintf(stderr, MSG_NUMBER_EXPECTED, argv[i-1]);
					exit(EXIT_FAILURE);
				}

			if (strcmp(argv[i], "--bpo")==0		|| strcmp(argv[i], "-b")==0)
				if (str_isnumber(argv[++i]))
						bpo = atof(argv[i]);
				else
				{
					fprintf(stderr, MSG_NUMBER_EXPECTED, argv[i-1]);
					exit(EXIT_FAILURE);
				}

			if (strcmp(argv[i], "--pps")==0		|| strcmp(argv[i], "-p")==0)
				if (str_isnumber(argv[++i]))
						pixpersec = atof(argv[i]);
				else
				{
					fprintf(stderr, MSG_NUMBER_EXPECTED, argv[i-1]);
					exit(EXIT_FAILURE);
				}

			if (strcmp(argv[i], "--height")==0	|| strcmp(argv[i], "-y")==0)
				if (str_isnumber(argv[++i]))
						Ysize = atoi(argv[i]);
				else
				{
					fprintf(stderr, MSG_NUMBER_EXPECTED, argv[i-1]);
					exit(EXIT_FAILURE);
				}

			if (strcmp(argv[i], "--width")==0	|| strcmp(argv[i], "-x")==0)
				if (str_isnumber(argv[++i]))
						Xsize = atoi(argv[i]);
				else
				{
					fprintf(stderr, MSG_NUMBER_EXPECTED, argv[i-1]);
					exit(EXIT_FAILURE);
				}

			if (strcmp(argv[i], "--loop-size")==0)
				if (str_isnumber(argv[++i]))
						LOOP_SIZE_SEC = atoi(argv[i]);
				else
				{
					fprintf(stderr, MSG_NUMBER_EXPECTED, argv[i-1]);
					exit(EXIT_FAILURE);
				}

			if (strcmp(argv[i], "--log-base")==0)
				if (str_isnumber(argv[++i]))
						LOGBASE = atof(argv[i]);
				else
				{
					fprintf(stderr, MSG_NUMBER_EXPECTED, argv[i-1]);
					exit(EXIT_FAILURE);
				}

			if (strcmp(argv[i], "--bmsq-lut-size")==0)
				if (str_isnumber(argv[++i]))
						BMSQ_LUT_SIZE = atoi(argv[i]);
				else
				{
					fprintf(stderr, MSG_NUMBER_EXPECTED, argv[i-1]);
					exit(EXIT_FAILURE);
				}

			if (strcmp(argv[i], "--pi")==0)					// lol
				if (str_isnumber(argv[++i]))
						pi = atof(argv[i]);
				else
				{
					fprintf(stderr, MSG_NUMBER_EXPECTED, argv[i-1]);
					exit(EXIT_FAILURE);
				}

			if (strcmp(argv[i], "--format-param")==0	|| strcmp(argv[i], "-f")==0)
				if (str_isnumber(argv[++i]))
						format_param = atoi(argv[i]);
				else
				{
					fprintf(stderr, MSG_NUMBER_EXPECTED, argv[i-1]);
					exit(EXIT_FAILURE);
				}

			if (strcmp(argv[i], "--brightness")==0	|| strcmp(argv[i], "-g")==0)
				if (str_isnumber(argv[++i]))
						brightness = atof(argv[i]);
				else
				{
					fprintf(stderr, MSG_NUMBER_EXPECTED, argv[i-1]);
					exit(EXIT_FAILURE);
				}

			// TODO implement --duration, -d

			if (strcmp(argv[i], "--version")==0	|| strcmp(argv[i], "-v")==0)
			{
				printf("Copyright (C) 2005-2008 Michel Rouzic\nProgram last modified by its author on %s\n", date);
				exit(EXIT_SUCCESS);
			}

			if (strcmp(argv[i], "--help")==0	|| strcmp(argv[i], "-h")==0)
			{
				print_help();
				exit(EXIT_SUCCESS);
			}

			if (strcmp(argv[i], "--adv-help")==0)
			{
				print_adv_help();
				exit(EXIT_SUCCESS);
			}



		}
	}

	if (in_name!=NULL)			// if in_name has already been filled in
	{
		fin=fopen(in_name, "rb");	// try to open it

		if (fin==NULL)
		{
			fprintf(stderr, "The input file %s could not be found\nExiting with error.\n", in_name);
			exit(EXIT_FAILURE);
		}
		printf("Input file : %s\n", in_name);
	}
	else
	{
		if (quiet==1)
		{
			fprintf(stderr, "Please specify an input file.\nExiting with error.\n");
			exit(EXIT_FAILURE);
		}

		printf("Type 'help' to read the manual page\n");

		do
		{
			printf("Input file : ");
			in_name=getstring();

			if (strcmp(in_name, "help")==0)		// if 'help' has been typed
			{
				fin=NULL;
				print_help();			// print the help
			}
			else
				fin=fopen(in_name, "rb");
		}
		while (fin==NULL);
	}

	if (out_name!=NULL)			// if out_name has already been filled in
	{
		fout=fopen(out_name, "wb");

		if (fout==NULL)
		{
			fprintf(stderr, "The output file %s could not be opened.\nPlease make sure it isn't opened by any other program and press Return.\nExiting with error.\n", out_name);
			exit(EXIT_FAILURE);
		}
		printf("Output file : %s\n", out_name);
	}
	else
	{
		if (quiet==1)
		{
			fprintf(stderr, "Please specify an output file.\nExiting with error.\n");
			exit(EXIT_FAILURE);
		}
		printf("Output file : ");
		out_name=getstring();
		fout=fopen(out_name, "wb");

		while (fout==NULL)
		{
			fprintf(stderr, "The output file %s could not be opened.\nPlease make sure it isn't opened by any other program and press Return.\n", out_name);
			getchar();
			fout=fopen(out_name, "wb");
		}
	}

	for (i=0; i<strlen(in_name); i++) if (in_name[i]>='A' && in_name[i]<='Z') in_name[i] -= 'A' - 'a';	// make the string lowercase
	if (mode==0 && strstr(in_name, ".wav")!=NULL && strstr(in_name, ".wav")[4]==0)
		mode=1;	// Automatic switch to the Analysis mode

	if (mode==0)
		do
		{
			if (quiet==1)
			{
				fprintf(stderr, "Please specify an operation mode.\nUse either --analysis (-a), --sine (-s) or --noise (-n).\nExiting with error.\n");
				exit(EXIT_FAILURE);
			}
			printf("Choose the mode (Press 1, 2 or 3) :\n\t1. Analysis\n\t2. Sine synthesis\n\t3. Noise synthesis\n> ");
			mode=getfloat();
		}
		while (mode!=1 && mode!=2 && mode!=3);

		
	if (mode==1)
	{
		sound=wav_in(fin, &channels, &samplecount, &samplerate);					// Sound input
		log_file("Read sound...");
		
		#ifdef DEBUG
		printf("samplecount : %i\nchannels : %i\n", samplecount, channels);
		#endif

		settingsinput(&Ysize, samplecount, &samplerate, &basefreq, maxfreq, &pixpersec, &bpo, Xsize, 0);	// User settings input
		image = anal(sound[0], samplecount, samplerate, &Xsize, Ysize, bpo, pixpersec, basefreq);	// Analysis
		if (brightness!=1.0)
			brightness_control(image, Ysize, Xsize, 1.0/brightness);
		bmp_out(fout, image, Ysize, Xsize);								// Image output
	}
	if (mode==2 || mode==3)
	{
		sound = calloc (1, sizeof(double *));
		image = bmp_in(fin, &Ysize, &Xsize);							// Image input

		if (format_param==0)				// if the output format parameter is undefined
			if (quiet==0)				// if prompting is allowed
				format_param = wav_out_param();
			else
				format_param = 32;		// default is 32

		settingsinput(&Ysize, samplecount, &samplerate, &basefreq, maxfreq, &pixpersec, &bpo, Xsize, 1);	// User settings input

		if (brightness!=1.0) brightness_control(image, Ysize, Xsize, brightness);

		if (mode==2)
			sound[0] = synt_sine(image, Xsize, Ysize, &samplecount, samplerate, basefreq, pixpersec, bpo);	// Sine synthesis
		else
			sound[0] = synt_noise(image, Xsize, Ysize, &samplecount, samplerate, basefreq, pixpersec, bpo);	// Noise synthesis

		wav_out(fout, sound, 1, samplecount, samplerate, format_param);
	}

	clockb=gettime();
	printf("Processing time : %.3f s\n", (double) (clockb-clocka)/1000.0); 

	win_return();

	return 0;
}