lazyghost's picture
initial commit
a8cb0a6
raw
history blame
7.17 kB
import pickle as pkl
import json
from .RajatsMinecraftLibrary.minecraft import commandGenerator
import configparser
import argparse
from .RajatsMinecraftLibrary.amplitude import AsfPosConverter
from .RajatsMinecraftLibrary.minecraft import spaceManager
def getBlockDetails(
data, music_box_dict, amplitude_dict, pitch_mapping_shift, sim_thresh
):
res = []
for beat in data[1:]:
if beat[1]["similarity"] > sim_thresh:
tm_value = beat[0]
beat_details = beat[1]
beat_instruments = beat_details["combination"]
curr_instruments_details = []
for instrument in beat_instruments:
asf = round(float(instrument["ASF"]), 3)
pos_details = AsfPosConverter.getPosition(amplitude_dict, asf)
curr_instruments_details.append(
{
"block_name": music_box_dict[instrument["instrument"]],
"note": pitch_mapping_shift + instrument["pitchShift"],
"position": int(pos_details[1]),
}
)
curr_instruments_details = sorted(
curr_instruments_details, key=lambda x: x["position"]
)
res.append((tm_value, curr_instruments_details))
return res
def generateCommands(
data,
music_box_dict,
amplitude_dict,
hearable_range,
one_hundred_milli_horizontal_gap,
starting_coordinates,
one_floor_vertical_gap,
instant_repeater_zs,
pitch_mapping_shift,
sim_thresh
):
startingX, startingY, startingZ = (
starting_coordinates[0],
starting_coordinates[1],
starting_coordinates[2],
)
myCommandGenerator = commandGenerator()
space_manager = spaceManager()
block_details = getBlockDetails(
data, music_box_dict, amplitude_dict, pitch_mapping_shift, sim_thresh
)
batch_size = int(hearable_range / one_hundred_milli_horizontal_gap)
floor_level = 0
output = myCommandGenerator.getCleanSpace(
starting_coordinates, hearable_range, hearable_range, hearable_range
)
output += myCommandGenerator.getMineCartRailsStarter(starting_coordinates)
x = startingX
for i in range(0, len(block_details), batch_size):
batch = block_details[i : i + batch_size]
inc = 1 if floor_level % 2 == 0 else -1
if len(batch) == batch_size:
output += myCommandGenerator.getMineCartRails(
(x, startingY + floor_level * one_floor_vertical_gap, startingZ), inc
)
else:
output += myCommandGenerator.getMineCartRailsEnder(
(x, startingY + floor_level * one_floor_vertical_gap, startingZ), inc
)
for oneMilliNotes in batch:
tm = oneMilliNotes[0]
note_blocks = oneMilliNotes[1]
current_height = startingY + floor_level * one_floor_vertical_gap
output += myCommandGenerator.getMainRepeaterAndRedstoneLine(
(x, current_height, startingZ), tm, inc
)
space_manager.savePlacementDetails(
(x + inc, current_height, startingZ + instant_repeater_zs[0]),
"instant_repeater",
)
output += myCommandGenerator.getInstantRepeater(
(x + inc, current_height, startingZ + instant_repeater_zs[0])
)
space_manager.savePlacementDetails(
(x + inc, current_height, startingZ + instant_repeater_zs[1]),
"instant_repeater",
)
output += myCommandGenerator.getInstantRepeater(
(x + inc, current_height, startingZ + instant_repeater_zs[1])
)
for note_block in note_blocks:
pos, place_connector = space_manager.getPlacementDetails(
(x + inc, current_height, startingZ),
note_block["position"],
amplitude_dict,
)
state = (
"note_block_with_connector"
if place_connector
else "note_block_without_connector"
)
space_manager.savePlacementDetails(
(x + inc, current_height, startingZ + pos), state
)
output += myCommandGenerator.getNoteBlock(
(x + 2 * inc, current_height, startingZ),
inc,
note_block,
pos,
place_connector,
)
x += 3 * inc
if len(batch) == batch_size:
output += myCommandGenerator.getUpperFloorConnection(
(x, current_height, startingZ), inc
)
x += inc
floor_level += 1
return output
# if __name__ == "__main__":
# config = configparser.ConfigParser()
# config.read("config.ini")
# parser = argparse.ArgumentParser(
# description="Command generator for minecraft note blocks"
# )
# parser.add_argument("-f", "--file", help="Specify the file name for processing")
# parser.add_argument("-c", "--coordinates", help="Starting coordinatest")
# args = parser.parse_args()
# music_box_dict = json.loads(config["MinecraftSettings"]["music_box_dict"])
# amplitude_dict = json.loads(config["MinecraftSettings"]["amplitude_dict"])
# pitch_mapping_shift = int(config["MinecraftSettings"]["pitch_mapping_shift"])
# sim_thresh = float(config["MinecraftSettings"]['sim_thresh'])
# instant_repeater_zs = [int(_) for _ in config["MinecraftSettings"]["instant_repeater_zs"].split(",")]
# hearable_range = int(config["MinecraftSettings"]["hearable_range"])
# one_floor_vertical_gap = int(config["MinecraftSettings"]["one_floor_vertical_gap"])
# one_hundred_milli_horizontal_gap = int(config["MinecraftSettings"]["100ms_horizontal_gap"])
# results_path = config["MinecraftSettings"]["results_path"]
# target_file = args.file
# if args.file and args.coordinates:
# starting_coordinates = [int(_) for _ in args.coordinates.split(",")]
# pickle_file_path = f"{results_path}pkl/{target_file}.pkl"
# with open(pickle_file_path, "rb") as f:
# data = pkl.load(f)
# commands = generateCommands(
# data,
# music_box_dict,
# amplitude_dict,
# hearable_range,
# one_hundred_milli_horizontal_gap,
# starting_coordinates,
# one_floor_vertical_gap,
# instant_repeater_zs,
# pitch_mapping_shift,
# sim_thresh,
# )
# # with open(f"{results_path}musicCommand_{target_file}.mcfunction", "w") as f:
# with open(f"{results_path}commands/{target_file.lower()}.mcfunction", "w") as f:
# f.write(commands)
# else:
# print(
# "Usage - python commandGenerator.py -f <file_name_without_extension> -c <coordinates>"
# )
# # plt.scatter([i for i in range(len(asfValues))], asfValues)
# # plt.show()