Utilities for creating Spatials (4D videos)
Project description
spatialstudio
SpatialStudio is the fundamental package for creating and editing Spatials (4D videos). For more info check out https://true3d.com/.
Installation + Getting Started
Here's how to install spatialstudio:
pip install spatialstudio
Here's a barebones example to create your first spatial:
from spatialstudio import splv
# create encoder:
width, height, depth = (128, 128, 128)
encoder = splv.Encoder(
width, height, depth,
framerate=30.0, outputPath='my_spatial.splv'
)
# generate frames (moving red cube):
for i in range(100):
frame = splv.Frame(width, height, depth)
frame.fill(
minPos=(i , i , i ),
maxPos=(i + 20, i + 20, i + 20),
voxel=(255, 0, 0)
)
encoder.encode(frame)
# finish the encoding:
encoder.finish()
Classes
Frame
Represents a 3D volume - a structured grid of voxels. This is a single frame of an splv file.
Constructors
Create an empty frame:
frame = splv.Frame(width, height, depth)
width(int): Frame width in voxels.height(int): Frame height in voxels.depth(int): Frame depth in voxels.
Create a frame from a NumPy array:
frame = splv.Frame(array, leftRight, upDown, frontBack)
array(buffer): NumPy array containing voxel data. Must have shape(w, h, d, 4)and be of typefloat32oruint8.leftRight,upDown,frontBack(str): Axis mapping for left-right, up-down, front-back. Must each be one of ("x","y", and"z") and must be distinct. (defalt:"x","y", and"z", respectively).
Accessors
Get the voxel at a given position:
voxel = frame[x, y, z] # None
r, g, b = frame[x, y, z] # Tuple[int, int, int]
Set the voxel at a given position:
frame[x, y, z] = (r, g, b)
frame[x, y, z] = None
Voxels have type Optional[Tuple[int, int, int]]. None represents aj empty voxel, otherwise it is interpreted as a tuple of color coponents, (r, g, b).
Methods
Create an identical copy of a frame:
clonedFrame = frame.clone() # splv.Frame
Load a frame from a file:
frame = splv.Frame.load(path) # splv.Frame
path(str): The path to load from.
Load a frame from a NanoVDB file:
frame = splv.Frame.load_from_nvdb(path, minPos, maxPos, leftRight, upDown, frontBack) # splv.Frame
path(str): Path to the NanoVDB file to load.minPos(Tuple[int, int, int]): The minimum voxel coordinates that will be written into the frame.maxPos(Tuple[int, int, int]): The maximum voxel coordinates that will be written into the frame.leftRight,upDown,frontBack: Axis mappings, define which axes correspond to which dimension. Must each be one of ("x","y", and"z") and must be distinct. (defalt:"x","y", and"z", respectively).
Create a frame from a color + depth image:
frame = splv.Frame.from_rgbd_simple(colorImg, depthImg, focalLength, width, height, depth) # splv.Frame
colorImg(buffer): The color image from which to generate the frame. Must have shape(w, h, 3)and containuint8color values in the format[r, g, b].depthImg(buffer): The corresponding depth image from which to generate the frame. The depth. Must have shape(w, h)and containfloat32depth values. The depth values are in camera space.focalLengththe focal length of the camera used to capture the images, in pixels. This function assumes a pinhole camera.width,height,depth: The dimensions of the returned frame.
Create a frame from a color + depth image, providing full intrinsics and extrinsics matrices:
frame, minWorldPos, maxWorldPos = splv.Frame.from_rgbd(colorImg, depthImg, intrinsics, extrinsics, minPos, maxPos, width, height, depth) # Tuple[splv.Frame, Tuple[float, float, float], Tuple[float, float, float]]
colorImg(buffer): The color image from which to generate the frame. Must have shape(w, h, 3)and containuint8color values in the format[r, g, b].depthImg(buffer): The corresponding depth image from which to generate the frame. The depth. Must have shape(w, h)and containfloat32depth values. The depth values are in camera space.intrinsics(buffer): The camera intrinsics matrix. Must be a 3x3 matrix.extrinsics(buffer): The camera extrinsics matrix, must be a 3x4 matrix (affine transform).minPos(Tuple[float, float, float]): The minimum world-space position to be included in the frame (default:(-1, -1, -1)).maxPos(Tuple[float, float, float]): The maximum world-space position to be included in the frame (default:(1, 1, 1)).width,height,depth: The dimensions of the returned frame.
Returns:
- The frame populated with voxels from the images.
- The minimum world-space position of any voxel, regardless of whether or not it was clipped by
minPos/maxPos. This is helpful if you're not yet sure what the world bounds should be. - The maximum world-space position of any voxel, regardless of whether or not it was clipped by
minPos/maxPos. This is helpful if you're not yet sure what the world bounds should be.
Save a frame to a file:
frame.save(path)
path(str): Path to save to.
Save a frame as a NanoVDB file (.nvdb):
frame.save_to_nvdb(path)
path(str): Path to save to.
Get the dimensions of a frame:
width, height, depth = frame.get_dims() # Tuple[int, int, int]
Get the number of nonempty "bricks" in the frame (BRICK_SIZE^3 regions of voxels):
numBricks = frame.get_num_bricks() # int
Get the number of voxels in a frame:
numVoxels = frame.get_num_voxels() # int
Fill a region of a frame with a given voxel:
frame.fill(minPos, maxPos, (r, g, b))
frame.fill(minPos, maxPos, None)
minPos(Tuple[int, int, int]): The minimum voxel coordinates to be filled.maxPos(Tuple[int, int, int]): The maximum voxel coordinates to be filled.voxel(Optional[Tuple[int, int, int]]): The voxel to fill with.Noneindicates an empty voxel, a tuple(r, g, b)ofuint8s represents a filled voxel of the specified color.
Add a given frame into a frame:
frame.add(otherFrame, offset, leftRight, upDown, frontBack, flipLeftRight, flipUpDown, flipFrontBack)
src(splv.Frame): The frame to add.offset(Tuple[int, int, int]): Position within the frame to addsrc. The origin (bottom-left-front) ofsrcwill end up at(x, y, z)in the frame (default:(0, 0, 0)).leftRight,upDown,frontBack(str): Axis mappings, define which axes correspond to which dimension. Must each be one of ("x","y", and"z") and must be distinct. (defalt:"x","y", and"z", respectively).flipLeftRight,flipUpDown,flipFrontBack(bool): Whether to reflectsrcover each of the axes, applied AFTER the axis mapping (default:False).
Subtract a given frame from a frame:
frame.subtract(otherFrame, offset, leftRight, upDown, frontBack, flipLeftRight, flipUpDown, flipFrontBack)
src(splv.Frame): The frame to subtract.offset(Tuple[int, int, int]): Position within the frame to subtractsrc. The origin (bottom-left-front) ofsrcwill be subtracted from(x, y, z)in the frame (default:(0, 0, 0)).leftRight,upDown,frontBack(str): Axis mappings, define which axes correspond to which dimension. Must each be one of ("x","y", and"z") and must be distinct. (defalt:"x","y", and"z", respectively).flipLeftRight,flipUpDown,flipFrontBack(bool): Whether to reflectsrcover each of the axes, applied AFTER the axis mapping (default:False).
Clips a frame to given bounds:
frame.clip(minPos, maxPos)
minPos(Tuple[int, int, int]): The minimum voxel coordinates that will remain in the frame after clipping.maxPos(Tuple[int, int, int]): The maximum voxel coordinates that will remain in the frame after clipping.
Scale (resample) a frame to given dimensions:
resampled = frame.resampled(width, height, depth, alphaCutoff) # splv.Frame
width,height,depth(int): New dimensions.alphaCutoff(float): Alpha threshold for resampling (default:0.25). Note that lower values (near0) work well for downscaling, whereas higher values work better for upscaling.
Downscale a frame by an integer factor:
coarsened = frame.coarsened(scale, alphaCutoff) # splv.Frame
scale(int): The factor by which to downscale. The frame returned will have dimensions of the source frame multiplied by1/scale(default:2).alphaCutoff(float): Alpha threshold for coarsening (default:0.0).
Extract a subregion of a frame:
subregion = frame.subregion(minPos, maxPos) # splv.Frame
minPos(Tuple[int, int, int]): The minimum voxel coordinates to be contained in the subregion.maxPos(Tuple[int, int, int]): The maximum voxel coordinates to be contained in the subregion.
Create a clone of a frame without voxels that are completely hidden by other voxels:
newFrame = frame.without_occluded() # splv.Frame
Create a clone of a frame without isolated voxels with no neighboring voxels:
newFrame = frame.without_orphaned() # splv.Frame
Write debug text into a frame:
frame.write_string(text, startPos, voxel, outlineVoxel, axis, flip, scale, maxWidth)
text(str): The text to write. Currently the only characters supported are A-Z, 0-9, +-*=/, and !?.:startPos(Tuple[int, int, int]): The position at which to start writing the text.voxel(Optional[Tuple[int, int, int]]): The voxel to write the text with (default:(0, 0, 0)).outlineVoxel(Optional[Tuple[int, int, int]]): The voxel to outline the text with (default:(255, 255, 255)).axis(str): The axis along which to advance the cursor after each character. Must be either"z"or"x"(default:"z").flip(bool): Whether to increase or decrease the cursor position alongaxisafter each character.Truemeans decrease,Falseis increase (default:False).scale(int): The size of the text (default:1).maxWidth(Optional[int]): The maximum number of voxels the text can span before line wrapping. IfNone, this is just the frame's dimension (default:None).
Render a frame to an image:
img, depthImg = frame.render(width, height, fov, camPos, camTarget, stepScale) # Tuple[buffer, buffer]
img, depthImg = frame.render(width, height, intrinsics, extrinsics, stepScale) # Tuple[buffer, buffer]
width,height(int): The output image dimensions, output image will be am RGBAuint8array of shape(height, width, 4), and the output depth image will be afloat32array of shape(height, width).fov(float): The cameras vertical field-of-view in degrees (default:60).camPos(Tuple[float, float, float]): The camera position to render from. Note that the frame will always be centered at(0, 0, 0), with its maximum extent spanning[-1, 1], and all other extents sized proportionally. (default:(1, 1, 1)).camTarget(Tuple[float, float, float]): The position for the camera to look at when rendering (default:(0, 0, 0)).intrinsics(buffer): The camera intrinsics matrix. Must be a 3x3 matrix.extrinsics(buffer): The camera extrinsics matrix, must be a 3x4 matrix (affine transform).stepScale(float): The simulated size of each ray step, controls how transparent the voxels appear overall. If holes appear in the render, you should increase this. If the render is not smooth enough, you should decrease this. (default:3.0).
Iterator
Iterate over all nonempty voxels in a frame:
for pos, color in frame:
x, y, z = pos
r, g, b = color
print(f"voxel at ({x}, {y}, {z}) has color ({r}, {g}, {b})")
Encoder
Compresses and encodes frames into splv files. Performs all spatial encoding-related tasks.
Constructors
Create an encoder:
encoder = splv.Encoder(
width, height, depth,
framerate,
audioParams,
gopSize,
motionVectors,
vqRangeCutoff,
outputPath
)
width,height,depth(int): Spatial dimensions.framerate(float): Target framerate.audioParams(tuple, optional): Audio parameters as (channels,sampleRate,bit_depth), orNonefor no audio (default:None).gopSize(int): Group of Pictures size (default:30).motionVectors(str): Motion vector algorithm to use. Must be one of"off","fast", or"full"(default:"fast").vqRangeCutoff(float): Vector quantization range cutoff (default:0.025). Must be in the range[0.0, 1.0].outputPath(str): Output file path.
Methods
Encodes a frame:
encoder.encode(frame)
frame(splv.Frame): The frame to encode.
Encode audio data:
encoder.encode_audio(buf)
buf(buffer): The raw PCM samples to encode.
Finalize encoding, flush to file:
encoder.finish()
- Note that this function MUST be called before the
splvfile is valid.
Decoder
Decompresses and decodes splv files into their constituent framess. Performs all spatial decoding-related tasks.
Constructors
Create a decoder from an splv file:
decoder = splv.Decoder(path)
path(str): The path to thesplvto decode from.
Methods
Get the dimensions of a decoder's splv:
width, height, depth = decoder.get_dims() # Tuple[int, int, int]
Get the framerate of the decoder's splv:
framerate = decoder.get_framerate() # float
Get the number of frames in the decoder's splv:
frameCount = decoder.get_frame_count() # int
Get the number of audio channels in the decoder's splv:
audioChannelCount = decoder.get_audio_channel_count() # int
Get the sample rate of any audio in the decoder's splv:
audioChannelCount = decoder.get_audio_sample_rate() # int
Get the total number of audio frames in the decoder's splv:
audioFrameCount = decoder.get_audio_frame_count() # int
Decode a frame:
frame = decoder.decode(idx) # splv.Frame
idx(int): The index of the frame to decode, 0 representing the first frame.
Decode audio frames:
audioFames = decoder.decode_audio(startFrame, numFrames) # buffer
startFrame(int): The first audio frame to decode.numFrames(int): The number of audio frames to decode.
The returned buffer will be of type float32 and have shape (decoder.get_audio_channel_count(), numFrames).
Iterator
Iterate over all frames in the decoder's splv:
for frame in decoder:
print(frame.get_num_voxels())
Utility Functions
Concatenate multiple splv files:
splv.concat(paths, outPath)
paths(array): Paths tosplvs to concatenate.outPath(str): Path to write the concatenatedsplv.
Split an splv file into chunks of a specified duration:
splv.split(path, splitLength, outDir)
path(str): Path to inputsplvfile.splitLength(float): Duration of each chunk in secondsoutDir(str): Output directory for split files
Re-encode an splv file with new compression parameters:
splv.transcode(path, gopSize, motionVectors, vqRangeCutoff, outPath)
path(str): Path to inputsplvfilegopSize(int): Group of Pictures size (default:30)motionVectors(str): Motion vector algorithm (default:"fast")vqRangeCutoff(float): Vector quantization range cutoff (default:0.025)outPath(str): Path for transcoded output file.
Scale (resample) an splv file to new dimensions:
splv.resample(path, width, height, depth, alphaCutoff, outPath)
path(str): Path to inputsplvfile.width,height,depth(int): New dimensions in voxels.alphaCutoff(float): Alpha threshold for resampling (default:0.25).outPath(str): Path for resampled output file.
Downscale an splv file by an integer factor:
splv.coarsen(path, scale, alphaCutoff, outPath)
path(str): Path to inputsplvfile.scale(int): The factor by which to downscale. The newsplvwill have dimensions of the sourcesplvmultiplied by1/scale(default:2).alphaCutoff(float): Alpha threshold for coarsening (default:0.0).outPath(str): Path for coarsened output file.
Add audio to an splv file post-export:
splv.add_audio(path, audioParams, buf)
path(str): Path tosplvfile.audioParams(tuple): Audio parameters as (channels,sampleRate,bit_depth).buf(buffer): Buffer containing the raw audio PCM samples to insert.
Get the metadata of an splv file:
metadata = splv.get_metadata(path) # dict
path(str): Path tosplvfile.
Dump each frame in an splv file to disk using splv.Frame.save:
splv.dump(path, outDir)
path(str): The path to thesplvfile to dump.outDir(str): The directory where each.vvwill be saved.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file spatialstudio-1.1.1.35-cp313-cp313-win_amd64.whl.
File metadata
- Download URL: spatialstudio-1.1.1.35-cp313-cp313-win_amd64.whl
- Upload date:
- Size: 492.9 kB
- Tags: CPython 3.13, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0597ff4dc02824484f5cfb24bbc6c5c92cc7e3535b274721e20659484c1ee9f9
|
|
| MD5 |
7214e81ccce2e948b3cf071a5f7d2fff
|
|
| BLAKE2b-256 |
a7de3285cab6b71bbd49a5915bdcab77a4179ed37e4cebb26b9cf5fe02ef23d4
|
File details
Details for the file spatialstudio-1.1.1.35-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: spatialstudio-1.1.1.35-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 805.8 kB
- Tags: CPython 3.13, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ef7f3d53808a8f5107333c90e2182f6a65b5a5d4ae984e9ea1ee03954e0322e6
|
|
| MD5 |
f785d4734734ddd124b1fbf2b0cd01d7
|
|
| BLAKE2b-256 |
c669c2e91abb5563c46406472b537ed8b235049b1da1d6243caea910af3f9694
|
File details
Details for the file spatialstudio-1.1.1.35-cp313-cp313-macosx_11_0_arm64.whl.
File metadata
- Download URL: spatialstudio-1.1.1.35-cp313-cp313-macosx_11_0_arm64.whl
- Upload date:
- Size: 520.3 kB
- Tags: CPython 3.13, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
76287175f5a366129a4d9415b85448a047efb09e3c29908a752a6a3d0998639c
|
|
| MD5 |
333701f9fe4da90a2e0f8f837b316b36
|
|
| BLAKE2b-256 |
f3ee9d68ae40fb3224eb913193433e0a7e2c6915b9cc7b5e2aa07fa2a7f33b33
|
File details
Details for the file spatialstudio-1.1.1.35-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: spatialstudio-1.1.1.35-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 492.9 kB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bb596820215ae107bfa968a0e29cd5de0a9640bdaac07f548c8aa505d56c2488
|
|
| MD5 |
bc4a69abd37efc825a63c5a1220cc7f7
|
|
| BLAKE2b-256 |
c76ecc8a95f3005742921fa18eeed8ed4fb9c98fec2771b2c1f2d7b2dc0394af
|
File details
Details for the file spatialstudio-1.1.1.35-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: spatialstudio-1.1.1.35-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 805.8 kB
- Tags: CPython 3.12, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
79e2140b218ff3334da4743d7ee75b63acfc83f2f3f144513e1d2cd497f958d2
|
|
| MD5 |
642fcd77e01ba9c7a648f4a9ea09be37
|
|
| BLAKE2b-256 |
e5354f4ebb2ba502957ab781bc5ea913b1283c1c4cde7eeed84ad6152136651c
|
File details
Details for the file spatialstudio-1.1.1.35-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: spatialstudio-1.1.1.35-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 520.1 kB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
48f2d3d12075012877e947210f77835b4fa08a4ef9744c067339f53d95872875
|
|
| MD5 |
d8e2c3eac3bc9629fa6c3f6638c02eb5
|
|
| BLAKE2b-256 |
379683abfcecf97d62acecec710a6e182d7810f43363d959759ad649d60638e1
|
File details
Details for the file spatialstudio-1.1.1.35-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: spatialstudio-1.1.1.35-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 491.6 kB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
607a45c2d90457b165ca216e1ee25b9a4191f9b46835afaa40622823e13158df
|
|
| MD5 |
677cc822898b94b32d439faa63a47aa3
|
|
| BLAKE2b-256 |
71476f5fcd30539c819328f18a567afc3856e777aabb500be4629ea708baad61
|
File details
Details for the file spatialstudio-1.1.1.35-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: spatialstudio-1.1.1.35-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 804.9 kB
- Tags: CPython 3.11, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a6bae2413bf6b07ab67e1f201b6d261c58c0f422613dffef33f1a6d957640696
|
|
| MD5 |
69c0f13662c5b8ddde0ae4ede2ef8e61
|
|
| BLAKE2b-256 |
a20422bc0980c244660cf50c1cfbb2de6cdfa6931da547a88c7f62623f6ab1fd
|
File details
Details for the file spatialstudio-1.1.1.35-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: spatialstudio-1.1.1.35-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 520.7 kB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d8131682823c83af09321ab4e78c4713dc0538a81ca3f6e88a0207b21176d687
|
|
| MD5 |
1356c3bf40bdfd5986c0ac67628c955e
|
|
| BLAKE2b-256 |
bf846d2f19a561f000a77368c400ee4dfee0114ec56d7df339fbdb3275656b21
|
File details
Details for the file spatialstudio-1.1.1.35-cp310-cp310-win_amd64.whl.
File metadata
- Download URL: spatialstudio-1.1.1.35-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 490.8 kB
- Tags: CPython 3.10, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
99b034c4a4f2586bcc1b232b2ae15beccae95fab809ab6c64c3c15cb59f98ab8
|
|
| MD5 |
b3520dca8d39a9e6e80afe699d2329a1
|
|
| BLAKE2b-256 |
c4b473347f9adc522ff9537fb7cbe0546d4e62a8264245613b18aae18e2dbbe9
|
File details
Details for the file spatialstudio-1.1.1.35-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: spatialstudio-1.1.1.35-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 804.1 kB
- Tags: CPython 3.10, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
76e53616da711982ef29f7d401a3b9ee67d0d6e3bd3b90991f94b13883daaf79
|
|
| MD5 |
e7fa47c9dcb6631424084273fb0a81e7
|
|
| BLAKE2b-256 |
4064a65e13005150d2fb65ad0ae557b05d30e3c168bf54725b628284295574c0
|
File details
Details for the file spatialstudio-1.1.1.35-cp310-cp310-macosx_11_0_arm64.whl.
File metadata
- Download URL: spatialstudio-1.1.1.35-cp310-cp310-macosx_11_0_arm64.whl
- Upload date:
- Size: 519.4 kB
- Tags: CPython 3.10, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d66145f77ad15034a0d4df6e2304be9ebe1b37b3e1912f81b46d8ca8b9220e6f
|
|
| MD5 |
f1f2ffa0c99b82a055e336ff1ad02f8b
|
|
| BLAKE2b-256 |
f95be2de5903d11f93e0e115d2d90be5ae87d669463ea5151a2373146c4fc4ae
|
File details
Details for the file spatialstudio-1.1.1.35-cp39-cp39-win_amd64.whl.
File metadata
- Download URL: spatialstudio-1.1.1.35-cp39-cp39-win_amd64.whl
- Upload date:
- Size: 498.0 kB
- Tags: CPython 3.9, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7802e618cb985ce6274845c37478c1baf4a3a5e7d6b730f90aaf68532dbbe844
|
|
| MD5 |
94a00f78fb2301f417cf3137a9d0eaa9
|
|
| BLAKE2b-256 |
45bc8387ff46ef2392e97b121ddd60db990a74f843e7cb457c10367c22f18e38
|
File details
Details for the file spatialstudio-1.1.1.35-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: spatialstudio-1.1.1.35-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 804.4 kB
- Tags: CPython 3.9, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7ccdb4b58615f2393e895a1c681addc8d73406d5cf3d9d2f9f058393510a2468
|
|
| MD5 |
52e8246594dfba5cc60a9d2e908c13ae
|
|
| BLAKE2b-256 |
cdf79208b2c879faa1139e739c1e58e2d0da1383842a2865e093abcec99236aa
|
File details
Details for the file spatialstudio-1.1.1.35-cp39-cp39-macosx_11_0_arm64.whl.
File metadata
- Download URL: spatialstudio-1.1.1.35-cp39-cp39-macosx_11_0_arm64.whl
- Upload date:
- Size: 519.5 kB
- Tags: CPython 3.9, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d4d9c3cde4fa6f27dde39930b60fffe48549f44a40d578e6fa24b81b3b0930aa
|
|
| MD5 |
c9683a53cd8c82be4952a199c318057d
|
|
| BLAKE2b-256 |
75f5ccdaf49add06d177984c7efb41ae6c40de33da56319eb76ef94c34494aed
|