diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4becb7496..647945c9f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -332,6 +332,7 @@ importers: bunyan: 1.8.15 commander: 9.0.0 connect-redis: 6.1.1 + csv-parse: ^5.0.3 deepmerge: 4.2.2 dotenv: 16.0.0 express: 4.18.2 @@ -400,6 +401,7 @@ importers: bunyan: 1.8.15 commander: 9.0.0 connect-redis: 6.1.1 + csv-parse: 5.0.4 deepmerge: 4.2.2 dotenv: 16.0.0 express: 4.18.2 diff --git a/server/package.json b/server/package.json index 079e3f4d7..f884aa811 100644 --- a/server/package.json +++ b/server/package.json @@ -63,6 +63,7 @@ "bunyan": "1.8.15", "commander": "9.0.0", "connect-redis": "6.1.1", + "csv-parse": "^5.0.3", "deepmerge": "4.2.2", "dotenv": "16.0.0", "express": "4.18.2", diff --git a/server/src/lib/score-import/import-types/file/wacca-mypage-scraper/class-handler.ts b/server/src/lib/score-import/import-types/file/wacca-mypage-scraper/class-handler.ts new file mode 100644 index 000000000..44b2fd90c --- /dev/null +++ b/server/src/lib/score-import/import-types/file/wacca-mypage-scraper/class-handler.ts @@ -0,0 +1,56 @@ +import ScoreImportFatalError from "../../../framework/score-importing/score-import-error"; +import { GetGamePTConfig } from "tachi-common"; +import type { ClassHandler } from "../../../framework/user-game-stats/types"; +import type { MyPagePlayerStage } from "./types"; + +const STAGES: Record = { + 1: "I", + 2: "II", + 3: "III", + 4: "IV", + 5: "V", + 6: "VI", + 7: "VII", + 8: "VIII", + 9: "IX", + 10: "X", + 11: "XI", + 12: "XII", + 13: "XIII", + 14: "XIV", +}; + +const waccaStageUpIds = GetGamePTConfig("wacca", "Single").classHumanisedFormat.stageUp.map( + (e) => e.id +); + +export function CreateMyPageScraperClassHandler(stage: MyPagePlayerStage): ClassHandler { + return (_game, _playtype, _userID, _ratings, logger) => { + // const classSet: GameClassSets["wacca:Single"] = "stageUp"; + + const stageName = STAGES[stage.id]; + + if (stageName === undefined) { + throw new ScoreImportFatalError(400, `Unknown stage up id ${stage.id}.`); + } + + if (`ステージ${stageName}` !== stage.name) { + logger.warn( + `Stage up ${stageName} with id ${stage.id} did not correspond to the CSV name ${stage.name}.` + ); + } + + const classIndex = waccaStageUpIds.indexOf(stageName); + + if (classIndex < 0) { + throw new ScoreImportFatalError( + 500, + `Can't find index for stageUp class id ${stageName}.` + ); + } + + return { + stageUp: classIndex, + }; + }; +} diff --git a/server/src/lib/score-import/import-types/file/wacca-mypage-scraper/converter.test.ts b/server/src/lib/score-import/import-types/file/wacca-mypage-scraper/converter.test.ts new file mode 100644 index 000000000..c91b62f6f --- /dev/null +++ b/server/src/lib/score-import/import-types/file/wacca-mypage-scraper/converter.test.ts @@ -0,0 +1 @@ +import ConvertMyPageScraperRecordsCSV from "./converter"; diff --git a/server/src/lib/score-import/import-types/file/wacca-mypage-scraper/converter.ts b/server/src/lib/score-import/import-types/file/wacca-mypage-scraper/converter.ts new file mode 100644 index 000000000..68547569f --- /dev/null +++ b/server/src/lib/score-import/import-types/file/wacca-mypage-scraper/converter.ts @@ -0,0 +1,119 @@ +import { + InternalFailure, + InvalidScoreFailure, + KTDataNotFoundFailure, +} from "lib/score-import/framework/common/converter-failures"; +import { GenericGetGradeAndPercent } from "lib/score-import/framework/common/score-utils"; +import { FindChartWithPTDF } from "utils/queries/charts"; +import { FindSongOnTitle } from "utils/queries/songs"; +import type { ConverterFunction } from "../../common/types"; +import type { MyPageRecordsParsedPB } from "./types"; +import type { DryScore } from "lib/score-import/framework/common/types"; +import type { Difficulties, Lamps } from "tachi-common"; +import type { EmptyObject } from "utils/types"; + +const DIFFICULTIES: Array = ["NORMAL", "HARD", "EXPERT", "INFERNO"]; + +const LAMPS: Record = { + 0: "FAILED", + 1: "CLEAR", + 2: "MISSLESS", + 3: "FULL COMBO", + 4: "ALL MARVELOUS", +}; + +const ConvertMyPageScraperRecordsCSV: ConverterFunction< + MyPageRecordsParsedPB, + EmptyObject +> = async (data, context, importType, logger) => { + // If we can verify that songId matches in-game (data) id, we should use that instead. + const song = await FindSongOnTitle("wacca", data.songTitle); + + if (song === null) { + throw new KTDataNotFoundFailure( + `Could not find song for ${data.songTitle}.`, + importType, + data, + context + ); + } + + const difficulty = DIFFICULTIES[data.diffIndex]; + + if (difficulty === undefined) { + throw new InternalFailure(`We somehow got an invalid difficulty index ${data.diffIndex}.`); + } + + const humanisedChartTitle = `${song.title} [${difficulty}]`; + + const chart = await FindChartWithPTDF("wacca", song.id, "Single", difficulty); + + if (chart === null) { + throw new KTDataNotFoundFailure( + `Could not find chart for ${humanisedChartTitle}.`, + importType, + data, + context + ); + } + + if (chart.level !== data.level) { + throw new InvalidScoreFailure( + `${humanisedChartTitle} - Should be level ${chart.level}, but found level ${data.level}.` + ); + } + + if (data.score > 1_000_000) { + throw new InvalidScoreFailure( + `${humanisedChartTitle} - Invalid score of ${data.score} (was greater than 1,000,000).` + ); + } + + const lamp = LAMPS[data.lamp]; + + if (lamp === undefined) { + logger.info(`Invalid lamp of ${data.lamp} provided.`); + throw new InvalidScoreFailure(`${humanisedChartTitle} - Invalid lamp of ${data.lamp}.`); + } + + if (data.score === 1_000_000 && lamp !== "ALL MARVELOUS") { + throw new InvalidScoreFailure( + `MASTER score of ${data.score}, but lamp ${lamp} is not ALL MARVELOUS.` + ); + } + + if (lamp === "ALL MARVELOUS" && data.score !== 1_000_000) { + throw new InvalidScoreFailure( + `AM lamp ${lamp}, but score is ${data.score}, not 1,000,000.` + ); + } + + const { percent, grade } = GenericGetGradeAndPercent("wacca", data.score, chart); + + const dryScore: DryScore<"wacca:Single"> = { + service: "mypage-scraper", + game: "wacca", + scoreMeta: {}, + + // This is really a PB, not an individual score, so it does not have a timestamp. + timeAchieved: null, + comment: null, + importType, + scoreData: { + score: data.score, + lamp, + percent, + grade, + judgements: {}, + hitMeta: {}, + }, + }; + + logger.verbose( + `Returning dryscore with ${dryScore.scoreData.score} for ${humanisedChartTitle}` + ); + + return { chart, song, dryScore }; +}; + +export default ConvertMyPageScraperRecordsCSV; diff --git a/server/src/lib/score-import/import-types/file/wacca-mypage-scraper/parser.test.ts b/server/src/lib/score-import/import-types/file/wacca-mypage-scraper/parser.test.ts new file mode 100644 index 000000000..9cf6d8ef7 --- /dev/null +++ b/server/src/lib/score-import/import-types/file/wacca-mypage-scraper/parser.test.ts @@ -0,0 +1,28 @@ +import { ParseMyPageScraperRecordsCsv } from "./parser"; +import CreateLogCtx from "lib/logger/logger"; +import ScoreImportFatalError from "lib/score-import/framework/score-importing/score-import-error"; +import t from "tap"; +import { MockMulterFile } from "test-utils/mock-multer"; +import { TestingWaccaMyPageScraperRecordsCSV } from "test-utils/test-data"; +import type { MyPageRecordsParsedPB } from "./types"; + +const logger = CreateLogCtx(__filename); + +t.test("#ParseMyPageScraperRecordsCSV", (t) => { + t.test("Valid CSV", (t) => { + const file = MockMulterFile(TestingWaccaMyPageScraperRecordsCSV, "score.csv"); + const { iterable, game } = ParseMyPageScraperRecordsCsv(file, {}, logger); + + t.equal(game, "wacca"); + + const iterableData = iterable as Array; + + // There are more than 280 lines in the file, but this includes song that are + // never played. The actual number of charts with (non-zero) PBs is 280. + t.equal(iterableData.length, 280); + + t.end(); + }); + + t.end(); +}); diff --git a/server/src/lib/score-import/import-types/file/wacca-mypage-scraper/parser.ts b/server/src/lib/score-import/import-types/file/wacca-mypage-scraper/parser.ts new file mode 100644 index 000000000..892d9e4f7 --- /dev/null +++ b/server/src/lib/score-import/import-types/file/wacca-mypage-scraper/parser.ts @@ -0,0 +1,168 @@ +import { CreateMyPageScraperClassHandler } from "./class-handler"; +import ScoreImportFatalError from "../../../framework/score-importing/score-import-error"; +import { parse, CsvError } from "csv-parse/sync"; +import p from "prudence"; +import type { ParserFunctionReturns } from "../../common/types"; +import type { MyPageRecordsRawCsvRecord, MyPageRecordsParsedPB } from "./types"; +import type { KtLogger } from "lib/logger/logger"; +import type { PrudenceSchema } from "prudence"; +import type { EmptyObject } from "utils/types"; + +// This should match MyPageRecordsRawCsvRecord. +const RECORDS_CSV_SCHEMA: PrudenceSchema = { + music_id: "string", + music_title: "string", + music_levels: "string", + music_scores: "string", + music_achieves: "string", +}; + +const ARRAY_REGEX = /\[(.+?),(.+?),(.+?)(?:,(.+?))?\]/u; + +function parseCsvArray(csvString: string): Array { + const matches = ARRAY_REGEX.exec(csvString); + + if (matches === null) { + return []; + } + + const ret: Array = []; + + // index 0 is the whole match, see the docs for RegExp.exec() + + for (let i = 1; i <= 4; i++) { + const match = matches[i]; + + if (typeof match === "undefined") { + // match group 4 can be missing if the array only has 3 elements + break; + } + + ret.push(match); + } + + return ret; +} + +export function ParseMyPageScraperRecordsCsv( + fileData: Express.Multer.File, + _body: Record, + _logger: KtLogger +): ParserFunctionReturns { + let rawCsvRecords: Array; + + try { + rawCsvRecords = parse(fileData.buffer, { columns: true }) as Array; + } catch (err) { + if (err instanceof CsvError) { + throw new ScoreImportFatalError(400, `Failed to parse CSV: ${err.message}`); + } + + throw err; + } + + for (const rawRecord of rawCsvRecords) { + const err = p(rawRecord, RECORDS_CSV_SCHEMA, {}, { allowExcessKeys: true }); + + if (err) { + throw new ScoreImportFatalError(400, `Malformed CSV, invalid columns: ${err.message}`); + } + } + + const csvRecords = rawCsvRecords as Array; + + const iterable: Array = []; + + for (const csvRecord of csvRecords) { + const levels = parseCsvArray(csvRecord.music_levels); + const scores = parseCsvArray(csvRecord.music_scores); + const lamps = parseCsvArray(csvRecord.music_achieves); + + for (const [diffIndex, level] of levels.entries()) { + if (level === "0") { + // This indicates that the song has no inferno. + continue; + } + + const score = Number(scores[diffIndex]); + + if (score === 0) { + // This inidcates no play, let's not create a PB. + continue; + } + + iterable.push({ + songId: Number(csvRecord.music_id), + songTitle: csvRecord.music_title, + diffIndex, + level, + score, + lamp: Number(lamps[diffIndex]), + }); + } + } + + return { + iterable, + context: {}, + game: "wacca", + classHandler: null, + }; +} + +export function ParseMyPageScraperPlayerCsv( + fileData: Express.Multer.File, + _body: Record, + _logger: KtLogger +): ParserFunctionReturns { + let csvRecords: Array>; + + try { + csvRecords = parse(fileData.buffer, { columns: true }) as Array>; + } catch (err) { + if (err instanceof CsvError) { + throw new ScoreImportFatalError(400, `Failed to parse CSV: ${err.message}`); + } + + throw err; + } + + const csvRecord = csvRecords[0]; + + // It's impossible for this to be (false || true), but we need the second one to satisfy TS. + + if (csvRecords.length !== 1 || csvRecord === undefined) { + throw new ScoreImportFatalError( + 400, + `Found ${csvRecords.length} records instead of exactly 1 in the player CSV.` + ); + } + + const stageArrayString = csvRecord.player_stage; + + if (stageArrayString === undefined) { + throw new ScoreImportFatalError(400, `Malformed CSV: no player_stage column.`); + } + + // The first element is the full match, the next 3 elements are the groups. + const matches = /\[(\d+),(.+?),(\d+)\]/u.exec(stageArrayString) as + | [string, string, string, string] + | null; + + if (matches === null) { + throw new ScoreImportFatalError(400, `Malformed player_stage entry.`); + } + + const stage = { + id: Number(matches[1]), + name: matches[2], + grade: Number(matches[3]), + }; + + return { + iterable: [], + context: {}, + game: "wacca", + classHandler: CreateMyPageScraperClassHandler(stage), + }; +} diff --git a/server/src/lib/score-import/import-types/file/wacca-mypage-scraper/types.ts b/server/src/lib/score-import/import-types/file/wacca-mypage-scraper/types.ts new file mode 100644 index 000000000..625bf457b --- /dev/null +++ b/server/src/lib/score-import/import-types/file/wacca-mypage-scraper/types.ts @@ -0,0 +1,31 @@ +export interface MyPageRecordsRawCsvRecord { + + // These are snake case in the CSV. The first line of the CSV is: + // music_id,music_title,music_artist,music_genre,music_levels,music_play_counts,music_scores,music_achieves + // We only care about these fields. Currently we use music_title but + // we should switch to music_id once it's confirmed to match data. + music_id: string; + music_title: string; + music_levels: string; + music_scores: string; + music_achieves: string; +} + +export interface MyPageRecordsParsedPB { + songId: number; + songTitle: string; + diffIndex: number; + level: string; + score: number; + lamp: number; +} + +export interface MyPagePlayerStage { + + // https://github.com/XezolesS/WaccaMyPageScraper/blob/acebe4b655eb09b3ddbc15802dd948d5f9c5e0d3/WaccaMyPageScraper/Data/Stage.cs + id: number; + name: string; + + // Note: grade (blue/silver/gold) is currently ignored by Tachi. + grade: number; +} diff --git a/server/src/test-utils/test-data.ts b/server/src/test-utils/test-data.ts index bd44d7f2b..52b3a7958 100644 --- a/server/src/test-utils/test-data.ts +++ b/server/src/test-utils/test-data.ts @@ -542,6 +542,10 @@ export const TestingSDVXEamusementCSV = GetKTDataBuffer( "./eamusement-sdvx-csv/exceed-gear-score.csv" ); +export const TestingWaccaMyPageScraperRecordsCSV = GetKTDataBuffer( + "./wacca-mypage-scraper/records.csv" +); + export const TestingBarbatosScore: BarbatosScore = { difficulty: 1, level: 10, diff --git a/server/src/test-utils/test-data/wacca-mypage-scraper/records.csv b/server/src/test-utils/test-data/wacca-mypage-scraper/records.csv new file mode 100755 index 000000000..935726204 --- /dev/null +++ b/server/src/test-utils/test-data/wacca-mypage-scraper/records.csv @@ -0,0 +1,359 @@ +music_id,music_title,music_artist,music_genre,music_levels,music_play_counts,music_scores,music_achieves +3030,ヒトガタ,HIMEHINA,0,"[3,9+,12,0]","[0,0,2]","[0,0,994009]","[0,0,2]" +2240,メニメニマニマニ,高宮なすの(鳴海杏子),0,"[3,7+,12,0]","[0,0,2]","[0,0,982503]","[0,0,2]" +2204,叩ケ 叩ケ 手ェ叩ケ,SIRO,0,"[2,7,12,13+]","[0,0,3,1]","[0,0,992703,960000]","[0,0,2,1]" +2228,Fly to NEW WORLD,ミライアカリ,0,"[3,8,12,0]","[0,0,4]","[0,0,999632]","[0,0,3]" +2227,透明声彩,YuNi,0,"[3,7,11+,0]","[0,0,0]","[0,0,0]","[0,0,0]" +3023,うっせぇわ,Ado,0,"[3,9,12,13]","[0,0,5,3]","[0,0,998705,975309]","[0,0,3,1]" +3003,Fam☆Fam☆Time!,ド葛本社,0,"[3,8,11+,0]","[0,0,4]","[0,0,998762]","[0,0,3]" +2253,cœur,Polaris「アズールレーン」より,0,"[3,8+,12+,0]","[0,0,1]","[0,0,983605]","[0,0,2]" +2254,私はNo 1!,サンディエゴ(CV:伊藤あすか)「アズールレーン」より,0,"[3,8,12,0]","[0,0,1]","[0,0,988271]","[0,0,2]" +2252,ソロモン・ナイト,「アズールレーン」より,0,"[3,7+,13,0]","[0,0,6]","[0,0,992177]","[0,0,2]" +2243,LOVE!HUG!GROOVY!!,Happy Around!&Peaky P-key 「D4DJ Groovy Mix」より,0,"[4,8+,12,13]","[0,0,1,10]","[0,0,945598,994495]","[0,0,1,2]" +2244,Dig Delight!,Happy Around! 「D4DJ Groovy Mix」より,0,"[3,8,11,0]","[0,1,7]","[0,917176,996644]","[0,1,3]" +2245,電乱★カウントダウン,Peaky P-key 「D4DJ Groovy Mix」より,0,"[4,7+,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2246,Photon Melodies,Photon Maiden 「D4DJ Groovy Mix」より,0,"[3,7+,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2251,ぐるぐるDJ TURN!!,Happy Around! feat. KYOKO & SAKI 「D4DJ Groovy Mix」より,0,"[4,10,12+,0]","[0,0,2]","[0,0,986321]","[0,0,2]" +2058,sister's noise,fripSide,0,"[2,6,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2202,なだめスかし Negotiation,鹿乃と宇崎ちゃん,0,"[3,7+,11+,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1219,サクリファイス,まふまふ,0,"[3,9,12,0]","[0,0,1]","[0,0,978901]","[0,0,2]" +2203,非実在系女子たちはどうすりゃいいですか?,綾瀬理恵,0,"[3,8,12,0]","[0,0,10]","[0,0,997875]","[0,0,3]" +2021,ぺこみこ大戦争!!,REDALiCE feat. 兎田ぺこら&さくらみこ,0,"[4,8,11,13]","[0,0,1,10]","[0,0,991066,993067]","[0,0,3,2]" +2024,Say!ファンファーレ!,白上フブキ,0,"[3,8,12,0]","[0,0,1]","[0,0,994868]","[0,0,2]" +2067,NEXT COLOR PLANET,星街すいせい,0,"[2,7,12,0]","[0,0,2]","[0,0,991410]","[0,0,2]" +2066,夢見る空へ,hololive IDOL PROJECT,0,"[2,7+,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1204,お願いマッスル,紗倉ひびき(CV:ファイルーズあい)&街雄鳴造(CV:石川界人),0,"[1,7+,10+,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2043,マッチョアネーム?,街雄鳴造(CV:石川界人),0,"[2,6,12+,0]","[0,0,4]","[0,0,980471]","[0,0,1]" +2001,秒針を噛む,ずっと真夜中でいいのに。,0,"[2,6+,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1020,ないものねだり,KANA-BOON,0,"[2,7+,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1008,HOT LIMIT,T.M.Revolution,0,"[3,7+,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2023,キラメキライダー☆,hololive IDOL PROJECT,0,"[2,7,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2002,ガヴリールドロップキック,ガヴリール(CV:富田美憂)、ヴィーネ(CV:大西沙織)、サターニャ(CV:大空直美)、ラフィエル(CV:花澤香菜),0,"[3,6+,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2003,This game,鈴木このみ,0,"[2,7,10+,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1264,RAGE OF DUST,SPYAIR,0,"[3,8,9,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2030,Make it!,i☆Ris,0,"[1,5,9,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2028,Make it! (DJ Genki Remix),i☆Ris,0,"[3,7+,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2031,キラッとスタート,"Run Girls, Run!",0,"[2,7,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2027,キラッとスタート (USAO Remix),"Run Girls, Run!",0,"[4,8,12,0]","[0,0,9]","[0,0,998442]","[0,0,2]" +2029,ハート♥イロ♥トリドリ〜ム,彩瀬なる(CV.加藤英美里),0,"[1,6,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1206,ダダダダ天使,ナナヲアカリ,0,"[3,7+,12,0]","[0,0,2]","[0,0,944299]","[0,0,1]" +1205,青空のラプソディ,fhána,0,"[2,6+,9,11]","[0,0,0,1]","[0,0,0,993529]","[0,0,0,2]" +1238,Bravely You,Lia,0,"[1,6,9,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1236,ぼなぺてぃーと♡S,ブレンド・A,0,"[2,7+,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1237,デタラメなマイナスとプラスにおけるブレンド考,ブレンド・A,0,"[2,5+,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1092,輪廻転生,まふまふ,0,"[3,9,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1114,ストライク・ザ・ブラッド,岸田教団&THE明星ロケッツ,0,"[3,8+,11+,0]","[0,1,0]","[0,972887,0]","[0,2,0]" +1021,新宝島,サカナクション,0,"[1,6,9,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1203,U.S.A.,DA PUMP,0,"[2,7,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1269,Shiny Smily Story,hololive IDOL PROJECT,0,"[3,6,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1270,Dream☆Story,ときのそら,0,"[2,7,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1273,without U,AZKi,0,"[3,7,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1218,シャルル,バルーン,0,"[3,7,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1113,オドループ,フレデリック,0,"[3,7+,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1009,only my railgun,fripSide,0,"[3,6+,9,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1091,残酷な天使のテーゼ,高橋洋子,0,"[1,5,9,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1018,ただ君に晴れ,ヨルシカ,0,"[3,7,9,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1098,AIAIAI (feat. 中田ヤスタカ),Kizuna AI,0,"[1,6,9,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1109,"Hello, Morning",Kizuna AI,0,"[2,7,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1124,Raise Your Heart!!,亜咲花,0,"[3,7,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1125,SHINY DAYS,亜咲花,0,"[1,5,9,0]","[0,0,0]","[0,0,0]","[0,0,0]" +26,回レ!雪月花,歌組雪月花(夜々(原田ひとみ)・いろり(茅野愛衣)・小紫(小倉唯)),0,"[2,8,11,13+]","[0,0,2,14]","[0,0,978750,995913]","[0,0,2,2]" +1095,ファッとして桃源郷,新庄かなえ(三森すずこ),0,"[3,9,12,0]","[0,0,1]","[0,0,990301]","[0,0,2]" +1089,TOMORROW,Machico,0,"[3,8,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +3048,メルト,supercell,1,"[3,8+,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +3049,天樂,ゆうゆ,1,"[3,8,12+,0]","[0,0,2]","[0,0,990283]","[0,0,2]" +3050,吉原ラメント,亜沙,1,"[3,8,12,0]","[0,0,1]","[0,0,941956]","[0,0,1]" +1032,ワールズエンド・ダンスホール,wowaka,1,"[3,8,12,0]","[0,0,2]","[0,0,979372]","[0,0,1]" +2238,炉心融解,iroha,1,"[2,8,12,0]","[0,0,3]","[0,0,995041]","[0,0,3]" +3025,∞(2018Remake),cosMo@暴走P feat.初音ミク,1,"[3,8+,13+,0]","[0,0,1]","[0,0,922685]","[0,0,1]" +3035,ちがう!!!,ダイナミック自演ズ,1,"[4,9+,12,0]","[0,0,1]","[0,0,959708]","[0,0,1]" +3026,おねがいダーリン,OИE (song by ナナホシ管弦楽団),1,"[4,9,11,0]","[0,0,1]","[0,0,979771]","[0,0,2]" +3024,怪盗Fの台本(シナリオ)〜消えたダイヤの謎〜,ひとしずく×やま△,1,"[3,9,13+,0]","[0,0,2]","[0,0,932868]","[0,0,1]" +3005,KING,Kanaria,1,"[2,8,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +3006,ダーリンダンス,かいりきベア,1,"[2,8+,12+,0]","[0,0,3]","[0,0,980045]","[0,0,1]" +2239,トリノコシティ,40mP,1,"[3,7+,12,0]","[0,0,2]","[0,0,990832]","[0,0,2]" +3007,サマータイムレコード,じん,1,"[3,7+,11+,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2205,テレキャスタービーボーイ,すりぃ feat.鏡音レン,1,"[3,8+,11+,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2215,フィクサー,ぬゆり,1,"[3,7,12+,0]","[0,0,4]","[0,0,973059]","[0,0,1]" +2214,バレリーコ,みきとP,1,"[3,8,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2216,だれかの心臓になれたなら,ユリイ・カノン feat.GUMI,1,"[3,7+,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1209,六兆年と一夜物語,kemu,1,"[4,8+,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2076,ワールドイズマイン,supercell,1,"[3,8,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1239,進捗どうですか!,オワタP,1,"[3,7,12+,0]","[0,0,1]","[0,0,977575]","[0,0,1]" +2077,ぼくらの16bit戦争,sasakure. UK,1,"[4,9,13,0]","[0,0,1]","[0,0,954323]","[0,0,1]" +2078,隔絶≡タナトス,ろひ,1,"[4,8,13,0]","[0,0,3]","[0,0,992014]","[0,0,2]" +2032,アスノヨゾラ哨戒班,Orangestar feat.IA,1,"[3,7,11+,0]","[0,1,3]","[0,969915,998771]","[0,2,3]" +2033,ヒビカセ,GigaReol,1,"[3,8,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2034,脳漿炸裂ガール,れるりり,1,"[5,9,13,0]","[0,0,3]","[0,0,968605]","[0,0,1]" +2004,ポジティブ☆ダンスタイム,キノシタ(kinoshita) feat.音街ウナ・鏡音リン,1,"[3,8+,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2005,Gimme×Gimme feat. 初音ミク・鏡音リン,八王子P × Giga,1,"[2,8,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2006,39みゅーじっく!,みきとP,1,"[2,7,10+,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1224,ブリキノダンス,日向電工,1,"[3,7+,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1244,チュルリラ・チュルリラ・ダッダッダ!,和田たけあき(くらげP),1,"[4,8,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1245,おばけのウケねらい,ピノキオピー,1,"[3,8,11+,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1246,ベノム,かいりきベア,1,"[3,7,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1031,リアル初音ミクの消失,cosMo@暴走P,1,"[6,10,13+,0]","[0,1,9]","[0,960168,966587]","[0,1,1]" +1221,セツナトリップ,Last Note.,1,"[3,9,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1222,カゲロウデイズ,じん(自然の敵P),1,"[4,9,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1272,天ノ弱,164,1,"[3,7,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1013,ゴーストルール,DECO*27,1,"[3,9,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1207,ロストワンの号哭,Neru,1,"[4,8,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1208,いーあるふぁんくらぶ,みきとP,1,"[2,6,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1030,初音ミクの消失,cosMo@暴走P,1,"[5,10,13+,0]","[0,0,4]","[0,0,971026]","[0,0,1]" +1037,アカリがやってきたぞっ,GYARI(ココアシガレットP),1,"[3,8,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1016,太陽系デスコ,ナユタン星人,1,"[2,7,10+,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1093,幸せになれる隠しコマンドがあるらしい,うたたP,1,"[5,10,13,0]","[0,0,1]","[0,0,924860]","[0,0,1]" +7,千本桜,黒うさP feat. 初音ミク,1,"[2,7+,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +27,エイリアンエイリアン,ナユタン星人 feat. 初音ミク,1,"[2,6+,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +30,砂の惑星 feat. 初音ミク,ハチ,1,"[3,8+,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +31,マトリョシカ,ハチ,1,"[3,8,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1036,Seyana. ~何でも言うことを聞いてくれるアカネチャン~,GYARI(ココアシガレットP),1,"[2,9,11+,0]","[0,0,6]","[0,0,988676]","[0,0,2]" +1041,フラジール,ぬゆり,1,"[1,7,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1014,ロキ,みきとP,1,"[4,9,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1035,ウミユリ海底譚,n-buna,1,"[1,7,10,0]","[0,1,0]","[0,845210,0]","[0,1,0]" +3004,Grip & Break down !!,SOUND HOLIC feat. Nana Takahashi,2,"[3,8,12,0]","[0,0,2]","[0,0,994785]","[0,0,2]" +3059,CENSORED!!,t+pazolite,2,"[4,8+,13,0]","[0,0,10]","[0,0,995798]","[0,0,2]" +3029,Crime Wave,REDALiCE feat. 野宮あゆみ,2,"[3,8,12+,0]","[0,1,5]","[0,997353,979211]","[0,3,2]" +2222,チルノは覚醒サマーデイズ!,森羅万象,2,"[3,8,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2223,エピクロスの虹はもう見えない,SYNC.ART'S feat. 美里,2,"[3,8,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2224,ARROW RAIN feat.ayame,Masayoshi Minoshima(Alstroemeria Records),2,"[5,9,12,0]","[0,0,3]","[0,0,941422]","[0,0,1]" +2225,四次元跳躍機関,koutaq,2,"[2,9,12+,0]","[0,0,3]","[0,0,983422]","[0,0,2]" +2226,Destructive Little Sister,Kobaryo,2,"[5,10+,13+,0]","[0,0,7]","[0,0,993955]","[0,0,2]" +2039,物凄い勢いでけーねが物凄いうた,Halozy,2,"[4,9+,12,0]","[0,0,2]","[0,0,950326]","[0,0,1]" +2038,患部で止まってすぐ溶ける ~ 狂気の優曇華院,ARM+夕野ヨシミ (IOSYS) feat. miko,2,"[3,9+,13,0]","[0,0,3]","[0,0,994940]","[0,0,2]" +2206,Scream out!,A-One,2,"[4,8,12+,0]","[0,0,2]","[0,0,993571]","[0,0,2]" +2092,ホイホイ☆幻想ホロイズム,宝鐘マリン with ホロイズムファンタジー,2,"[3,7+,12+,0]","[0,0,1]","[0,0,984604]","[0,0,2]" +2042,"Help me, ERINNNNNN!!",ビートまりお(COOL&CREATE),2,"[3,7+,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1240,進捗どうですか?,sumijun(Halozy) feat. ななひら(Confetto),2,"[3,8,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2040,Sweet Requiem,REDALiCE & aran,2,"[3,9,12+,0]","[0,0,6]","[0,0,993075]","[0,0,2]" +2008,明星ロケット,岸田教団&THE明星ロケッツ,2,"[2,7,11+,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2007,ゆけむり魂温泉 II,魂音泉,2,"[3,7,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2009,Calamity Fortune,LeaF,2,"[4,10,13+,0]","[0,0,9]","[0,0,993246]","[0,0,2]" +1226,ケロ⑨Destiny,Silver Forest,2,"[2,6,11+,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1274,風に乗せた願い,豚乙女,2,"[3,7,10,0]","[0,0,1]","[0,0,892389]","[0,0,1]" +1227,LOVE EAST,暁Records,2,"[3,7,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1228,天狗の落とし文 feat. ytr,魂音泉,2,"[3,8,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1229,神寂,t+pazolite,2,"[4,10+,13,0]","[0,1,19]","[0,968979,992353]","[0,2,2]" +1210,悪戯センセーション,森羅万象,2,"[2,8,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1265,ナイト・オブ・ナイツ (かめりあ’s“ワンス・アポン・ア・ナイト”Remix),かめりあ,2,"[5,10,13,0]","[0,0,1]","[0,0,972379]","[0,0,1]" +1211,Mami Mami Zone,REDALiCE feat. 野宮あゆみ,2,"[4,9,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1107,チルノのパーフェクトさんすう教室,ARM+夕野ヨシミ (IOSYS) feat. miko,2,"[3,9,11,0]","[0,0,1]","[0,0,961905]","[0,0,1]" +1118,待チ人ハ来ズ。,豚乙女,2,"[2,6,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1108,taboo tears you up 2017,REDALiCE,2,"[4,9+,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1001,Bad Apple!! feat. nomico,Masayoshi Minoshima,2,"[1,5,9,0]","[0,0,1]","[0,0,990414]","[0,0,3]" +1002,ナイト・オブ・ナイツ,ビートまりお(COOL&CREATE),2,"[3,9,12,0]","[0,0,2]","[0,0,968559]","[0,0,1]" +1119,WARNING×WARNING×WARNING,暁Records,2,"[3,7+,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1126,Over the sweat and tears,舞台『弱虫ペダル』キャスト,3,"[1,5,9,0]","[3,1,5]","[971250,997156,1000000]","[2,3,4]" +3056,ファムファタール,ギルガメッシュ(CV:大塚剛央)、千極兆司(CV:立花慎之介)、緋野天魔(CV:小野賢章)、神水鶴久遠(CV:広瀬裕也)、皇麗夢(CV:豊永利行),4,"[3,8,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +3055,アゲナゲン,餓鬼レンジャー feat. 梅田サイファー,4,"[4,10,13,0]","[0,0,1]","[0,0,981738]","[0,0,2]" +3027,花たちに希望を,Sound piercer feat.DAZBEE,4,"[3,9+,12,0]","[0,1,1]","[0,267454,979461]","[0,0,1]" +3042,NightTheater,わかどり,4,"[3,10,13,0]","[0,0,2]","[0,0,991105]","[0,0,2]" +3039,恋のMoonlight,REDALiCE feat. 犬山たまき,4,"[2,8,11+,0]","[0,0,1]","[0,0,993130]","[0,0,2]" +3038,Comet Coaster,DJ Noriken & aran,4,"[5,9+,13,0]","[0,0,6]","[0,0,990822]","[0,0,2]" +3037,XODUS,DJ Myosuke & Gram,4,"[5,11,14,0]","[0,0,1]","[0,0,906425]","[0,0,1]" +3036,Lights of Muse,Ayatsugu_Otowa,4,"[3,9+,12,0]","[0,0,2]","[0,0,990953]","[0,0,2]" +3041,The 90's Decision,MYUKKE.,4,"[4,9,13,0]","[0,0,8]","[0,0,995828]","[0,0,2]" +3040,粉骨砕身カジノゥ,モリモリあつし,4,"[3,8,13,0]","[0,0,4]","[0,0,990334]","[0,0,2]" +3017,Avant Raze,Sampling Masters MEGA,4,"[3,8,12,0]","[0,0,2]","[0,0,943840]","[0,0,1]" +3018,#1f1e33,かめりあ(EDP),4,"[3,10+,13+,0]","[0,2,21]","[0,978401,987668]","[0,2,1]" +3019,Arcahv,Feryquitous,4,"[3,10,13,0]","[0,0,31]","[0,0,994046]","[0,0,2]" +3020,最強STRONGER,REDALiCE vs USAO,4,"[5,10,14,0]","[0,0,5]","[0,0,953632]","[0,0,1]" +3022,Let you DIVE! (nitro rmx),nitro (lowiro),4,"[4,8+,12+,0]","[0,0,9]","[0,0,979146]","[0,0,2]" +3021,Sheriruth (Laur Remix),Laur,4,"[4,10,13,0]","[0,0,14]","[0,0,995044]","[0,0,2]" +2256,さんさーら!,ARuFa,4,"[2,7+,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2229,Night Club Junkie,YUC'e,4,"[2,6+,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2085,PUPA,モリモリあつし,4,"[4,8,13+,0]","[0,0,12]","[0,0,996827]","[0,0,2]" +2217,Destr0yer,削除 feat Nikki Simmons,4,"[5,8+,13,0]","[0,0,7]","[0,0,997503]","[0,0,2]" +2218,もぺもぺ,LeaF,4,"[4,8,12+,0]","[0,0,6]","[0,0,971402]","[0,0,1]" +2207,MAGENTA POTION,EmoCosine,4,"[4,8,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1241,進捗WARS feat.ビートまりお,ARM(IOSYS),4,"[3,7,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2080,Apocalypse,アリスシャッハと魔法の楽団 「Lanota」より,4,"[2,7,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2082,You are the Miserable,t+pazolite 「Lanota」より,4,"[3,10,13+,0]","[0,0,11]","[0,0,993142]","[0,0,3]" +2083,Stasis,Maozon 「Lanota」より,4,"[3,10,13,0]","[0,0,9]","[0,0,991792]","[0,0,2]" +2081,Rainmaker,Kamome sano 「Lanota」より,4,"[4,9+,13,0]","[0,0,9]","[0,0,992026]","[0,0,2]" +2079,Weg,ユアミトス 「Lanota」より,4,"[3,8,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2071,From Zero feat. 利香,Neko Hacker,4,"[3,7+,11+,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2072,PRESS START!,KOTONOHOUSE,4,"[4,8+,12+,0]","[0,0,2]","[0,0,984496]","[0,0,2]" +2073,TWISTSTEP,Pa's Lam System,4,"[3,8+,12+,0]","[0,0,4]","[0,0,991290]","[0,0,2]" +2074,Future Cαndy,YUC'e,4,"[3,9,12+,0]","[0,0,14]","[0,0,993093]","[0,0,2]" +2059,Fish Fight!,野猿,4,"[4,9,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2060,THERAPY,group_inou,4,"[4,9,12+,0]","[0,0,2]","[0,0,986263]","[0,0,2]" +2090,グルーヴ・ザ・ハート,ビートまりお+あまね 「グルーヴコースター」より,4,"[4,8,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2089,Got more raves?,E.G.G. 「グルーヴコースター」より,4,"[6,10+,13,0]","[0,0,7]","[0,0,990188]","[0,0,2]" +2088,"Good Night, Bad Luck.",t+pazolite 「グルーヴコースター」より,4,"[5,10+,13+,0]","[0,0,5]","[0,0,985834]","[0,0,2]" +2010,Grayed Out-Antifront-,Getty vs. DJ DiA,4,"[3,9,13,0]","[0,0,7]","[0,0,990084]","[0,0,2]" +2011,インドア系ならトラックメイカー,Yunomi,4,"[2,7,12+,0]","[0,0,8]","[0,0,970423]","[0,0,1]" +1254,ダンシング☆サムライ,崎山つばさ,4,"[3,7+,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1255,WHITE,超魂團(ウルトラソウルズ),4,"[3,8,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1116,Brain Power,NOMA,4,"[4,9+,13,0]","[0,0,11]","[0,0,990084]","[0,0,3]" +1261,聖者の鼓動,世阿弥 「グルーヴコースター」より,4,"[2,7,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1263,BUCHiGiRE Berserker,REDALiCE vs MASAKI 「グルーヴコースター」より,4,"[4,10+,13+,0]","[0,0,11]","[0,0,988574]","[0,0,1]" +1260,君のStarlight Road,セイネ (CV: 河上英里子) 「グルーヴコースター」より,4,"[3,8,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1262,FUJIN Rumble,COSIO (ZUNTATA) 「グルーヴコースター」より,4,"[5,10+,13,0]","[0,0,4]","[0,0,994850]","[0,0,2]" +1232,Eyes on me feat. Such,PSYQUI,4,"[3,7+,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1242,GOODWORLD,EBIMAYO,4,"[2,9,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1243,Altale,削除,4,"[4,9,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1215,ベースラインやってる?笑,かめりあ feat. ななひら,4,"[4,9+,12,0]","[0,0,1]","[0,0,951097]","[0,0,1]" +1216,EU over Progress,E.G.G. a.k.a. COSIO,4,"[6,10+,12+,0]","[0,0,4]","[0,0,985792]","[0,0,2]" +1047,『エキセントリック少年ボウイ』のテーマ,エキセントリック少年ボウイ オールスターズ,4,"[1,5+,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1050,What's this?,超魂團(ウルトラソウルズ),4,"[3,6,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1111,FREEDOM DiVE↓,xi,4,"[6,10+,13+,0]","[0,1,5]","[0,990373,980952]","[0,2,2]" +1127,Honey Panic!,KO3&Relect,4,"[3,9,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1110,Pixel Galaxy,Snail's House,4,"[2,7,10+,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1104,conflict,siromaru + cranky,4,"[5,10,13,0]","[0,0,7]","[0,0,993536]","[0,0,2]" +1043,こんにちは、ARuFaです。,ARuFa,4,"[3,7,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1044,ぼくの夢、メチャクソ無限湧き,ARuFa & t+pazolite & かめりあ,4,"[4,9,12,13+]","[0,0,1,13]","[0,0,976891,991304]","[0,0,2,2]" +1094,ゲームオーバー (feat. TORIENA),Yunomi,4,"[2,7+,11+,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1051,ルーンファクトリー4スペシャルより「この想いを乗せて」,ジョー・リノイエ with 安西美貴,5,"[1,5,9,0]","[0,0,0]","[0,0,0]","[0,0,0]" +3064,DIVE With Ü,HARDCORE TANO*C & エリザベス(CV:大西沙織) & リリィ(CV:青木志貴) & ルーン(CV:河瀬茉希),5,"[3,9,13,12]","[0,0,3,5]","[0,0,995320,1000000]","[0,0,2,4]" +3058,神,DJ Myosuke vs MASAKI,5,"[6,10+,13+,14]","[0,0,15,1]","[0,0,984444,908880]","[0,0,1,1]" +3057,cloud IX,NOMA,5,"[4,10,13,0]","[0,0,18]","[0,0,972041]","[0,0,1]" +3011,Ouvertüre,USAO & DJ Genki feat. ルーン(CV:河瀬茉希),5,"[3,9,13,14]","[0,0,9,3]","[0,0,993775,947105]","[0,0,2,1]" +3012,Love Kills U,EmoCosine,5,"[4,8,12,0]","[0,0,2]","[0,0,987412]","[0,0,2]" +3028,Kira☆Kira☆Night,KO3 & Relect,5,"[5,9,12+,0]","[0,0,3]","[0,0,975690]","[0,0,1]" +3015,YOG,モリモリあつし,5,"[4,9+,13+,0]","[0,0,10]","[0,0,981030]","[0,0,1]" +2234,Lost Illusion,Yooh,5,"[4,10+,12+,0]","[0,0,2]","[0,0,970411]","[0,0,1]" +2230,Cauliflower,HiTECH NINJA,5,"[4,8+,12+,0]","[0,0,12]","[0,0,997877]","[0,0,3]" +2231,Purple Skies,Mameyudoufu,5,"[3,8,12,0]","[0,0,2]","[0,0,952283]","[0,0,1]" +2211,Lhaksha,Feryquitous,5,"[3,9,12,0]","[0,0,3]","[0,0,993262]","[0,0,2]" +2210,LIN NE KRO NE feat. lasah,sasakure.UK,5,"[4,9,13+,0]","[0,0,15]","[0,0,991393]","[0,0,2]" +2053,フリーフォール,Zekk,5,"[4,8+,12+,0]","[0,0,3]","[0,0,972500]","[0,0,1]" +2046,猫娘,かねこちはる,5,"[6,10,13+,0]","[0,0,10]","[0,0,991243]","[0,0,3]" +2091,QiXiN MAdN3ss 2153,DJ Noriken vs MASAKI,5,"[6,11,13+,0]","[0,1,10]","[0,976603,980407]","[0,2,1]" +2036,ARTEMiS,BlackY,5,"[4,10,13+,0]","[0,0,5]","[0,0,977866]","[0,0,1]" +2012,with U,t+pazolite & Massive New Krew feat. リリィ(CV:青木志貴),5,"[3,7+,11+,13]","[0,0,2,3]","[0,0,994415,973012]","[0,0,3,1]" +2013,Tell Me,RiraN,5,"[3,7+,11+,0]","[0,1,1]","[0,989968,932813]","[0,3,1]" +1231,LETHAL;WEAPON,NOMA w/ Apo11o program ft. Yuyoyuppe,5,"[3,8,12+,0]","[0,0,5]","[0,0,976161]","[0,0,1]" +2014,THE MUZZLE FACING,かめりあ,5,"[4,9+,13+,0]","[0,0,14]","[0,0,993505]","[0,0,3]" +1230,GASHATT,onoken,5,"[4,10,12,0]","[0,0,1]","[0,0,989481]","[0,0,2]" +1212,Demon's Rave,Hommarju,5,"[5,10,12+,0]","[0,0,14]","[0,0,997919]","[0,0,2]" +1085,jacaranda,西村 隆文,5,"[4,9,12+,0]","[0,0,2]","[0,0,991069]","[0,0,2]" +1117,CHECKER FLAG,COSIO,5,"[3,7,12+,0]","[0,0,4]","[0,0,986220]","[0,0,2]" +1122,Stratoliner,C-Show,5,"[4,9+,12+,0]","[0,0,8]","[0,0,993713]","[0,0,2]" +1121,Utopia feat. shully,HiTECH NINJA,5,"[5,9,12,0]","[0,0,1]","[0,0,996045]","[0,0,2]" +32,Let you DIVE!,HARDCORE TANO*C & エリザベス(CV:大西沙織),6,"[3,9+,11+,13]","[0,0,4,8]","[0,0,994881,983884]","[0,0,3,2]" +3094,Scramble TANO*C,aran,6,"[3,9,12+,0]","[0,0,3]","[0,0,993867]","[0,0,2]" +3082,Everybody Say HARDCORE TANO*C,DJ Noriken,6,"[4,9,13,0]","[0,0,6]","[0,0,995609]","[0,0,2]" +3073,Crush Out,REDALiCE,6,"[4,10,12+,0]","[0,0,3]","[0,0,992385]","[0,0,2]" +3093,Keep on Groovin' feat. mow*2,P*Light,6,"[4,9+,12,0]","[0,0,1]","[0,0,994437]","[0,0,2]" +3091,To the sky -wacca edit- feat.motoko,源屋,6,"[3,8+,12,0]","[0,0,1]","[0,0,979093]","[0,0,1]" +3089,We are the Massive New Krew (2020Edit),Massive New Krew,6,"[3,8,13,14]","[0,0,3,1]","[0,0,993721,841235]","[0,0,2,0]" +3075,最先端坊将軍3,SAISEN TURN,6,"[3,8+,13+,0]","[0,0,2]","[0,0,925275]","[0,0,1]" +3072,BPM=RT,t+pazolite,6,"[5,10+,13+,0]","[0,0,3]","[0,0,947666]","[0,0,1]" +3076,1BPM,DJ Myosuke,6,"[4,10,13+,0]","[0,0,3]","[0,0,972766]","[0,0,1]" +3086,Viyella's Nightmare,Laur,6,"[4,11,13+,0]","[2,0,15]","[704425,0,983506]","[1,0,1]" +3088,Odin,Gram,6,"[4,10+,13,0]","[0,0,6]","[0,0,996771]","[0,0,3]" +3077,EXTRA HARD,DJ Myosuke,6,"[4,11,14,0]","[0,0,1]","[0,0,939769]","[0,0,1]" +3085,Obtain An Unused Whale In The Abstract Sea,Kobaryo,6,"[2,6,13,0]","[0,0,3]","[0,0,967383]","[0,0,1]" +3079,Middle,Srav3R,6,"[3,7,12+,0]","[0,0,9]","[0,0,996806]","[0,0,3]" +3080,Avenue,aran,6,"[3,7+,12+,0]","[0,0,12]","[0,0,996952]","[0,0,3]" +3090,えくすとりーむ↑↑おんがくスクール feat. ななひら,Massive New Krew & RoughSketch,6,"[4,10+,13+,0]","[0,0,4]","[0,0,961881]","[0,0,1]" +3074,T+ VS SHARK,t+pazolite,6,"[4,10+,13+,0]","[0,0,9]","[0,0,991283]","[0,0,2]" +3081,Brand New World feat. Yukacco,aran,6,"[3,7,11+,0]","[0,0,1]","[0,0,992246]","[0,0,3]" +3084,SUPER EMULATOR,Kobaryo feat. HiTNEX-X,6,"[4,11,14,0]","[0,0,3]","[0,0,932113]","[0,0,1]" +3083,GAKKY,Getty,6,"[4,10+,13+,0]","[0,0,15]","[0,0,987328]","[0,0,1]" +3092,NIGHTWAVE FRAGMENTS,DJ Noriken,6,"[4,10,13+,0]","[0,0,10]","[0,0,997244]","[0,0,3]" +3078,N3XTAGE,Srav3R,6,"[4,10,12+,0]","[0,0,3]","[0,0,990208]","[0,0,2]" +3071,Big Daddy,USAO,6,"[5,8+,13,0]","[0,0,8]","[0,0,992393]","[0,0,2]" +3087,Ready Go feat. Yukacco,DJ Genki,6,"[3,8,12,0]","[0,0,4]","[0,0,990730]","[0,0,2]" +3032,Reach My Voice,TANO*C ALL STARS,6,"[3,8+,12+,0]","[0,0,2]","[0,0,993925]","[0,0,3]" +3063,You & DIE,USAO,6,"[4,10+,13,0]","[0,0,1]","[0,0,976312]","[0,0,1]" +3062,Möbius,USAO & Camellia,6,"[8,10+,14,15]","[0,1,3,2]","[0,982924,907259,829125]","[0,2,1,0]" +3061,GENOCIDER (Kobaryo's FTN-Remix),Kobaryo,6,"[6,10+,14,0]","[0,0,1]","[0,0,883176]","[0,0,1]" +3060,"Invisible Frenzy (Camellia's ""593: Insanely Fluctuated"" Remix)",Camellia,6,"[6,11,14,0]","[0,1,1]","[0,997288,888442]","[0,3,1]" +3052,Candy Star,DJ Genki feat. Yukacco,6,"[3,9,13,0]","[0,0,2]","[0,0,993900]","[0,0,2]" +3053,Onigami,DJ Noriken,6,"[4,9,13,0]","[0,0,4]","[0,0,974299]","[0,0,1]" +3044,DANGEROOOOUS JUNGLE,Laur,6,"[3,10,13,14]","[0,0,10,3]","[0,0,995942,939289]","[0,0,2,1]" +3045,Dimension Hacker,Kobaryo,6,"[4,10+,13,14]","[0,0,9,1]","[0,0,980803,936967]","[0,0,1,1]" +3046,EPHMR,aran,6,"[4,10+,13,14]","[0,0,4,1]","[0,0,998134,842218]","[0,0,3,1]" +3047,クリムゾン帝王,REDALiCE,6,"[8,11+,13+,14]","[0,0,5,1]","[0,0,995619,893259]","[0,0,2,1]" +3031,Break Through Myself feat. Risa Yuzuki,DJ Myosuke & Laur,6,"[4,10,13,0]","[0,0,2]","[0,0,950062]","[0,0,1]" +3034,D3LTA QOMPLEX,Getty & Srav3R & DJ Noriken,6,"[4,9+,13,0]","[0,0,2]","[0,0,976110]","[0,0,2]" +3033,Chobit Flavor,aran & t+pazolite,6,"[3,9,12,0]","[0,0,1]","[0,0,968661]","[0,0,1]" +3008,Machinery of Avoid,Noizenecio,6,"[4,8,12+,0]","[0,1,5]","[0,992081,994095]","[0,2,2]" +3009,Datamania (tpz Overheat Remix),t+pazolite,6,"[3,7+,12,0]","[0,0,2]","[0,0,966044]","[0,0,1]" +3013,超MANJIラッシュ,Massive New Krew,6,"[5,9+,13+,0]","[0,0,7]","[0,0,991177]","[0,0,2]" +3016,Meta-Mysteria,DJ Noriken,6,"[6,11,14,0]","[0,0,1]","[0,0,928943]","[0,0,1]" +2255,Eternal Ending,Kobaryo,6,"[5,10+,13,0]","[0,0,8]","[0,0,991616]","[0,0,2]" +2232,EVE,P*Light,6,"[4,9,13,0]","[0,0,3]","[0,0,994318]","[0,0,3]" +2235,eden,"""漆黒""の堕天使《Gram》†Versus† ""聖刻""の熾天使《Gram》",6,"[4,10,13,14]","[0,0,6,2]","[0,0,991943,956912]","[0,0,2,1]" +2236,Silentphobia,t+pazolite VS 削除,6,"[4,10,13,14]","[0,0,15,1]","[0,0,990408,926996]","[0,0,2,1]" +2247,やけにインザレイン feat. 小林私,t+pazolite,6,"[3,10,13,0]","[0,1,5]","[0,967562,997674]","[0,1,3]" +2248,Traveller feat.moimoi,かめりあ vs DJ Genki,6,"[2,8,12,0]","[0,0,2]","[0,0,991158]","[0,0,2]" +2249,FLVSH OUT,Getty,6,"[4,9+,13,0]","[0,0,12]","[0,0,995846]","[0,0,2]" +2250,BSCS,Massive New Krew,6,"[4,8+,13,0]","[0,0,17]","[0,0,992986]","[0,0,2]" +2219,Popping Happiness!,DJ Genki & P*Light,6,"[4,8,12,0]","[0,0,2]","[0,0,990263]","[0,0,2]" +2220,Madwing,DJ Myosuke & aran,6,"[5,9+,12+,0]","[0,0,5]","[0,0,980917]","[0,0,2]" +2221,TRICKL4SH 220,Lite Show Magic,6,"[4,10+,13+,0]","[0,0,6]","[0,0,973733]","[0,0,1]" +2212,SHAKE!,REDALiCE,6,"[4,9,12+,0]","[0,0,4]","[0,0,998050]","[0,0,3]" +2213,DUAL BREAKER XX,Srav3R vs Getty,6,"[6,10+,13+,0]","[0,0,14]","[0,0,991667]","[0,0,2]" +2208,Megaton Killer,DJ Myosuke,6,"[5,10,13,0]","[0,0,10]","[0,0,993697]","[0,0,2]" +2209,ATAMA WARUI,Laur,6,"[5,9,12+,0]","[0,0,19]","[0,0,998833]","[0,0,3]" +2054,Liberate,USAO,6,"[4,9,13,0]","[0,0,4]","[0,0,990799]","[0,0,2]" +2055,Animosity,Laur,6,"[6,10+,13+,0]","[0,0,17]","[0,0,993911]","[0,0,2]" +2056,Big Bang,Massive New Krew,6,"[7,11,14,0]","[0,0,1]","[0,0,921483]","[0,0,1]" +1256,恋メタル,P*Light,6,"[3,8+,12+,0]","[0,0,3]","[0,0,981513]","[0,0,2]" +2062,はげしこの夜 -Psylent Crazy Night-,aran & Kobaryo,6,"[4,8+,13+,0]","[0,0,2]","[0,0,980309]","[0,0,1]" +2037,パニックポップ☆フェスティバル!!!,DJ Genki,6,"[5,10,13,0]","[0,0,3]","[0,0,993388]","[0,0,2]" +2048,Stasis feat.motoko -WACCA EDiT-,源屋,6,"[4,7+,12+,0]","[0,1,1]","[0,993182,985192]","[0,3,2]" +2049,RAV#GIRL,Srav3R,6,"[3,7+,12,0]","[0,0,5]","[0,0,1000000]","[0,0,4]" +2070,KALACAKLA,aran & lapix,6,"[4,8,12+,0]","[0,0,2]","[0,0,994595]","[0,0,2]" +2047,Poppin' Shower,P*Light,6,"[3,9+,12,0]","[0,0,1]","[0,0,964359]","[0,0,1]" +1087,While Shining feat.Yukacco,aran & Kobaryo,6,"[3,8,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2019,ALiVE,REDALiCE,6,"[3,7+,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +2016,ONOMATO Pairing!!!,t+pazolite feat. ななひら,6,"[2,8,12,0]","[0,0,1]","[0,0,949215]","[0,0,1]" +2015,SUPER REACTOR,Kobaryo feat. HiTNEX-X,6,"[4,8,13,0]","[0,0,4]","[0,0,993860]","[0,0,3]" +2017,GENOCIDER,DJ Myosuke,6,"[6,11,14,0]","[0,0,1]","[0,0,883938]","[0,0,1]" +1276,ツアー・ファイナル,C-Show,6,"[3,9,12,0]","[0,0,1]","[0,0,988220]","[0,0,2]" +1247,Metamorphose,Laur,6,"[4,10,12+,0]","[0,0,1]","[0,0,972070]","[0,0,1]" +1248,MAGiC4LG1RL M3GA S7R1KE!,DJ Noriken,6,"[4,10,13,0]","[0,0,2]","[0,0,984730]","[0,0,2]" +1249,METEOR BURST,Getty,6,"[5,10+,13+,0]","[0,0,2]","[0,0,974250]","[0,0,1]" +1250,XTREME,USAO,6,"[6,11,12+,14]","[0,0,1,1]","[0,0,976058,931323]","[0,0,1,1]" +1251,天使光輪,REDALiCE & cosMo@暴走P,6,"[7,11,13,14]","[0,0,6,1]","[0,0,991697,949545]","[0,0,2,1]" +1258,Ultra Red,REDALiCE & Hommarju,6,"[3,9,12+,0]","[0,0,1]","[0,0,981538]","[0,0,2]" +1259,サイクルヒット,葛西ハーコーズ,6,"[5,10,13,0]","[0,0,5]","[0,0,993889]","[0,0,2]" +1275,Strange Bar,Laur,6,"[3,10,12+,0]","[0,0,1]","[0,0,976383]","[0,0,2]" +1213,Murasaki,Srav3R,6,"[3,7,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1214,Mazy Metroplex,aran,6,"[4,10+,13+,0]","[0,2,19]","[0,993077,991519]","[0,3,2]" +1268,LOSE CONTROL,Massive New Krew,6,"[3,8,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1267,†DOOF†SENC†,Kobaryo,6,"[6,10,13,0]","[0,0,6]","[0,0,991257]","[0,0,2]" +1086,Shiny Memory feat.Yukacco,USAO & DJ Genki,6,"[3,9+,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1128,BLVST BEVT,Getty,6,"[4,10,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1123,JINGLE DEATH,DJ Myosuke & Gram,6,"[4,10,13,0]","[0,0,1]","[0,0,983287]","[0,0,2]" +1061,Invisible Frenzy,Kobaryo,6,"[7,11,14,0]","[0,0,2]","[0,0,942242]","[0,0,1]" +1078,VOX Diamond,t+pazolite,6,"[4,7+,12,0]","[0,0,1]","[0,0,972260]","[0,0,1]" +1063,Chariot,USAO,6,"[3,8,12,0]","[0,0,1]","[0,0,973837]","[0,0,2]" +1083,Akareram,Srav3R,6,"[3,8,11+,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1084,Galaxy Friends,Kobaryo,6,"[4,8+,12+,0]","[0,0,4]","[0,0,994678]","[0,0,2]" +1064,13 Donkeys,Massive New Krew,6,"[2,8,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1065,ADAM,P*Light,6,"[5,10,13,0]","[0,0,6]","[0,0,983165]","[0,0,1]" +1062,ATARAX1A,DJ Genki,6,"[4,8,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1077,HiGHER,REDALiCE,6,"[3,8,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1080,Source of Creation,DJ Myosuke,6,"[3,8,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1068,Exitium,Laur,6,"[6,11,14,0]","[0,2,1]","[0,979652,877476]","[0,2,1]" +1082,Blaze,Getty,6,"[3,8+,11+,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1081,GRiDGALAXY,aran,6,"[4,8,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1079,Jingle,DJ Noriken,6,"[4,9+,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1105,BATTLE NO.1,TANO*C Sound Team,6,"[6,10,13+,14]","[0,0,1,2]","[0,0,951064,921019]","[0,0,1,1]" +1054,LEVATEiN feat. 野宮あゆみ,REDALiCE,6,"[4,9,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1055,BIG HEAD BANGING,t+pazolite,6,"[6,11,13+,0]","[0,1,3]","[0,975000,978600]","[0,1,1]" +4,Knight Rider,USAO,6,"[6,10+,13,0]","[0,1,14]","[0,957863,977958]","[0,1,1]" +6,PARALLEL★PRISM,P*Light,6,"[3,7+,10+,0]","[0,0,0]","[0,0,0]","[0,0,0]" +3,Rainbow Dream,DJ Genki feat. Yukacco,6,"[3,8+,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1056,Quon,DJ Noriken,6,"[5,10,12+,13+]","[0,1,12,4]","[0,951412,993856,959137]","[0,1,2,1]" +5,Poseidon,Massive New Krew,6,"[5,9+,13+,0]","[0,0,4]","[0,0,969861]","[0,0,1]" +1057,HELL FLAME,DJ Myosuke,6,"[5,10,12+,13+]","[0,1,2,17]","[0,943674,974734,982267]","[0,1,1,1]" +1058,Gate One,aran,6,"[4,9,12,0]","[0,1,6]","[0,966272,996761]","[0,2,2]" +1060,Over My Hand,Srav3R,6,"[3,9,11,0]","[0,1,0]","[0,960042,0]","[0,2,0]" +1059,Are You Ready,Getty,6,"[4,10,12,0]","[0,0,1]","[0,0,966667]","[0,0,1]" +20,MEMORiZE,REDALiCE feat. Ayumi Nomiya,6,"[3,8,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +21,illanai-assorted,t+pazolite,6,"[4,8+,12+,0]","[0,0,7]","[0,0,982759]","[0,0,1]" +1069,Sunshine,DJ Genki VS かめりあ (feat. moimoi),6,"[4,8,11,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1072,BOOM! BOOM!! BOOM!!!,P*Light feat. mow*2,6,"[4,10,12,0]","[0,0,1]","[0,0,960848]","[0,0,1]" +1071,Ever Free(Raw Edit),Massive New Krew,6,"[3,8,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1070,Try again,USAO,6,"[4,8+,10,0]","[0,1,0]","[0,853881,0]","[0,1,0]" +1073,BLUE SKY feat. 野宮あゆみ,源屋,6,"[3,7,10,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1076,Sound Chimera,Laur,6,"[5,10+,12+,13+]","[0,1,11,3]","[0,978156,986174,911781]","[0,1,1,1]" +24,Soldiers,DJ Noriken,6,"[4,8+,11+,0]","[0,0,0]","[0,0,0]","[0,0,0]" +25,Fight for the CORE feat. Daisuke,DJ Myosuke,6,"[4,10+,12,0]","[0,0,0]","[0,0,0]","[0,0,0]" +1101,Shining Harmony,Harmonies(P*Light & Massive New Krew),6,"[4,9,12,0]","[0,0,0]","[0,0,0]","[0,0,0]"