Chord Chord::getTransposedVersion(int semitones) const { if (semitones == 0) return Chord(getChordText(), getBeat()); QString newRootKey = getTransposedRoot(getRootKey(), semitones); QString newChordText = newRootKey; if (hasLettersAfterRoot()) newChordText += getLettersAfterRoot(); if (hasLastPart()) newChordText += getLastPart(); if (hasBassInversion()) { QString newBassInversionRoot = getTransposedRoot(getBassInversion(), semitones); newChordText += "/" + newBassInversionRoot; } return Chord(newChordText, getBeat()); }
void MapGenerator::generateMap(const char* songname) { AudioEngine::getInstance()->createNRT(songname); AudioEngine::getInstance()->playNRT(); std::string mapname = songname; int type = 0; for (int i = 1; i <= 9; i++) for (int j = 1; j <= 9; j++) UseMap[i][j] = 0; mapname = FileUtils::getInstance()->getWritablePath() + mapname.substr(mapname.find_last_of('/') + 1, mapname.find_last_of('.') - mapname.find_last_of('/') - 1) + ".gnm"; fout = fopen(mapname.c_str(), "w");//打开测试谱面 while (AudioEngine::getInstance()->isPlaying()) { AudioEngine::getInstance()->update(); for (int i = 1; i <= 9; i++) for (int j = 1; j <= 9; j++) if (UseMap[i][j] > 0) UseMap[i][j]--; beatBar = getBeat(); if (beatBar<0) lastBeatBar = -99; else if (beatTick - lastbeatTick > BEAT_MINLASTTIME)//过了最小生成时间 { if (beatBar == lastBeatBar)//beat频域完全相同则是长按 { type = 1; } else if (beatBar <= lastBeatBar + 3 && beatBar >= lastBeatBar - 3)//频域差别不大则是滑动 { type = 2; } else//否则点击 { writeNoteline(type, beatTick - lastbeatTick); log("%d %d", beatTick, beatBar); lastbeatTick = beatTick; type = 0; } lastBeatBar = beatBar; } } fclose(fout); }