摘自一个MILLION SONG DATASET里的一段读取基于HDF5文件格式的歌曲信息

摘自:http://labrosa.ee.columbia.edu/millionsong/

直接上代码,小修改了一下,保证了在VS2015中可以编译通过,注意使用DLL方式链接HDF5库时,需要在工程的宏定义中定义H5_BUILT_AS_DYNAMIC_LIB,否则会找不到定义。

This is correct, define H5_BUILT_AS_DYNAMIC_LIB to link with dynamic libs. This 
is a new requirement with 1.8.16 in order to publish the static and shared 
libs in one binary. The examples worked because you likely used the CMake 
script which knows how to import CMake built binaries. 
Because you are using VS without CMake, you need to add the define for shared 
libs. 


hdf5_getters.h

/** 
 Thierry Bertin-Mahieux (2010) Columbia University
 tb2332@columbia.edu

 Code to access fields of a MSD HDF5 song file.

 This is part of the Million Song Dataset project from
 LabROSA (Columbia University) and The Echo Nest.


 Copyright 2011, Thierry Bertin-Mahieux

 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include <string>
#include <vector>

#include "H5Cpp.h"
using namespace H5;

#define uint unsigned int
// max characters of a field
#define FIELDLEN 128

class HDF5Getters {

 private:
  
  // file
  H5File* h5file;

  // the 3 groups
  Group GROUP_METADATA;
  Group GROUP_ANALYSIS;
  Group GROUP_MUSICBRAINZ;

  // utility functions
  static double get_member_double(const Group& group,
				  const std::string name_member);
  static int get_member_int(const Group& group,
			    const std::string name_member);
  static std::string get_member_str(const Group& group,
				    const std::string name_member,
				    uint buffer_length=1024);
  static void get_member_double_array(const Group& group,
				      const std::string name_member,
				      std::vector<double>& result);
  static void get_member_double_12_array(const Group& group,
					 const std::string name_member,
					 std::vector<double>& result);
  static void get_member_str_array(const Group& group,
				   const std::string name_member,
				   std::vector<std::string>& result,
				   uint word_length=1026);


 public:

  // constructor
  HDF5Getters(const char filename[]);

  // destructor
  ~HDF5Getters();

  // get the number of songs
  int get_num_songs() const;

  // members
  double get_artist_familiarity() const;
  double get_artist_hotttnesss() const;
  std::string get_artist_id() const;
  std::string get_artist_mbid() const;
  int get_artist_playmeid() const;
  int get_artist_7digitalid() const;
  double get_artist_latitude() const;
  double get_artist_longitude() const;
  std::string get_artist_location() const;
  std::string get_artist_name() const;
  std::string get_release() const;
  int get_release_7digitalid() const;
  std::string get_song_id() const;
  double get_song_hotttnesss() const;
  std::string get_title() const;
  int get_track_7digitalid() const;
  double get_analysis_sample_rate() const;
  std::string get_audio_md5() const;
  double get_danceability() const;
  double get_duration() const;
  double get_end_of_fade_in() const;
  double get_energy() const;
  int get_key() const;
  double get_key_confidence() const;
  double get_loudness() const;
  int get_mode() const;
  double get_mode_confidence() const;
  double get_start_of_fade_out() const;
  double get_tempo() const;
  int get_time_signature() const;
  double get_time_signature_confidence() const;
  std::string get_track_id() const;
  int get_year() const;
  void get_artist_terms_freq(std::vector<double>&) const;
  void get_artist_terms_weight(std::vector<double>&) const;
  void get_segments_start(std::vector<double>&) const;
  void get_segments_confidence(std::vector<double>&) const;
  void get_segments_loudness_max(std::vector<double>&) const;
  void get_segments_loudness_max_time(std::vector<double>&) const;
  void get_segments_loudness_start(std::vector<double>&) const;
  void get_sections_start(std::vector<double>&) const;
  void get_sections_confidence(std::vector<double>&) const;
  void get_beats_start(std::vector<double>&) const;
  void get_beats_confidence(std::vector<double>&) const;
  void get_bars_start(std::vector<double>&) const;
  void get_bars_confidence(std::vector<double>&) const;
  void get_tatums_start(std::vector<double>&) const;
  void get_tatums_confidence(std::vector<double>&) const;
  void get_artist_mbtags_count(std::vector<double>&) const;
  void get_segments_timbre(std::vector<double>&) const;
  void get_segments_pitches(std::vector<double>&) const;
  void get_artist_terms(std::vector<std::string>&) const;
  void get_artist_mbtags(std::vector<std::string>&) const;
  void get_similar_artists(std::vector<std::string>&) const;
};

hdf5_getters.cc

/** 
 Thierry Bertin-Mahieux (2010) Columbia University
 tb2332@columbia.edu

 Code to access fields of a MSD HDF5 song file.

 This is part of the Million Song Dataset project from
 LabROSA (Columbia University) and The Echo Nest.


 Copyright 2011, Thierry Bertin-Mahieux

 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef __HDF5_GETTERS__
#define __HDF5_GETTERS__

#include <iostream>
#include <string>
#include <cstring>

#include "H5Cpp.h"
using namespace H5;

#include "hdf5_hl.h"
#include "hdf5_getters.h"

// max characters of a field
//#define FIELDLEN 128

HDF5Getters::HDF5Getters(const char filename[]) {

  // open the file
  const H5std_string h5filename(filename);
  h5file = new H5File(h5filename, H5F_ACC_RDONLY);

  // create the 3 groups' names
  const H5std_string NAME_GROUP_METADATA("metadata");
  const H5std_string NAME_GROUP_ANALYSIS("analysis");
  const H5std_string NAME_GROUP_MUSICBRAINZ("musicbrainz");

  // open the 3 groups
  GROUP_METADATA = h5file->openGroup( NAME_GROUP_METADATA );
  GROUP_ANALYSIS = h5file->openGroup( NAME_GROUP_ANALYSIS );
  GROUP_MUSICBRAINZ = h5file->openGroup( NAME_GROUP_MUSICBRAINZ );

}

/*
 * Destructor
 */
HDF5Getters::~HDF5Getters() {
  // Groups
  GROUP_METADATA.close();
  GROUP_ANALYSIS.close();
  GROUP_MUSICBRAINZ.close();
  // File
  h5file->close();
  delete h5file;
}

/*
 * Get Artist familiarity
 */
double HDF5Getters::get_artist_familiarity() const {
  return get_member_double( GROUP_METADATA, "artist_familiarity");
}

/*
 * Get Artist hotttnesss
 */
double HDF5Getters::get_artist_hotttnesss() const {
  return get_member_double( GROUP_METADATA, "artist_hotttnesss");
}

/*
 * Get Artist ID
 */
std::string HDF5Getters::get_artist_id() const {
  return get_member_str( GROUP_METADATA, "artist_id");
}

/*
 * Get Artist musicbrainz ID.
 */
std::string HDF5Getters::get_artist_mbid() const {
  return get_member_str( GROUP_METADATA, "artist_mbid");
}

/*
 * Get Artist musicbrainz Playme ID.
 */
int HDF5Getters::get_artist_playmeid() const {
  return get_member_int( GROUP_METADATA, "artist_playmeid");
}

/*
 * Get Artist 7digital ID.
 */
int HDF5Getters::get_artist_7digitalid() const {
  return get_member_int( GROUP_METADATA, "artist_7digitalid");
}

/*
 * Get Artist latitude
 */
double HDF5Getters::get_artist_latitude() const {
  return get_member_double( GROUP_METADATA, "artist_latitude");
}

/*
 * Get Artist longitude
 */
double HDF5Getters::get_artist_longitude() const {
  return get_member_double( GROUP_METADATA, "artist_longitude");
}

/*
 * Get Artist location
 */
std::string HDF5Getters::get_artist_location() const {
  return get_member_str( GROUP_METADATA, "artist_location");
}

/*
 * Get Artist name
 */
std::string HDF5Getters::get_artist_name() const {
  return get_member_str( GROUP_METADATA, "artist_name");
}

/*
 * Get Release
 */
std::string HDF5Getters::get_release() const {
  return get_member_str( GROUP_METADATA, "release");
}

/*
 * Get Release 7digital ID.
 */
int HDF5Getters::get_release_7digitalid() const {
  return get_member_int( GROUP_METADATA, "release_7digitalid");
}

/*
 * Get Song ID
 */
std::string HDF5Getters::get_song_id() const {
  return get_member_str( GROUP_METADATA, "song_id");
}

/*
 * Get Song hotttnesss
 */
double HDF5Getters::get_song_hotttnesss() const {
  return get_member_double( GROUP_METADATA, "song_hotttnesss");
}

/*
 * Get Song ID
 */
std::string HDF5Getters::get_title() const {
  return get_member_str( GROUP_METADATA, "title");
}

/*
 * Get Track 7digital ID.
 */
int HDF5Getters::get_track_7digitalid() const {
  return get_member_int( GROUP_METADATA, "track_7digitalid");
}

/*
 * Get analysis sample rate
 */
double HDF5Getters::get_analysis_sample_rate() const {
  return get_member_double( GROUP_ANALYSIS, "analysis_sample_rate");
}

/*
 * Get Audio MD5
 */
std::string HDF5Getters::get_audio_md5() const {
  return get_member_str( GROUP_ANALYSIS, "audio_md5", 32);
}

/*
 * Get danceability
 */
double HDF5Getters::get_danceability() const {
  return get_member_double( GROUP_ANALYSIS, "danceability");
}

/*
 * Get duration
 */
double HDF5Getters::get_duration() const {
  return get_member_double( GROUP_ANALYSIS, "duration");
}

/*
 * Get end of fade in
 */
double HDF5Getters::get_end_of_fade_in() const {
  return get_member_double( GROUP_ANALYSIS, "end_of_fade_in");
}

/*
 * Get energy
 */
double HDF5Getters::get_energy() const {
  return get_member_double( GROUP_ANALYSIS, "energy");
}

/*
 * Get Key
 */
int HDF5Getters::get_key() const {
  return get_member_int( GROUP_ANALYSIS, "key");
}

/*
 * Get key confidence
 */
double HDF5Getters::get_key_confidence() const {
  return get_member_double( GROUP_ANALYSIS, "key_confidence");
}

/*
 * Get loudness
 */
double HDF5Getters::get_loudness() const {
  return get_member_double( GROUP_ANALYSIS, "loudness");
}

/*
 * Get mode
 */
int HDF5Getters::get_mode() const {
  return get_member_int( GROUP_ANALYSIS, "mode");
}

/*
 * Get mode confidence
 */
double HDF5Getters::get_mode_confidence() const {
  return get_member_double( GROUP_ANALYSIS, "mode_confidence");
}

/*
 * Get tempo
 */
double HDF5Getters::get_tempo() const {
  return get_member_double( GROUP_ANALYSIS, "tempo");
}

/*
 * Get start of fade out
 */
double HDF5Getters::get_start_of_fade_out() const {
  return get_member_double( GROUP_ANALYSIS, "start_of_fade_out");
}

/*
 * Get time signature
 */
int HDF5Getters::get_time_signature() const {
  return get_member_int( GROUP_ANALYSIS, "time_signature");
}

/*
 * Get time signature confidence
 */
double HDF5Getters::get_time_signature_confidence() const {
  return get_member_double( GROUP_ANALYSIS, "time_signature_confidence");
}

/*
 * Get Track ID
 */
std::string HDF5Getters::get_track_id() const {
  return get_member_str( GROUP_ANALYSIS, "track_id");
}

/*
 * Get year
 */
int HDF5Getters::get_year() const {
  return get_member_int( GROUP_MUSICBRAINZ, "year");
}

/*
 * Get artist terms freq.
 */
void HDF5Getters::get_artist_terms_freq(std::vector<double>& result) const {
  get_member_double_array( GROUP_METADATA,
			   "artist_terms_freq",
			   result);
}

/*
 * Get artist terms weight.
 */
void HDF5Getters::get_artist_terms_weight(std::vector<double>& result) const {
  get_member_double_array( GROUP_METADATA,
			   "artist_terms_weight",
			   result);
}

/*
 * Get segments start.
 */
void HDF5Getters::get_segments_start(std::vector<double>& result) const {
  get_member_double_array( GROUP_ANALYSIS,
			   "segments_start",
			   result);
}

/*
 * Get segments confidence.
 */
void HDF5Getters::get_segments_confidence(std::vector<double>& result) const {
  get_member_double_array( GROUP_ANALYSIS,
			   "segments_confidence",
			   result);
}

/*
 * Get segments loudness max.
 */
void HDF5Getters::get_segments_loudness_max(std::vector<double>& result) const {
  get_member_double_array( GROUP_ANALYSIS,
			   "segments_loudness_max",
			   result);
}

/*
 * Get segments loudness max time.
 */
void HDF5Getters::get_segments_loudness_max_time(std::vector<double>& result) const {
  get_member_double_array( GROUP_ANALYSIS,
			   "segments_loudness_max_time",
			   result);
}

/*
 * Get segments loudness max time.
 */
void HDF5Getters::get_segments_loudness_start(std::vector<double>& result) const {
  get_member_double_array( GROUP_ANALYSIS,
			   "segments_loudness_start",
			   result);
}

/*
 * Get sections start.
 */
void HDF5Getters::get_sections_start(std::vector<double>& result) const {
  get_member_double_array( GROUP_ANALYSIS,
			   "sections_start",
			   result);
}

/*
 * Get sections confidence.
 */
void HDF5Getters::get_sections_confidence(std::vector<double>& result) const {
  get_member_double_array( GROUP_ANALYSIS,
			   "sections_confidence",
			   result);
}

/*
 * Get beats start.
 */
void HDF5Getters::get_beats_start(std::vector<double>& result) const {
  get_member_double_array( GROUP_ANALYSIS,
			   "beats_start",
			   result);
}

/*
 * Get beats confidence.
 */
void HDF5Getters::get_beats_confidence(std::vector<double>& result) const {
  get_member_double_array( GROUP_ANALYSIS,
			   "beats_confidence",
			   result);
}

/*
 * Get bars start.
 */
void HDF5Getters::get_bars_start(std::vector<double>& result) const {
  get_member_double_array( GROUP_ANALYSIS,
			   "bars_start",
			   result);
}

/*
 * Get bars confidence.
 */
void HDF5Getters::get_bars_confidence(std::vector<double>& result) const {
  get_member_double_array( GROUP_ANALYSIS,
			   "bars_confidence",
			   result);
}

/*
 * Get tatums start.
 */
void HDF5Getters::get_tatums_start(std::vector<double>& result) const {
  get_member_double_array( GROUP_ANALYSIS,
			   "tatums_start",
			   result);
}

/*
 * Get tatums confidence.
 */
void HDF5Getters::get_tatums_confidence(std::vector<double>& result) const {
  get_member_double_array( GROUP_ANALYSIS,
			   "tatums_confidence",
			   result);
}

/**
 * Get artist musicbrainz tags count.
 */
void HDF5Getters::get_artist_mbtags_count(std::vector<double>& result) const
{
  get_member_double_array( GROUP_MUSICBRAINZ,
			   "artist_mbtags_count",
			   result);
}

/*
 * Get segments timbre.
 */
void HDF5Getters::get_segments_timbre(std::vector<double>& result) const {
  get_member_double_12_array( GROUP_ANALYSIS,
			      "segments_timbre",
			      result);
}

/*
 * Get segments pitches.
 */
void HDF5Getters::get_segments_pitches(std::vector<double>& result) const {
  get_member_double_12_array( GROUP_ANALYSIS,
			      "segments_pitches",
			      result);
}

/*
 * Get artist terms.
 */
void HDF5Getters::get_artist_terms(std::vector<std::string>& result) const {
  get_member_str_array( GROUP_METADATA,
			"artist_terms",
			result);
}

/*
 * Get artist mbtags.
 */
void HDF5Getters::get_artist_mbtags(std::vector<std::string>& result) const {
  get_member_str_array( GROUP_MUSICBRAINZ,
			"artist_mbtags",
			result);
}

/*
 * Get similar artists.
 */
void HDF5Getters::get_similar_artists(std::vector<std::string>& result) const {
  get_member_str_array( GROUP_METADATA,
			"similar_artists",
			result,
			20);
}


/***************** UTITITY FUNCTIONS *******************/

/*
 * To get a double member from a given group;
 * dataset name is always 'songs'
 */
double HDF5Getters::get_member_double(const Group& group, const std::string name_member) {
  const H5std_string MEMBER( name_member );
  const CompType mtype( sizeof(double) );
  mtype.insertMember( MEMBER, 0, PredType::NATIVE_DOUBLE);
  DataSet dataset( group.openDataSet( "songs" ));
  double data_out = -1.;
  dataset.read( &data_out, mtype );
  dataset.close();
  return data_out;
}

/*
 * To get a int member from a given group;
 * dataset name is always 'songs'
 */
int HDF5Getters::get_member_int(const Group& group, const std::string name_member) {
  const H5std_string MEMBER( name_member );
  const CompType mtype( sizeof(int) );
  mtype.insertMember( MEMBER, 0, PredType::NATIVE_INT);
  DataSet dataset( group.openDataSet( "songs" ));
  int data_out = -1;
  dataset.read( &data_out, mtype );
  dataset.close();
  return data_out;
}

/*
 * To get a string member from a given group;
 * dataset name is always 'songs'
 */
std::string HDF5Getters::get_member_str(const Group& group,
					const std::string name_member,
					uint buffer_length) {
  const H5std_string MEMBER( name_member );
  DataSet dataset( group.openDataSet( "songs" ));

  // Figuring out the proper string type is a mess.
  CompType datasetcomptype(dataset);
  int memberidx = datasetcomptype.getMemberIndex( MEMBER );
  DataType dtype = datasetcomptype.getMemberDataType( memberidx );
  const CompType mtype( (size_t) 1024 );
  mtype.insertMember( MEMBER, 0, dtype);

  // Ideally we'd figure out the proper size!
  // Otherwise, let's have a buffer that is always big enough...
  char* buf = new char[buffer_length + 1];
  dataset.read( (void*) buf, mtype );
  dataset.close();
  buf[buffer_length] = '\0'; // HACK, some strings are not null-terminated.
  return std::string(buf);  
}

/*
 * To get a member which is an array of double;
 * result put in 'result';
 * dataset name is always 'songs'. 
 */
void  HDF5Getters::get_member_double_array(const Group& group,
					   const std::string name_member,
					   std::vector<double>& result)
{
  const H5std_string MEMBER( name_member );
  DataSet dataset( group.openDataSet( MEMBER ));

  hsize_t data_mem_size = dataset.getInMemDataSize();
  if (data_mem_size == 0) {
    dataset.close();
    return;
  }
  DataSpace filespace = dataset.getSpace();
  hsize_t dims[2]; 	// dataset dimensions
  filespace.getSimpleExtentDims( dims );

  int n_entries = dims[0];
  double* values = new double[n_entries];
  FloatType floattype(dataset);
  dataset.read((void*) values, floattype);
  dataset.close();

  result.clear();
  for (int k = 0; k < n_entries; ++k)
    {
      result.push_back(values[k]);
    }
}

/*
 * To get a member which is an array of array of size 12
 * (used for pitch and timbre features);
 * data is flatten segments first (i.e. first 12 values are from the
 * fist segments, etc).
 * result put in 'result';
 */
void  HDF5Getters::get_member_double_12_array(const Group& group,
					      const std::string name_member,
					      std::vector<double>& result)
{
  const H5std_string MEMBER( name_member );
  DataSet dataset( group.openDataSet( MEMBER ));

  hsize_t data_mem_size = dataset.getInMemDataSize();
  if (data_mem_size == 0) {
    dataset.close();
    return;
  }
  FloatType floattype(dataset);

  DataSpace filespace = dataset.getSpace();
  hsize_t dims[2]; 	// dataset dimensions
  int rank = filespace.getSimpleExtentDims( dims );
  DataSpace mspace1(rank, dims);

  int n_values = dims[0];
  auto values = new double[n_values][12]; // buffer for dataset to be read
  dataset.read(values, floattype, mspace1, filespace);
  dataset.close();

  result.clear();
  for (int row = 0; row < n_values; ++row)
	  for (int col = 0; col < 12; ++col) {
		  result.push_back(values[row][col]);
	  }
}

/*
 * To get a member which is an array of strings.
 * (used for tags for instance);
 * result put in 'result';
 */
void  HDF5Getters::get_member_str_array(const Group& group,
					const std::string name_member,
					std::vector<std::string>& result,
					uint word_length)
{
  const H5std_string MEMBER( name_member );
  DataSet dataset( group.openDataSet( MEMBER ));

  hsize_t data_mem_size = dataset.getInMemDataSize();
  if (data_mem_size == 0) {
    dataset.close();
    return;
  }
  DataSpace filespace = dataset.getSpace();
  hsize_t dims[2]; 	// dataset dimensions
  int rank = filespace.getSimpleExtentDims( dims );
  DataSpace mspace1(rank, dims);

  uint n_values = dims[0];
  char* values = new char[n_values * word_length];
  StrType stringtype(dataset);
  dataset.read(values, stringtype, mspace1, filespace);

  // We split the values
  char * pch;
  char * in_values = values;
  const char* delims = "\0";
  pch = strtok (in_values, delims);
  uint counter = 0;
  result.clear();
  while (counter < n_values)
  {
    result.push_back(std::string(pch));
    counter += 1;
    if (counter == n_values)
      break;

    // hack to remove the padding introduced by HDF5
    in_values += strlen(pch);
    while(*in_values == '\0')
      ++in_values;

    pch = strtok (in_values, delims);
    }

  dataset.close();
}

#endif // __HDF5_GETTERS__

hdf5_display.cc

/*
 Thierry Bertin-Mahieux (2010) Columbia University
 tb2332@columbia.edu

 Demo code to display all fields of a given MSD HDF5 song file.

 This is part of the Million Song Dataset project from
 LabROSA (Columbia University) and The Echo Nest.


 Copyright 2011, Thierry Bertin-Mahieux

 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <vector>
using namespace std;

#include "hdf5_getters.h"

/*
 * Help menu
 */
void help_menu(void) {
  
  cout << "hdf5_display" << endl;
  cout << "    by T. Bertin-Mahieux (2011) Columbia U." << endl;
  cout << "       tb2332@columbia.edu" << endl;
}


int main(int argc, const char* argv[]) {

  // help menu?
	if (argc < 2 || strcmp(argv[1], "help") == 0 || strcmp(argv[1], "-help") == 0)
	{
		help_menu();
		return 0;
	}

  // create wrapper
  HDF5Getters getters(argv[1]);
  
  // init values
  double dval;
  std::string sval;
  int ival;
  vector<double> dvec;
  vector<string> svec;

  // print everything!
  dval = getters.get_analysis_sample_rate();
  cout << "analysis_sample_rate: " << dval << endl;
  ival = getters.get_artist_7digitalid();
  cout << "artist_7digitalid: " << ival << endl;
  dval = getters.get_artist_familiarity();
  cout << "artist_familiarity: " << dval << endl;
  dval = getters.get_artist_hotttnesss();
  cout << "artist_hotttnesss: " << dval << endl;
  sval = getters.get_artist_id();
  cout << "artist_id: " << sval << endl;
  dval = getters.get_artist_latitude();
  cout << "artist_latitude: " << dval << endl;
  sval = getters.get_artist_location();
  cout << "artist_location: " << sval << endl;
  dval = getters.get_artist_longitude();
  cout << "artist_longitude: " << dval << endl;
  sval = getters.get_artist_mbid();
  cout << "artist_mbid: " << sval << endl;
  getters.get_artist_mbtags(svec);
  cout << "artist_mbtags: shape = (" << svec.size() << ",)" << endl;
  getters.get_artist_mbtags_count(dvec);
  cout << "artist_mbtags_count: shape = (" << dvec.size() << ",)" << endl;
  sval = getters.get_artist_name();
  cout << "artist_name: " << sval << endl;
  ival = getters.get_artist_playmeid();
  cout << "artist_playmeid: " << ival << endl;
  getters.get_artist_terms(svec);
  cout << "artist_terms: shape = (" << svec.size() << ",)" << endl;
  getters.get_artist_terms_freq(dvec);
  cout << "artist_terms_freq: shape = (" << dvec.size() << ",)" << endl;
  getters.get_artist_terms_weight(dvec);
  cout << "artist_terms_weight: shape = (" << dvec.size() << ",)" << endl;
  sval = getters.get_audio_md5();
  cout << "audio_md5: " << sval << endl;
  getters.get_bars_confidence(dvec);
  cout << "bars_confidence: shape = (" << dvec.size() << ",)" << endl;
  getters.get_bars_start(dvec);
  cout << "bars_start: shape = (" << dvec.size() << ",)" << endl;
  getters.get_beats_confidence(dvec);
  cout << "beats_confidence: shape = (" << dvec.size() << ",)" << endl;
  getters.get_beats_start(dvec);
  cout << "beats_start: shape = (" << dvec.size() << ",)" << endl;
  dval = getters.get_danceability();
  cout << "danceability: " << dval << endl;
  dval = getters.get_duration();
  cout << "duration: " << dval << endl;
  dval = getters.get_end_of_fade_in();
  cout << "end_of_fade_in: " << dval << endl;
  dval = getters.get_energy();
  cout << "energy: " << dval << endl;
  ival = getters.get_key();
  cout << "key: " << ival << endl;
  dval = getters.get_key_confidence();
  cout << "key_confidence: " << dval << endl;
  dval = getters.get_loudness();
  cout << "loudness: " << dval << endl;
  ival = getters.get_mode();
  cout << "mode: " << ival << endl;
  dval = getters.get_mode_confidence();
  cout << "mode_confidence: " << dval << endl;
  sval = getters.get_release();
  cout << "release: " << sval << endl;
  ival = getters.get_release_7digitalid();
  cout << "release_7digitalid: " << ival << endl;
  getters.get_sections_confidence(dvec);
  cout << "sections_confidence: shape = (" << dvec.size() << ",)" << endl;
  getters.get_sections_start(dvec);
  cout << "sections_start: shape = (" << dvec.size() << ",)" << endl;
  getters.get_segments_confidence(dvec);
  cout << "segments_confidence: shape = (" << dvec.size() << ",)" << endl;
  getters.get_segments_loudness_max(dvec);
  cout << "segments_loudness_max: shape = (" << dvec.size() << ",)" << endl;
  getters.get_segments_loudness_max_time(dvec);
  cout << "segments_loudness_max_time: shape = (" << dvec.size() << ",)" << endl;
  getters.get_segments_loudness_start(dvec);
  cout << "segments_loudness_start: shape = (" << dvec.size() << ",)" << endl;
  getters.get_segments_pitches(dvec);
  cout << "segments_pitches: shape = (" << dvec.size() / 12 << ", 12)" << endl;
  getters.get_segments_start(dvec);
  cout << "segments_start: shape = (" << dvec.size() << ",)" << endl;
  getters.get_segments_timbre(dvec);
  cout << "segments_timbre: shape = (" << dvec.size() / 12 << ", 12)" << endl;
  getters.get_similar_artists(svec);
  cout << "similar_artists: shape = (" << svec.size() << ",)" << endl;
  dval = getters.get_song_hotttnesss();
  cout << "song_hotttnesss: " << dval << endl;
  sval = getters.get_song_id();
  cout << "song_id: " << sval << endl;
  dval = getters.get_start_of_fade_out();
  cout << "start_of_fade_out: " << dval << endl;
  getters.get_tatums_confidence(dvec);
  cout << "tatums_confidence: shape = (" << dvec.size() << ",)" << endl;
  getters.get_tatums_start(dvec);
  cout << "tatums_start: shape = (" << dvec.size() << ",)" << endl;
  dval = getters.get_tempo();
  cout << "tempo: " << dval << endl;
  ival = getters.get_time_signature();
  cout << "time_signature: " << ival << endl;
  dval = getters.get_time_signature_confidence();
  cout << "time_signature_confidence: " << dval << endl;
  sval = getters.get_title();
  cout << "title: " << sval << endl;
  ival = getters.get_track_7digitalid();
  cout << "track_7digitalid: " << ival << endl;
  sval = getters.get_track_id();
  cout << "track_id: " << sval << endl;
  ival = getters.get_year();
  cout << "year: " << ival << endl;

  return 0; // succesfully terminated
}

测试:

@echo off

x64\Release\ReadHDF5.exe data\TRAAAAW128F429D538.h5

pause


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 百万歌曲数据集(Million Song Dataset)是一个包含细致音乐元数据和专业特征的大型公共数据集,由哥伦比亚大学计算机科学系和加州大学圣地亚哥分校计算机科学与工程系共同创建。该数据集包含超过100万首歌曲的数据,包括歌曲元数据、歌词、艺术家信息、音乐特征、歌曲时长等等。这些数据可以用于许多音乐相关的研究和应用,如音乐推荐、音乐分类、音乐情感识别等等。 ### 回答2: Million Song Dataset(百万首歌曲数据集)是一个由Columbia大学和Echo Nest合作创建的音乐数据库。它包含了一百万首不同风格和时期的歌曲,涵盖了多种流派和艺术家。这个数据集的目的是通过对歌曲元数据和音频特征进行大规模分析,从而提供音乐研究和相关应用的支持。 该数据集收集了各种信息,如歌曲标题,艺术家,时长,发行年份,以及一些音频特征,如节奏,音量,和音高等。这些信息可以被用来进行音乐推荐,流派分类,情绪分析,和音乐研究等的应用。 对于音乐研究者和音乐爱好者来说,Million Song Dataset一个宝贵的资源,因为它提供了大量的歌曲和相关数据,以支持他们的研究和音乐欣赏。研究者可以使用这个数据集来分析音乐的结构和模式,以了解音乐在不同文化和时期的变化趋势。而音乐爱好者则可以通过这个数据集来发现新的艺术家和流派,以及定制自己的音乐播放列表。 除了学术研究和音乐欣赏之外,Million Song Dataset还被用于开发音乐推荐系统和智能音乐应用。通过分析用户的音乐偏好和歌曲特征,这个数据集可以为用户提供个性化的音乐推荐。这种个性化的推荐可以大大提升用户体验,并帮助他们发现新的音乐。 总之,Million Song Dataset一个重要的音乐数据库,它为音乐研究、音乐欣赏和音乐应用的发展提供了强大的支持。它的存在为我们提供了一个更深入地了解音乐的机会,并推动了音乐技术的不断发展。 ### 回答3: Million Song Dataset(百万首歌曲数据集)是一个由哥伦比亚大学计算机科学系和The Echo Nest公司合作建立的音乐数据库。该数据集是一个包含百万首歌曲的综合性数据集,其中包含了丰富的音乐信息,包括歌曲的元数据、歌词、艺术家信息、音频特征等。 这个数据集的目的是通过收集和整理大量的音乐数据,为音乐研究、音乐信息检索、音乐推荐等领域提供基础数据支持。研究人员可以利用这个数据集来进行音乐分析和挖掘,从而深入了解音乐的特征、趋势和风格。 Million Song Dataset的特点之一是包含了多个来源的数据,这些数据涵盖了大量的音乐类型和风格,形成了一个非常丰富和多样化的音乐样本。除了音乐的元数据信息外,该数据集还利用音频处理技术提取了每首歌曲的音频特征,例如节奏、音高、音色等,这些特征使得研究人员可以通过计算机算法来探索音乐的相似性、模式和结构。 Million Song Dataset对于音乐研究、音乐推荐和个性化音乐服务等领域都有着重要的意义。通过分析海量的音乐数据,研究人员可以发现音乐的规律和趋势,从而对音乐进行更深入的理解和创新。此外,利用这个数据集还可以开发出更准确和个性化的音乐推荐系统,为用户提供更符合他们兴趣和喜好的音乐。 总之,Million Song Dataset一个致力于收集和整理大量音乐数据的项目。通过这个数据集,研究人员可以进行深入的音乐分析和挖掘,从而推动音乐研究的发展并提升音乐服务的质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值